加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權(quán)保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • 實現(xiàn)目標
    • 準備工作
    • 固件下載
    •  
    • 訂閱屬性
    • 修改代碼
    • 資料獲取
    • 總結(jié)
    • 小貼士
    • 參考閱讀
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

OneNET分享完結(jié)篇 | 讓你的設(shè)備連接上OneNET平臺 (多圖預警)

2021/10/14
1247
閱讀需 19 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

今天把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.cMakefile兩個文件,其他文件刪除即可。

拷貝 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)容!

戳“閱讀原文”了解小哈哥的知識星球,我們一起成長

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

公眾號『嵌入式從0到1』,號主:程序員小哈,是一個軟硬件全棧開發(fā)工程師(12年工作經(jīng)驗的老司機),電子發(fā)燒友論壇鴻蒙版塊版主,公眾號內(nèi)容專注于嵌入式學習。堅持原創(chuàng),寫有圖、有視頻的保姆級教程文章,篇篇有干貨。做一個講清楚,說明白,大家學得會的交流平臺。