前言:
之前有發過Neptune開發闆-MQTT連接配接華為IoT平台文章,但發現寫的程式有很大BUG,導緻程式運作到開發闆經常發生CPU異常(直接不能運作)和平台指令下發錯誤,在此和之前使用我寫的程式發生問題的人說一句抱歉,本次我修改程式,解決了CPU異常(直接不能運作)和平台指令下發錯誤問題,并測試20~30分鐘,確定穩定運作,并将一些遇到問題做相關介紹。
介紹:
本示例将示範如何在Neptune開發闆上使用MQTT協定連接配接華為IoT平台,使用的是ATH20溫濕度傳感器子產品與Neptune開發闆
本示例實作AHT20溫濕度資料上報華為IoT平台,IoT平台下發指令控制LED燈的開關
使用W800 SDK功能包中libemqtt來實作連接配接華為IoT平台
void mqtt_init(mqtt_broker_handle_t broker, const char clientid);
初始化要連接配接到代理的資訊
參數
描述
broker
代理資料結構,包含與代理的連接配接資訊
clientId
clientId辨別用戶端ID
傳回
無
void mqtt_init_auth(mqtt_broker_handle_t broker, const char username, const char* password);
啟用身份驗證以連接配接到代理。
username
使用者名
password
密碼
編寫TCP連接配接函數,代碼示例如下:
int mqtt_connect(mqtt_broker_handle_t* broker);
1
成功
連接配接錯誤
-1
輸入輸出錯誤
編寫訂閱MQTT主題函數,代碼示例如下:
采用cJSON封包與解包(使用W800 SDK功能包中cJSON實作),共有兩個封包(一個裝置屬性上報,一個指令應答上報),一個解包解析IoT平台指令,其他不過多贅述具體詳見華為IoTDA 裝置接入文檔: 裝置接入 IoTDA 文檔
例如裝置屬性上報,代碼示例如下:
按照華為雲IoT裝置平台指令下發文檔需要将
下行中的request_id={request_id} 複制到上行中,隻有這樣下行與上行request_id相同才能保證平台指令資料下發成功任務
這裡展示一小段代碼:
這裡我出的問題就在->strncpy(request_id,topic+63,47);在我之前是topic+62 而且再我之前建立demo平台下發成功,就沒想了,但在這幾天測試時就發現這問題故說明。
由于定時器使用不當,導緻CPU中斷異常,緻程式崩潰(以更改)
請參考:BearPi-HM_Nano開發闆WiFi程式設計開發——MQTT連接配接華為IoT平台(Demo我以導出模型)
添加華為雲IoT參數:(這隻是示例,無法使用)
在wifi_connecter.h修改wifi熱點資訊
示例代碼編譯燒錄代碼後,按下開發闆的RESET按鍵:
點選裝置右側的“檢視”,進入裝置詳情頁面,可看到上報的資料
在華為雲平台裝置詳情頁,單擊“指令”,選擇同步指令下發,選中建立的指令屬性,單擊“确定”,即可發送下發指令控制裝置
現以解決經常發生CPU異常(直接不能運作)和平台指令下發錯誤,同時建立使用兩個定時器,一個20秒上報AHT20資料,一個1分鐘ping一次(用以保活),使之穩定運作,支援1.0版本與1.1版本。
相關說明:
本程式部分參考基于聯盛德w600的mqtt用戶端程式示例
想了解更多關于鴻蒙的内容,請通路:
51CTO和華為官方戰略合作共建的鴻蒙技術社群
https://harmonyos.51cto.com/#bkwz
::: hljs-center
:::