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