網(wǎng)上有很多關(guān)于pos機(jī)物聯(lián)網(wǎng)卡的需求有多大,零基礎(chǔ)物聯(lián)網(wǎng)開發(fā)的知識,也有很多人為大家解答關(guān)于pos機(jī)物聯(lián)網(wǎng)卡的需求有多大的問題,今天pos機(jī)之家(m.afbey.com)為大家整理了關(guān)于這方面的知識,讓我們一起來看下吧!
本文目錄一覽:
1、pos機(jī)物聯(lián)網(wǎng)卡的需求有多大
pos機(jī)物聯(lián)網(wǎng)卡的需求有多大
作者 | Haor.L
責(zé)編 | 王曉曼
出品 | CSDN博客
筆者最近參加了校內(nèi)的一場物聯(lián)網(wǎng)開發(fā)競賽,從零開始,踩坑無數(shù),感覺很多時(shí)候事情都不像預(yù)料的一樣發(fā)展,離開了美好的IDE,太多事情要在板子上一步步摸索。運(yùn)行失敗還好,運(yùn)行成功但BUG了,簡直不知道從何查起。
但認(rèn)識了M5Stack簡單的線上系統(tǒng),學(xué)習(xí)了MQTT,HTTP等數(shù)據(jù)傳輸方式,入門Arduino和MIrcopython等開發(fā)語言,接觸ESP32的板子,感受最深的一點(diǎn)就是,物聯(lián)網(wǎng)的準(zhǔn)入門檻并沒有那么高,成本也沒有那么高,但這還是一片混沌未開的區(qū)域,進(jìn)場者真的可以大有所為,起碼方便自己的日常生活是綽綽有余的。
總的來說,這次物聯(lián)網(wǎng)入坑,值得!
閱讀本文后你將收獲:
了解M5STACK這款新興的片上系統(tǒng)了解這款板子的開發(fā)環(huán)境如何配置
掌握ONENET數(shù)據(jù)傳輸
掌握HTTP的GET方法
會(huì)搭建筆者前幾天做的項(xiàng)目雛形:健康碼追蹤系統(tǒng)開發(fā)準(zhǔn)備
本博客作為學(xué)習(xí)物聯(lián)網(wǎng)開發(fā)的筆記,也簡單的將自己的片上系統(tǒng)作為例程寫出來。
ESP-IDF工具鏈配置:樂鑫文檔UIflow在線IDEM5STACK的官方開發(fā)文檔(很全,如果你也打算使用M5STACK系列的開發(fā)板,強(qiáng)烈建議從此入門)本博客項(xiàng)目的代碼倉庫(歡迎賞星):https://github.com/haoruilee/M5Stack_Healthy_code_tracerM5STACK簡介
M5STACK是一款對初學(xué)者非常友好的ESP32開發(fā)板,可以用Micropython和C編程,也可以用很簡單的拖拽式編程,擁有龐大的官方文檔,只是國內(nèi)只在最近開始流行,油管和B站上都有官方的教學(xué)視頻,也在常常更新,很有創(chuàng)造力的一個(gè)產(chǎn)品。
結(jié)構(gòu)上主要分為Core和Unit,Core作為核心控件,Unit作為傳感器采集數(shù)據(jù)。
下圖圖就是筆者自己做的產(chǎn)品雛形,中間的小屏幕是Core,作為主控,周圍有GPS和RFID,攝像頭等單元用來采集數(shù)據(jù)。
設(shè)計(jì)雛形:
由于所有的M5產(chǎn)品都預(yù)設(shè)了樂高塊,所有你可以把他們拼在樂高模組上,油管上還有不少人用它做樂高機(jī)器人,確實(shí)是很有創(chuàng)意的一款產(chǎn)品,顏值也不錯(cuò),所以筆者選擇它用來開發(fā)。
環(huán)境配置
UIFlow環(huán)境
在線編程地址:UIFlow
前幾天GIthub發(fā)布了遠(yuǎn)程編譯器Codespace,可以看出遠(yuǎn)程編譯確實(shí)是大勢所趨。
這里不得不說UIFlow把物聯(lián)網(wǎng)的門檻大大降低了,筆者配置ESP-IDF用了將近一天,而使用UIFlow可以免去一切環(huán)境配置的痛苦。
支持拖拽編程,可視化UI設(shè)計(jì),自帶例程,確實(shí)是良心產(chǎn)品。
ESP-IDF環(huán)境
方法一
筆者配置ESP-IDF工具鏈時(shí),一開始是使用Windows系統(tǒng)的工具安裝器。
ESP-IDF 工具安裝器可在“開始”菜單中,創(chuàng)建一個(gè)打開ESP-IDF 命令提示符窗口的快捷方式。本快捷方式可以打開 Windows 命令提示符(即 cmd.exe),并運(yùn)行 export.bat 腳本以設(shè)置各環(huán)境變量(比如 PATH,IDF_PATH 等)。
(不得不說,這個(gè)安裝器的健壯性非常差!?。?/p>
安裝心得:上網(wǎng)技巧+把系統(tǒng)的PATH重新檢查一遍,有些卸載殘余的PATH會(huì)導(dǎo)致玄學(xué)問題!
方法二(更推薦)
宇宙第一VS code中有插件 ESPRESSIF
可以更清楚每時(shí)每刻在干什么,也更清楚出了BUG去哪里修補(bǔ)。
感知模塊
M5開發(fā)了很多環(huán)境傳感器,包括溫濕度,人體感應(yīng),RFID,攝像頭等等,在官方開發(fā)文檔上也都給出了相關(guān)例程和GIthub的源碼鏈接。
筆者自己的項(xiàng)目使用的是RFID、GPS和Camera模塊,其中除了Camera只能用ESP-IDF編程,其他單元都支持在UIFlow上在線編程,再加上,Micropython確實(shí)比C++舒服太多。
網(wǎng)絡(luò)連接
Wi-Fi鏈接
M5Stack已經(jīng)自己預(yù)置了Wi-Fi鏈接,開機(jī)就是,不過在Mircopython里寫起來也很簡單,下面是一個(gè)范例:
import networkSSID="YOUR-WIFI-NAME"PASSWORD="YOUR-WIFI-PASSWORD"wlan=Nones=Nonedef connectWifi(ssid,passwd):\'\'\'連接指定wifi\'\'\'global wlanwlan=network.WLAN(network.STA_IF)wlan.active(True)wlan.disconnectwlan.connect(ssid,passwd)while(wlan.ifconfig[0]==\'0.0.0.0\'):time.sleep(1)return True
使用Mircoython的Wi-Fi模塊,connect(ssid,password),就可以進(jìn)入可愛的Wi-Fi連接界面了,M5GO的封裝還是不錯(cuò)的。
NB-IOT
IOT模組需要額外配一張NB卡,某寶20就可以拿下一年500M流量,不過筆者沒有繼續(xù)嘗試,已經(jīng)有可愛的M5GO和穩(wěn)定的Wi-Fi,就沒探索用3G進(jìn)行通訊。
HTTP通訊
接下來介紹物聯(lián)網(wǎng)的精髓,“聯(lián)網(wǎng)”,采集到了數(shù)據(jù),那數(shù)據(jù)上報(bào)和傳輸是重中之重。
筆者覺得HTTP是最好理解,好入門的通訊協(xié)議,這里也先介紹這種方法。
建議參考視頻:B站:接入中國移動(dòng)ONENET平臺(tái)
筆者嘗試過諸如阿里云和一些外國的平臺(tái),最后發(fā)現(xiàn)都不如中國移動(dòng)專門為物聯(lián)網(wǎng)開發(fā)的ONENET,一來穩(wěn)定,不用擔(dān)心服務(wù)商跑路,而來阿里云顯得太過臃腫,對入門者很不友好,最終選擇了ONENET,他的HTTP封裝好了很好看的數(shù)據(jù)流模板,如:
位置信息可視化:
自動(dòng)折線圖
POST上傳數(shù)據(jù)創(chuàng)建流模板
首先需要?jiǎng)?chuàng)建一個(gè)數(shù)據(jù)流模板,用于接收傳過來的數(shù)據(jù):
發(fā)送請求
請求方式:POST
URL:http://api.heclouds.com/devices/device_id/datapoints
其中,device_id:需要替換為設(shè)備ID
注意:ONENET默認(rèn)post的數(shù)據(jù)叫Datastreams,參數(shù)配置見表:
請求實(shí)例:
{"datastreams": [{"id": "temperature","datapoints": [{"at": "2013-04-22T00:35:43","value": "bacd"},{"at": "2013-04-22T00:55:43","value": 84}]},{"id": "key","datapoints": [{"at": "2013-04-22T00:35:43","value": {"x": 123,"y": 123.994}},{"at": "2013-04-22T00:35:43","value": 23.001}]}]}
使用ONENET的模擬API調(diào)用可以快速熟悉數(shù)據(jù)的模式:
其中,URL的device_id,和下面的API_key換成自己設(shè)備的,可以在設(shè)備列表找到,就可以往自己設(shè)備的數(shù)據(jù)流模板傳一個(gè)值為3的value。
Micropython用HTTPUIFlow里自帶了HTTP模塊,但是很玄學(xué),很難用!
這里筆者用Micropython自己寫了一份HTTP的傳輸:
def http_put_data(data):#post data into oneneturl=\'http://api.heclouds.com/devices/\'+DEVICE_ID+\'/datapoints\'values={\'datastreams\':[{"id":"temperature","datapoints":[{"value":data}]}]}jdata = json.dumps(values)r=urequests.post(url,data=jdata,headers={"api-key":API_KEY})return r
親測還是很好用的,可能是UIFlow自己的json封裝比較奇怪?
使用模組交互的數(shù)據(jù)傳輸
既然M5STACK可以同時(shí)使用多個(gè)模組,那么自然也就可以使用模組來控制數(shù)據(jù)傳輸:
如:使用RFID卡,控制POST:
rfid0 = unit.get(unit.RFID, unit.PORTA)while(True):if rfid0.isCardOn:rsp = http_put_data(12)emoji0.show_map([[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,1,1,1,1,1,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0]], 0xff0000)else:#wlan.disconnect#wlan.active(False)emoji0.show_map([[0,0,0,1,0,0,0],[0,0,0,1,0,0,0],[0,0,0,1,0,0,0],[0,0,0,1,0,0,0],[0,0,0,1,0,0,0],[0,0,0,1,0,0,0],[0,0,0,1,0,0,0]], 0xff0000)wait(1)
第一行的rfid0 = unit.get(unit.RFID, unit.PORTA)是指定從PORTA讀取RFID的射頻信息
使用HTTP的GET獲取b站信息
有POST就要有GET,這里介紹一個(gè)B站大佬“正負(fù)加減”的例程,獲取自己的粉絲數(shù),里面講解也很細(xì)致,大佬也是老Geek了,關(guān)注不虧!UIFlow的GET結(jié)構(gòu):核心思想是知道哪個(gè)key是follow,可以在F5審查源代碼找到:
此處的URL是
http://api.bilibili.com/x/relation/stat?vmid=99566555
UP和DOWN是控制RGB等的函數(shù)。
我的片上系統(tǒng)設(shè)計(jì)全過程
設(shè)計(jì)初衷在疫情管控最嚴(yán)格的的時(shí)候,經(jīng)常能看到觸目驚心的“尋找x月x日乘坐xxxx的乘客”,如果能追尋乘坐公共交通者的足跡,會(huì)給疫情管控帶來很大便利。設(shè)計(jì)方法
筆者希望結(jié)合GPS,RFID和攝像頭功能,做個(gè)車載的識別信息-上報(bào)信息的小系統(tǒng)。
具體涉及到二維碼識別,RFID識別,GPS獲取和HTTP上報(bào)。
然而,這個(gè)設(shè)計(jì)一開始就遇到了難題。網(wǎng)上購買的測溫槍,他的藍(lán)牙數(shù)據(jù)我無法解包,好像是和騰訊連連有自己的相關(guān)配置。
騰訊連連界面:
既然騰訊連連已經(jīng)寫到那么好了,那就不搶他的飯碗了。
既然沒辦法解析內(nèi)容,那下面筆者將用ENV單元采集的環(huán)境溫度代替乘客溫度進(jìn)行收發(fā)。
分模塊實(shí)現(xiàn)RFID控制塊首先聲明RFID模塊的串口:
rfid0 = unit.get(unit.RFID, unit.PORTA)
該段指從A口串入RFID模組
【注:M5STACK使用顏色標(biāo)明了A,B,C三個(gè)Grove口,見下圖】
上圖中RFID的串口是紅色,就對應(yīng)到M5GO左側(cè)的紅色接口:
GRIVE HUB由于筆者同時(shí)還需要使用紅色串口的ENV單元,因此額外購買了GROVE HUB:
這樣就有兩個(gè)A口了。
訪問設(shè)置時(shí)不需要加以區(qū)分,都從PORTA引入:
rfid0 = unit.get(unit.RFID, unit.PORTA)env0 = unit.get(unit.ENV, unit.PORTA)
使用Emoji模塊做可視化:
筆者使用循環(huán)判斷是否有卡片接近,無則顯示待機(jī)Emoji,有則顯示?
#循環(huán)判斷是否有卡片接近while(True):#熄滅RGB燈rgb.setBrightness(0)#清空Emoji顯示emoji0.show_map([[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0]], 0x000000)#判斷是否有卡片接近if rfid0.isCardOn:#有卡片接近顯示對號emoji0.show_map([[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,1],[0,0,0,0,0,1,1],[1,0,0,0,1,1,0],[0,1,1,1,1,0,0],[0,0,1,1,0,0,0]], 0x33ff33)#發(fā)送RFID讀取到的卡片IDrsp_RFID = http_put_RFID((str(rfid0.readUid)))#完成后指示燈變綠rgb.setColorAll(0x33ff33)rgb.setBrightness(10)else:#可選是否斷開wifi#wlan.disconnect#wlan.active(False)#等待卡片接近時(shí),Emoji展示"。。。"emoji0.show_map([[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,1,0,1,0,1,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0]], 0x000000)wait(1)
這里的Emoji模塊是先在UIFlow里敲好,再進(jìn)Micropython里查看的。
HTTP傳輸塊
HTTP傳輸在上文已經(jīng)講了不少,這里優(yōu)先介紹GPS的傳輸:
GPS的命令也是要加“value:”的,形如value:{“l(fā)on”:lon,“l(fā)at”:lat},這個(gè)地方一開始把筆者坑的不輕!
def http_put_location(lon,lat):\'\'\'傳輸?shù)乩砦恢脭?shù)據(jù)點(diǎn)至ONENET平臺(tái)的location數(shù)據(jù)流lon:longitude,經(jīng)度lat: latitude,緯度url:http的post地址values:請參考https://open.iot.10086.cn/doc/multiprotocol/ 文檔中的"HTTP協(xié)議上傳數(shù)據(jù)點(diǎn)模塊,配置json格式信息"API_KEY:設(shè)備發(fā)送HTTP請求的證書,請參考https://open.iot.10086.cn/doc/multiprotocol/book/develop/http/api/api-usage.html 文檔中的"鑒權(quán)說明"\'\'\'url=\'http://api.heclouds.com/devices/YOUR-DEVICE-ID/datapoints\'values={\'datastreams\':[{"id":"location","datapoints":[{"value":{"lon":lon,"lat":lat}}]}]}jdata = json.dumps(values)r=urequests.post(url,data=jdata,headers={"api-key":API_KEY})return r
這里請把YOUR-DEVICE-ID替換為自己的數(shù)據(jù)流中設(shè)備編號,參考ONENET手冊。Wi-Fi連接塊
UIflow里封裝了很好的Wi-Fi-connect:
wifiCfg.doConnect(SSID, PASSWORD)
如果你的Micropython里沒有一鍵Wi-Fi連接,筆者自己也實(shí)現(xiàn)了一個(gè):
def connectWifi(ssid,passwd):\'\'\'如果您的Micropython不攜帶WifiCfg.doconnect,請參考本函數(shù)函數(shù)作用:連接至名稱為SSID,密碼為passwd的wifi\'\'\'global wlanwlan=network.WLAN(network.STA_IF)wlan.active(True)wlan.disconnectwlan.connect(ssid,passwd)while(wlan.ifconfig[0]==\'0.0.0.0\'):time.sleep(1)return True
二維碼識別塊
本部分使用ESP-IDF編程使用的攝像頭是M5CAMERA
屬性是OV2640參考官方例程:
//拍攝camera_fb_t* esp_camera_fb_get{if (s_state == ) {return ;}if(!I2S0.conf.rx_start) {if(s_state->config.fb_count > 1) {ESP_LOGD(TAG, "i2s_run");}if (i2s_run != 0) {return ;}}if(s_state->config.fb_count == 1) {xSemaphoreTake(s_state->frame_ready, portMAX_DELAY);}if(s_state->config.fb_count == 1) {return (camera_fb_t*)s_state->fb;}camera_fb_int_t * fb = ;if(s_state->fb_out) {xQueueReceive(s_state->fb_out, &fb, portMAX_DELAY);}return (camera_fb_t*)fb;}//二維碼識別void qr_recoginze(void *pdata) {camera_fb_t *camera_config = pdata;if(pdata==){ESP_LOGI(TAG,"Camera Size err");return;}struct quirc *q;struct quirc_data qd;uint8_t *image;q = quirc_new;if (!q) {printf("can\'t create quirc object\\");vTaskDelete ;}//printf("begin to quirc_resize\\");if (quirc_resize(q, camera_config->width="360px",height="auto" />
{printf("quirc_resize err\\");quirc_destroy(q);vTaskDelete ;}image = quirc_begin(q, , );memcpy(image, camera_config->buf, camera_config->len);quirc_end(q);int id_count = quirc_count(q);if (id_count == 0) {quirc_destroy(q);return;}struct quirc_code code;quirc_extract(q, 0, &code);quirc_decode(&code, &qd);dump_info(q);quirc_destroy(q);}這里依賴了太多官方庫…建議去代碼倉庫翻一翻。
K210的二維碼識別上文是ESP32類型的開發(fā)板識別代碼,可以看到非常繁瑣,改起來簡直要了老命…使用Micropython的話,代碼就變的可愛多了~
【此部分使用Maxipy編程】
import sensorimport imageimport lcdimport timeclock = time.clocklcd.initsensor.resetsensor.set_pixformat(sensor.RGB565)sensor.set_framesize(sensor.QVGA)sensor.set_vflip(1)sensor.run(1)sensor.skip_frames(30)while True:clock.tickimg = sensor.snapshotres = img.find_qrcodesfps =clock.fpsif len(res) > 0:img.draw_string(2,2, res[0].payload, color=(0,128,0), scale=2)print(res[0].payload)lcd.display(img)
這里Maxipy的官方文檔還給出了修正圖像的方法:如果使用了鏡頭,畫面會(huì)有扭曲,需要矯正畫面使用 lens_corr 函數(shù)來矯正,比如 2.8mm, img.lens_corr(1.8)
(沒事翻一翻這個(gè)Maxipy的文檔還是很有啟發(fā)的,大概兩小時(shí)就能通讀一遍)
GPS傳輸塊
室內(nèi)經(jīng)常沒有信號(實(shí)測室外也很少有…)因此在傳遞GPS的時(shí)候筆者額外設(shè)計(jì)了防止無信號的代碼。
GPS的http傳輸函數(shù)已經(jīng)在上文講了,此處和RFID卡片控制進(jìn)行結(jié)合:
if rfid0.isCardOn:#有卡片接近顯示對號emoji0.show_map([[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,1],[0,0,0,0,0,1,1],[1,0,0,0,1,1,0],[0,1,1,1,1,0,0],[0,0,1,1,0,0,0]], 0x33ff33)#發(fā)送RFID讀取到的卡片IDrsp_RFID = http_put_RFID((str(rfid0.readUid)))#防止測試時(shí)無信號if str(gps0.pos_quality) != "1" and str(gps0.pos_quality) != "6":lon=116.39137751349433lat=39.8969585128568else:#默認(rèn)北京lon=gps0.longitudelat=gps0.latitudetry:rsp_LOCATION=http_put_location(float(lon),float(lat))except:emoji0.show_map([[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,1],[0,0,0,0,0,1,1],[1,0,0,0,1,1,0],[0,1,1,1,1,0,0],[0,0,1,1,0,0,0]], 0xff0000)#傳輸溫度rsp = http_put_data(env0.temperature)#完成后指示燈變綠rgb.setColorAll(0x33ff33)rgb.setBrightness(10)else:#可選是否斷開wifi#wlan.disconnect#wlan.active(False)#等待卡片接近時(shí),Emoji展示"。。。"emoji0.show_map([[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,1,0,1,0,1,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,0,0]], 0x000000)wait(1)
后記
參賽時(shí)間倉促,沒能完全搞明白每個(gè)引腳的用途,沒有好好觸摸一遍C和開發(fā)板,沒有用NB-IOT通訊。沒有做藍(lán)牙通訊解包…還是有很多遺憾的,還好設(shè)備還在,可以繼續(xù)探索物聯(lián)網(wǎng)的神奇。
成果效果:
版權(quán)聲明:本文為CSDN博主「Haor.L」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_46233323/article/details/106054434」
?程序員在家辦公沒顯示屏,我被領(lǐng)導(dǎo)鄙視了
?Get!讀懂?dāng)?shù)據(jù)科學(xué)和機(jī)器學(xué)習(xí),看這文就夠了
?深度剖析數(shù)據(jù)庫國產(chǎn)化遷移之路
?Go遠(yuǎn)超Python,機(jī)器學(xué)習(xí)人才極度稀缺,全球16,655位程序員告訴你這些真相
?我佛了!用KNN實(shí)現(xiàn)驗(yàn)證碼識別,又 Get 到一招
?超級賬本Hyperledger Fabric中的Protobuf到底是什么?
以上就是關(guān)于pos機(jī)物聯(lián)網(wǎng)卡的需求有多大,零基礎(chǔ)物聯(lián)網(wǎng)開發(fā)的知識,后面我們會(huì)繼續(xù)為大家整理關(guān)于pos機(jī)物聯(lián)網(wǎng)卡的需求有多大的知識,希望能夠幫助到大家!
![](/style/images/zhouzong.jpg)