今天把OneNET相關(guān)內(nèi)容的分享做一個收尾,這一個系列的分享,正好也是對應(yīng)之前的一個網(wǎng)友問答:STM32→ESP8266→OneNET ,對應(yīng)整個技術(shù)路線涉及知識點的概括,希望我的分享,可以帶給你些許幫助。
實現(xiàn)目標
要想實現(xiàn)最終目標,我們需要解決如下幾個問題:
- 一個支持MQTT協(xié)議的工程STM32與ESP8266之間一般選擇串口通信,所以要實現(xiàn)ESP8266串口數(shù)據(jù)的收發(fā)傳感器數(shù)據(jù)的上傳,串口數(shù)據(jù)的方向為 STM32-->ESP8266 ,對應(yīng)ESP8266串口數(shù)據(jù)的接收手機或其他終端對設(shè)備屬性的設(shè)置,串口數(shù)據(jù)的方向為 ESP8266-->STM32 ,對應(yīng)ESP8266串口數(shù)據(jù)的發(fā)送示例工程中,ESP8266的UART0還會輸出一些調(diào)試信息,為了解析消息方便,將打印輸出的調(diào)試信息重定向至UART1ESP8266對接收到的數(shù)據(jù),上報至服務(wù)器ESP8266接收到的云端數(shù)據(jù),解析后,通過串口發(fā)送出去
準備工作
ESP8266 NONOS SDK 代碼中,在example
文件夾下有很多的Demo, 因為我們之前使用 MQTT.fx 軟件,成功連接上了OneNET平臺,使用的就是MQTT協(xié)議,所以我們選擇一個基于MQTT協(xié)議的例程為基礎(chǔ),即選用esp_mqtt_proj
例程進行移植,在其基礎(chǔ)上對代碼進行修改。
我們只需要測試MQTT相關(guān)的例程,所以將esp_mqtt_proj
例程從 examples
文件夾下拷貝到 ESP8266_NONOS_SDK-3.0.4
根目錄下面,同時刪除 examples
、 driver_lib
、third_party
文件夾。刪除之后,工程結(jié)構(gòu)如下圖所示:
修改esp_mqtt_proj
例程中的配置文件:ESP8266_NONOS_SDK-3.0.4esp_mqtt_projincludemqtt_config.h
。
上面代碼中:
MQTT_HOST:MQTT服務(wù)器地址,類型為一個字符串,可以為IP地址或者一個MQTT服務(wù)器的域名,根據(jù)之前網(wǎng)文分享,此域名我們使用:studio-mqtt.heclouds.com
MQTT_PORT:MQTT服務(wù)器端口,一般為1883
MQTT_CLIENT_ID:設(shè)備名稱,類型為一個字符串,此實例為:XiaoHaLED
MQTT_USER:產(chǎn)品ID,類型為一個字符串,此實例為:hg8zt6E3LP
MQTT_PASS:鑒權(quán)信息,類型為一個字符串,計算方法參見文末參考閱讀四,此實例為:version=2018-10-31&res=products%2Fhg8zt6E3LP%2Fdevices%2FXiaoHaLED&et=1640594308&method=md5&sign=yBG2008b6SMfxiW6q6KmnA%3D%3D
STA_SSID:WI-FI熱點名稱,即讓模塊登錄的SSID
注意:要連接2.4G的無線網(wǎng)絡(luò),否則無法連接網(wǎng)絡(luò)?。?!
STA_PASS:WI-FI密碼,即登錄的SSID對應(yīng)的密碼
上面這些信息在我們之前分享的網(wǎng)文:
與OneNET服務(wù)器連接初體驗 里都可以查到對應(yīng)信息。
將上面信息填寫至 esp_mqtt_proj
工程中對應(yīng)位置如下:
注意:
根據(jù)注釋,①位置的 CFG_HOLDER
變量每次修改之后要改變一下,+1或-1都可以,否則將不會修改系統(tǒng)配置,如果 CFG_HOLDER
變量值發(fā)生變化,那么新固件會將 WiFi SSID、WiFi 密碼、MQTT域名、端口號、MQTT用戶名和密碼等參數(shù)寫入到 sysCfg 結(jié)構(gòu)體變量中,并將結(jié)構(gòu)體內(nèi)容寫入到 Flash。
因為②中的 MQTT_PASS 內(nèi)容較長,所以需要手動修改一下對應(yīng)數(shù)組的長度:
上圖③位置,使用協(xié)議版本,要跟我們之前使用MQTT.fx軟件設(shè)置的版本一致。
因為OneNET平臺不支持遺囑消息(Will Message),所以需要注釋掉下面語句:
上面函數(shù)的作用是設(shè)置遺囑參數(shù),如果云端沒有對應(yīng)的遺囑主題,則MQTT連接會被拒絕。
固件下載
編譯固件,編譯后的固件使用 ESP8266 DOWNLOAD TOOL 軟件更新固件:
注意:燒錄固件之前,最好執(zhí)行一下ERASE操作。
固件下載完畢,重啟模塊,串口輸出如下:
查看OneNET后臺,可以看到設(shè)備成功上線了:
訂閱屬性
我們要實現(xiàn)對設(shè)備的遠程控制,那么就要讓設(shè)備訂閱一個屬性設(shè)置的主題,即 $sys/{pid}/{device-name}/thing/property/set
其中, {pid} 由產(chǎn)品ID替換,我們創(chuàng)建的產(chǎn)品ID為:hg8zt6E3LP
。{device-name} 設(shè)備名稱為:XiaoHaLED
。
所以此實例屬性設(shè)置的主題具體為:$sys/hg8zt6E3LP/XiaoHaLED/thing/property/set
連接上MQTT服務(wù)器的回調(diào)函數(shù)為 mqttConnectedCb
,我們在此函數(shù)中訂閱上述消息:
具體實現(xiàn)代碼為:
void mqttConnectedCb(uint32_t *args)
{
MQTT_Client* client = (MQTT_Client*)args;
INFO("MQTT: Connectedrn");
MQTT_Subscribe(client, "$sys/hg8zt6E3LP/XiaoHaLED/thing/property/set", 0);
/*MQTT_Subscribe(client, "/mqtt/topic/0", 0);
MQTT_Subscribe(client, "/mqtt/topic/1", 1);
MQTT_Subscribe(client, "/mqtt/topic/2", 2);
MQTT_Publish(client, "/mqtt/topic/0", "hello0", 6, 0, 0);
MQTT_Publish(client, "/mqtt/topic/1", "hello1", 6, 1, 0);
MQTT_Publish(client, "/mqtt/topic/2", "hello2", 6, 2, 0);*/
}
我們在控制臺中的 運維監(jiān)控-->設(shè)備調(diào)試-->應(yīng)用模擬器 中改變目標設(shè)備XiaoHaLED【LED】
的開關(guān)狀態(tài),模塊的串口打印輸出如下:
上面的打印信息是在接收消息的函數(shù)中打印輸出的,具體函數(shù)為:
//TODO:接收的消息
void mqttDataCb(uint32_t *args, const char* topic, uint32_t topic_len, const char *data, uint32_t data_len)
{
char *topicBuf = (char*)os_zalloc(topic_len+1),
*dataBuf = (char*)os_zalloc(data_len+1);
MQTT_Client* client = (MQTT_Client*)args;
os_memcpy(topicBuf, topic, topic_len);
topicBuf[topic_len] = 0;
os_memcpy(dataBuf, data, data_len);
dataBuf[data_len] = 0;
INFO("Receive topic: %s, data: %s rn", topicBuf, dataBuf);
//轉(zhuǎn)發(fā)串口數(shù)據(jù)
uart0_tx_buffer(topicBuf,strlen(topicBuf));
uart0_tx_buffer("rn",strlen("rn"));
uart0_tx_buffer(dataBuf,strlen(dataBuf));
os_free(topicBuf);
os_free(dataBuf);
}
如果直接使用ESP8266控制外設(shè),那么只需要在上面函數(shù)中對 dataBuf
進行數(shù)據(jù)解析即可,根據(jù)不同結(jié)果,控制ESP8266的GPIO進行不同動作即可。
如果ESP8266只是用于聯(lián)網(wǎng),負責中轉(zhuǎn)消息,控制外設(shè)的任務(wù)由STM32或其他單片機來實現(xiàn),那么只需要將數(shù)據(jù)轉(zhuǎn)發(fā)出去即可。
前一種方法省了一個外部主控,后一種方法通用性好一點,外部總控可以根據(jù)自己擅長的自由選擇。
修改代碼
拷貝文件
拷貝原SDK中driver_lib文件夾至esp_mqtt_proj文件夾中,并重命名為driver,保留uart.c
和Makefile
兩個文件,其他文件刪除即可。
拷貝 driver_libincludedriver 文件夾下的 uart.h
和 uart_register.h
文件至 esp_mqtt_projincludedriver 文件夾下,替換原有的 uart.h
和 uart_register.h
文件。
注意:因為新加了一個文件夾 driver ,所以要修改 esp_mqtt_proj 目錄下的 Makefile 文件,修改的項為:SUBDIRS
和 COMPONENTS_eagle.app.v6
兩項,具體添加如下所示:
SUBDIRS=
user
mqtt
modules
driver
COMPONENTS_eagle.app.v6 =
user/libuser.a
mqtt/libmqtt.a
modules/libmodules.a
driver/libdriver.a
重定向調(diào)試信息輸出
ESP8266有兩個串口,之前我們分享過相關(guān)網(wǎng)文(參見文末參考閱讀一),通常情況下,我們使用UART0和外設(shè)通訊,而使用UART1作為日志打印端口。
而現(xiàn)在所有的打印信息都是通過UART0打印輸出的,所以我們要將打印輸出的串口修改為UART1。
屏蔽調(diào)試信息后,只在UART0輸出有用屬性設(shè)置信息,具體展示效果如下:
由此我們可以看出,串口助手可以收到服務(wù)器端發(fā)送的屬性設(shè)置主題的內(nèi)容,對此接收消息的內(nèi)容進行解析,即可完成遠端對設(shè)備的開關(guān)設(shè)置。
同樣使用一個單片機或者STM32來替代這個串口助手,用來接收串口數(shù)據(jù)并對其進行解析,那么對設(shè)備的控制,就可以移植到單片機或者STM32端來實現(xiàn)了。
發(fā)布消息 上報屬性
設(shè)備端除了接收遠程控制指令以外,一般還要把自己的設(shè)備屬性進行上報,其他終端如果也訂閱了此主題,那么在設(shè)備對屬性上報的同時,其他終端也能同步收到此主題消息。
將接收到的串口數(shù)據(jù)發(fā)布至OneNET服務(wù)器,修改的代碼位置如下:。
通過上面我們知道,如果設(shè)備的屬性要上報給服務(wù)器,那么設(shè)備屬性上報的主題為:$sys/{pid}/{device-name}/thing/property/post
替換產(chǎn)品ID和設(shè)備名稱之后為:$sys/hg8zt6E3LP/XiaoHaLED/thing/property/post
發(fā)送的主題內(nèi)容為:
{"id":"123","version":"1.0","params":{"Runtime":{"value":1200}}}
利用串口助手發(fā)送上面數(shù)據(jù)包,實現(xiàn)設(shè)備屬性上報,具體操作如下:
也可以同時改變多個參數(shù):
{"id":"123","version":"1.0","params":{"Runtime":{"value":1000},"PowerSwitch":{"value":true}}}
利用串口助手發(fā)送上面數(shù)據(jù)包,也可以同時上報多個屬性,實現(xiàn)設(shè)備多屬性上報,具體操作如下:
資料獲取
文中涉及最終測試Demo獲取,請在公眾號后臺回復關(guān)鍵字:OneNET工程源碼。
總結(jié)
歷時近一個月,寫了五篇原創(chuàng),今天終于把這個網(wǎng)友問答分享完畢。
通過這幾篇網(wǎng)文的分享,我感覺整個解決方案的路線已經(jīng)走通了,剩下的你只要用STM32代替串口助手,用一個串口發(fā)送串口數(shù)據(jù)至ESP8266模塊,即可完成屬性的上報。解析這個STM32串口接收到的數(shù)據(jù),進而就能夠?qū)崿F(xiàn)設(shè)備屬性的設(shè)置。
文末有整個問題涉及的相關(guān)網(wǎng)文,自己先看一遍網(wǎng)文,大概了解一下解決思路,然后自己試著做一下,遇到困難了翻看一下對應(yīng)網(wǎng)文,如果還有問題,可以加小哈哥微信【微信號:chengxuyuanxiaoha】,我拉你進群里咱們細聊。
好了,今天的分享就到這里,暫時對OneNET的分享也告一段落,如果小哈哥的分享對你有所幫助,還請點贊支持一下哈。
小貼士
小哈哥公眾號新出版塊,以后每個網(wǎng)文后面一個小tip,希望對你有所幫助。
內(nèi)容涉及但不限于STM32、單片機、鴻蒙、Qt、小程序,感興趣的可以持續(xù)關(guān)注哈,以后的網(wǎng)文,篇篇文末都有的!~
Q:推薦一個JSON字符串壓縮和格式校驗的工具。
A: 在線JSON校驗格式化工具:https://www.bejson.com/
發(fā)送的測試數(shù)據(jù)包為:
{"id":"123","version":"1.0","params":{"Runtime":{"value":1234},"PowerSwitch":{"value":false}}}
參考閱讀
一、保姆級教程,虛擬機中重復驗證了三遍,包你順利接入阿里云物聯(lián)網(wǎng)平臺
二、從0到1 | ESP8266 官方SDK開發(fā)快速入門
三、代碼太多不要怕,分享一個閱讀代碼的神器
四、與OneNET服務(wù)器連接初體驗
五、大白話聊物聯(lián)網(wǎng)通信過程,看不懂算我輸!~
分享 點贊 在看 ??
以“三連”行動支持優(yōu)質(zhì)內(nèi)容!
戳“閱讀原文”了解小哈哥的知識星球,我們一起成長