HarmonyOS 基于 LYEVK-3861 接入華為 IoT 平臺
介紹
本文主要講述基于LYEVK-3861 IoT物聯網開發板套件,實現華為云的物聯網平臺的IoT設備接,設備和云端雙向消息通信、設備管理、遠程控制和監控等功能。
準備工作
1、開發環境、編譯環境搭建,參考官方文檔,此處不在贅述。參考鏈接如下:
2、OpenHarmony 2.2源碼 源碼獲取,參考:
源碼獲取說明
3、LYEVK-3861 IoT物聯網開發板套件
4、MQTT依賴庫
MQTT協議: 采用三方MQTT協議庫做底層支持,嵌入式版本屬于小巧可用的c實現庫,只要稍作移植修改,即可在OHOS系統上使用
cJSON: openHarmony 2.2L0 版本 的內核本身就支持cJSON,不需要做移植。
介紹
LYEVK 3861開發板通過MQTT協議與華為云IoT平臺進行互聯互通。使用到的模塊有主控板、母板、可燃氣體感應板。
設備啟動啟動之后,會自動連接熱點,獲取網絡時間,顯示最近一次上報的溫度數據,之后每隔一定的時間上報溫度數據。
初始化接口
設備信息
- void device_info_init(char *client_id, char * username, char *password);
設置設備信息,在調用oc_mqtt_init()前要先設置設備信息。
華為IoT平臺 初始化
- int oc_mqtt_init(void);
華為IoT平臺初始化函數,需要在使用 華為IoT平臺 功能前調用。
影子數據回調響應函數
- void mqtt_shadow_rsp_cb(void(*cmd_rsp_cb)(uint8_t *recv_data, size_t recv_size, uint8_t **resp_data, size_t *resp_size));
影子數據回調響應函數,設備在與華為IoT平臺連接后,獲取設備最近一次上報的屬性值的回調響應函數。
數據處理接口
設備消息上報
- int oc_mqtt_profile_msgup(char *deviceid,oc_mqtt_profile_msgup_t *payload);
是指設備無法按照產品模型中定義的屬性格式進行數據上報時,可調用此接口將設備的自定義數據上報給平臺,平臺將設備上報的消息轉發給應用服務器或華為云其他云服務上進行存儲和處理。
設備影子數據獲取
- int oc_mqtt_profile_getshadow(char *deviceid,oc_mqtt_profile_shadowget_t *payload);
設備側調用,用于獲取最近一次上報到平臺的數據。
設備上報屬性數據
- int oc_mqtt_profile_propertyreport(char *deviceid,oc_mqtt_profile_service_t *payload);
用于設備按產品模型中定義的格式將屬性數據上報給平臺。
屬性上報和消息上報的區別,請查看消息通信說明
網關批量上報屬性數據:
- int oc_mqtt_profile_gwpropertyreport(char *deviceid,oc_mqtt_profile_device_t *payload);
用于批量設備上報屬性數據給平臺。網關設備可以用此接口同時上報多個子設備的屬性數據。
屬性設置的響應結果
- int oc_mqtt_profile_propertysetresp(char *deviceid,oc_mqtt_profile_propertysetresp_t *payload);
屬性查詢響應結果
- int oc_mqtt_profile_propertygetresp(char *deviceid,oc_mqtt_profile_propertygetresp_t *payload);
屬性查詢響應結果:
軟件設計
連接平臺
在連接平臺前需要獲取CLIENT_ID、USERNAME、PASSWORD,訪問這里,填寫注冊設備后生成的設備ID(DeviceId)和密鑰(DeviceSecret),生成連接信息(ClientId、Username、Password)。
- WifiConnect("CBG", "chinasoft");
- device_info_init(CLIENT_ID, USERNAME, PASSWORD);
- oc_mqtt_init();
- mqtt_shadow_rsp_cb(ocShadowCallback); //注冊設備影子回調函數
推送數據
當需要上傳數據時,需要先拼裝數據,然后通過oc_mqtt_profile_propertyreport上報數據。代碼示例如下:
影子數據獲取
華為IoT平臺支持設備影子數據獲取,先拼接請求,通過oc_mqtt_profile_getshadow發送請求。接收響應后會通過回調函數將收到的數據發送到隊列中,讀取隊列消息后做后續處理,代碼示例如下:
- static void getShadowMsg(void)
- {
- int ret;
- oc_mqtt_profile_shadowget_t payload;
- payload.object_device_id = USERNAME;
- char request[10] = {0};
- sprintf(request, "R%d", rand() % 10000);
- payload.request_id = request;
- payload.service_id = "wktmp";
- ret = oc_mqtt_profile_getshadow(CLIENT_ID, &payload);
- }
- void ocShadowCallback(uint8_t *recv_data, size_t recv_size, uint8_t **resp_data, size_t *resp_size)
- {
- app_msg_t *app_msg;
- int ret = 0;
- app_msg = malloc(sizeof(app_msg_t));
- app_msg->msg_type = en_msg_shadow;
- app_msg->msg.cmd.payload = (char *)recv_data;
- app_msg->msg.cmd.len = recv_size;
- ret = osMessageQueuePut(mid_MsgQueue, &app_msg, 0U, 0U);
- if (ret != 0)
- {
- free(recv_data);
- }
- *resp_data = NULL;
- *resp_size = 0;
- }
編譯調試
登錄
設備接入華為云平臺之前,需要在平臺注冊用戶賬號,華為云地址:https://www.huaweicloud.com/
在華為云首頁單擊產品,找到IoT物聯網,單擊設備接入IoTDA 并單擊立即使用。
創建產品
在設備接入頁面可看到總覽界面,展示了華為云平臺接入的協議與域名信息,根據需要選取MQTT通訊必要的信息備用。
接入協議(端口號):MQTT 1883
選中側邊欄產品頁,單擊右上角“創建產品”
在頁面中選中所屬資源空間,并且按要求填寫產品名稱,選中MQTT協議,數據格式為JSON,并填寫廠商名稱,選擇所屬行業以及添加設備類型,并單擊右下角“確定”如圖:
創建完成后,選擇“查看詳情”,在產品頁會自動生成剛剛創建的產品,單擊“查看”可查看創建的具體信息。
單擊產品詳情頁的自定義模型,在彈出頁面中新增服務,自定義服務ID:
在服務ID的下拉菜單下點擊“添加屬性”填寫相關信息:
注冊設備
在側邊欄中單擊“設備”,進入設備頁面,單擊右上角“注冊設備”,勾選對應所屬資源空間并選中剛剛創建的產品,注意設備認證類型選擇“秘鑰”,按要求填寫秘鑰。
記錄下設備ID和設備密鑰
注冊完成后,在設備頁面單擊“所有設備”,即可看到新建的設備,同時設備處于未激活狀態。
設備綁定
在連接平臺前需要獲取CLIENT_ID、USERNAME、PASSWORD,訪問這里,填寫注冊設備時生成的設備ID和設備密鑰生成連接信息(ClientId、Username、Password),并將修改代碼對應位置。
聯網調試
示例代碼編譯燒錄代碼后,按下開發板的RESET按鍵,通過串口助手查看日志,首先會打印最近一次上報的溫度信息,然后打印當前溫度信息。
- Today is : Wes, pre Temp is:32
- Today is : Wes, Temp is:28
平臺上的設備顯示為在線狀態,點擊設備右側的“查看”,進入設備詳情頁面,可看到上報的數據。
在華為云平臺的消息跟蹤頁面可以查看平臺與設備的數據交互:
其中設備重新連接請求影子數據時,平臺的下發的信息如下:
設備側實現對響應的回調處理即可。
總結
以上就是設備接入云端,和云端交互的一個相對簡單的流程。設備和云端之間的交互還有很多種,比如平臺直接下發控制命令,或者是通過第三方應用通過平臺下發設備控制命令等。以上這些都可以通過閱讀官方文檔,自己實現相關的功能。
購買開發板
LYEVK-3861開發板套件:https://developer.huawei.com/consumer/cn/market/prod-detail?productId=8b2d9f0cd85445e0ace0410736977695&shopId=641dc12fabac47cdab3f03e7a