一、MQTT協定簡介
MQTT(消息隊列遙測傳輸)是一個基于用戶端-伺服器的消息釋出/訂閱傳輸協定,是ISO标準(ISO/IEC PRF 20922)下基于釋出/訂閱範式的消息協定。MQTT工作在TCP/IP協定棧上,是為硬體性能低下的遠端裝置以及網絡狀況不理想的情況下而設計的釋出/訂閱型消息協定。由于MQTT協定的輕量、簡便、開放的特點使它适用範圍非常廣泛。在很多情況下,包括受限的環境中使用,廣泛應用于物聯網(IoT)。MQTT協定在衛、星鍊路通信傳感器、醫療裝置、智能家居、及一些小型化裝置中已廣泛使用。
OneNET移動雲為國内主流的雲平台,提供免費試用的物聯網平台,本文使用小淩派RK2206開發闆實作基于OpenHarmony的OneNET移動雲IoT服務。小淩派RK2206開發闆采用瑞芯微高性能、高成本效益的RK2206晶片。RK2206晶片是一款低功耗、高內建的MCU無線區域網路處理器,它可以應用于不同的應用領域,如物聯網、可穿戴裝置、家庭自動化、雲連接配接等。小淩派RK2206開發闆内置WIFI子產品,外部接口豐富,使用一個小淩派RK2206開發闆就能夠輕松實作MQTT物聯網多種應用。
二、硬體電路設計
如圖1所示,為小淩派RK2206開發闆支援的外部接口,本文使用小淩派RK2206開發闆内置的WIFI和MQTT伺服器通信。
::: hljs-center
:::
::: hljs-center
圖1 小淩派RK2206開發闆
:::
三、軟體設計
主程式設計
在iot_onenet_example函數中,通過LOS_TaskCreate函數建立iot_onenet_thread線程,并設定線程優先級、線程堆棧大小等參數。
static void iot_onenet_example()
{
unsigned int ret = LOS_OK;
unsigned int thread_id1;
TSK_INIT_PARAM_S task1 = {0};
task1.pfnTaskEntry = (TSK_ENTRY_FUNC)iot_onenet_thread;
task1.uwStackSize = 10240;
task1.pcName = "iot_onenet_thread";
task1.usTaskPrio = 24;
ret = LOS_TaskCreate(&thread_id1, &task1);
if (ret != LOS_OK)
{
printf("Falied to create iot_onenet_thread ret:0x%x\n", ret);
return;
}
}
IoT OneNET服務程式設計
iot_onenet_thread函數中,開發闆先連接配接WIFI,通過WIFI和OneNET IoT平台通信;WIFI連接配接成功後,初始化網絡,初始化MQTT用戶端,設定指令接收回調函數;初始化完成後,成功連接配接OneNET IoT平台。
void iot_onenet_thread()
{
unsigned int data = 0;
/*wifi連接配接*/
SetWifiModeOn();
device_info_init(ONENET_INFO_DEVID, ONENET_INFO_PROID, ONENET_INFO_AUTH, ONENET_INFO_APIKEY, ONENET_MASTER_APIKEY);
onenet_mqtt_init();
onenet_set_cmd_rsp_cb(onenet_cmd_rsp_cb);
while (1)
{
onenet_mqtt_upload_digit("data", data++);
sleep(1);
}
}
四、編譯測試
登入OneNET平台
裝置連接配接OneNET平台前,需要做一些準備工作;登入OneNET平台,在平台注冊個人使用者賬号,并且需要實名認證後才可以正常使用。如圖2所示,為OneNET平台位址:https://open.iot.10086.cn。
::: hljs-center
:::
::: hljs-center
圖2 OneNET平台位址
:::
建立産品
在OneNET平台注冊個人使用者賬号并進行登入,登入後進入控制台首頁,點選全部産品服務,選擇多協定接入,如圖3所示。
::: hljs-center
:::
::: hljs-center
圖3 控制台頁面
:::
進入多協定接入頁面,點選添加産品按鍵,添加産品,如圖4所示。
::: hljs-center
:::
::: hljs-center
圖4 多協定接入頁面
:::
進入添加産品頁面,按照要求填寫産品資訊,點選确定,如圖5所示。
::: hljs-center

:::
::: hljs-center
圖5 添加産品
:::
添加産品成功後,進入産品概況頁面,可以看到建立的産品,如圖6所示。
::: hljs-center
:::
::: hljs-center
圖6 産品概況
:::
添加裝置
點選側邊欄裝置清單頁面,點選添加裝置,如圖7所示。
::: hljs-center
:::
::: hljs-center
圖7 添加裝置
:::
按照要求填入裝置名稱和鑒權資訊,點選添加裝置,如圖8所示。
::: hljs-center
:::
::: hljs-center
圖8 添加裝置詳情頁
:::
成功建立裝置後,側邊欄點選裝置清單,可以檢視到建立的裝置資訊,如圖9所示。
::: hljs-center
:::
::: hljs-center
圖9 裝置清單頁面
:::
點選詳情,進入剛添加的裝置,可以檢視到裝置的詳細資訊,點選添加APIKey,按照要求填寫APIKey,如圖10所示。
::: hljs-center
:::
::: hljs-center
圖10 添加APIKey
:::
代碼裝置資訊修改
點選側邊欄産品概況頁面,檢視産品ID和Master-APIkey,如圖11所示。
::: hljs-center
:::
::: hljs-center
圖11 産品ID和Master-APIkey
:::
對應修改如下代碼中的值,其中,ONENET_INFO_PROID為産品ID,ONENET_MASTER_APIKEY為Master-APIkey。
#define ONENET_INFO_PROID "535158"
#define ONENET_MASTER_APIKEY "RhPzbaX813t=Uyjxb9Cyf=GdXhw="
點選側邊欄裝置清單頁面,點選進入裝置詳情頁面,檢視裝置ID詳情,如圖12所示。
::: hljs-center
:::
::: hljs-center
圖12 裝置ID詳情
:::
對應修改如下代碼的值,其中,ONENET_INFO_DEVID為裝置ID,ONENET_INFO_AUTH為鑒權資訊,ONENET_INFO_APIKEY為APIKey。
#define ONENET_INFO_DEVID "970784873"
#define ONENET_INFO_AUTH "oneNet2022"
#define ONENET_INFO_APIKEY "E=fejcLgjl2tuyw=Aqy2aBTMRFc="
WIFI連接配接
修改代碼中的SSID和PASSWORD為使用WIFI的SSID和密匙,用于連接配接網絡,裝置通過WIFI通路阿裡雲IoT平台。代碼如下所示:
#define SSID "lzdz"
#define PASSWORD "12345678"
運作結果
例程代碼編譯燒寫到開發闆後,按下開發闆的RESET按鍵,通過序列槽軟體檢視日志,序列槽列印MQTT初始化、連接配接等日志。
NetworkConnect...
MQTTClientInit...
MQTTConnect...
MQTTSubscribe...
此時登入OneNET平台,點選進入裝置詳情頁面,可以看到裝置的目前狀态為線上。如圖13所示。
::: hljs-center
:::
::: hljs-center
圖13 裝置上線OneNET平台
:::
點選進入裝置詳情頁面,點選資料流展示頁面,可以檢視到開發闆上報的資料在不斷重新整理。
::: hljs-center
:::
::: hljs-center
圖14 資料上報OneNET平台
:::
進入指令下發頁面,點選下發指令按鍵,下發指令,如圖15所示。
::: hljs-center
:::
::: hljs-center
圖15 下發指令
:::
選擇字元串指令,下發hello到開發闆,如圖16所示。
::: hljs-center
:::
::: hljs-center
圖16 下發字元串指令
:::
此時,開發闆序列槽會列印接收到的字元串資訊,如下所示。
recv data is hello