2020征文-鴻蒙開(kāi)發(fā)板 Onenet平臺(tái)+開(kāi)發(fā)板開(kāi)關(guān)燈控制
想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
https://harmonyos.51cto.com/#zz
OneNET是由中國(guó)移動(dòng)打造的PaaS物聯(lián)網(wǎng)開(kāi)放平臺(tái)。平臺(tái)能夠幫助開(kāi)發(fā)者輕松實(shí)現(xiàn)設(shè)備接入與設(shè)備連接,快速完成產(chǎn)品開(kāi)發(fā)部署,為智能硬件、智能家居產(chǎn)品提供完善的物聯(lián)網(wǎng)解決方案。
采用Onenet平臺(tái):多協(xié)議接入-》EDP,通過(guò)edp協(xié)議完成控制命令的下發(fā)(下發(fā)開(kāi)/關(guān)燈命令)、數(shù)據(jù)流信息的上傳(燈的開(kāi)/關(guān)狀態(tài))等通信流程。
EDP (Enhanced Device Protocol增強(qiáng)設(shè)備協(xié)議)是OneNET平臺(tái)根據(jù)物聯(lián)網(wǎng)特點(diǎn)專(zhuān)門(mén)定制的完全公開(kāi)的基于TCP的協(xié)議,可以廣泛應(yīng)用到家居、交通、物流、能源以及其他行業(yè)應(yīng)用中。
整體流程大致如下:
1、Onenet平臺(tái)創(chuàng)建EDP產(chǎn)品、設(shè)備、數(shù)據(jù)流、開(kāi)關(guān)燈應(yīng)用;
2、Hi3861開(kāi)發(fā)板連接到EDP設(shè)備;
3、通過(guò)Onenet EDP應(yīng)用下發(fā)控制命令(開(kāi)/關(guān)燈);
4、開(kāi)發(fā)板解析命令做出對(duì)應(yīng)的動(dòng)作(開(kāi)/關(guān)燈),并且上傳燈的狀態(tài)值,更新數(shù)據(jù)流信息;
5、Onenet應(yīng)用讀取數(shù)據(jù)流的狀態(tài)值,更新展示;

參考官方文檔:https://open.iot.10086.cn/doc/multiprotocol/
Onenet平臺(tái)EDP配置
1.進(jìn)入onenet平臺(tái)控制臺(tái)https://open.iot.10086.cn/console/,選擇多協(xié)議接入-》EDP;

2.添加產(chǎn)品led、添加設(shè)備device1;

3.添加數(shù)據(jù)流,因?yàn)槲沂褂玫娜珶魯U(kuò)展板,創(chuàng)建3條數(shù)據(jù)流:redled、greenled、yelloled;

4.應(yīng)用管理-》添加應(yīng)用led;
5.編輯應(yīng)用led,添加紅綠黃三原色燈的開(kāi)關(guān),調(diào)整屬性,紅燈的配置如下,EDP命令內(nèi)容“redled:{V}”(其余以此類(lèi)推);
Hi3861開(kāi)發(fā)板準(zhǔn)備
1.移植Onenet edp sdk,官網(wǎng)鏈接:https://open.iot.10086.cn/doc/multiprotocol/book/develop/edp/device/doc-tool.html;
移植過(guò)程中注意點(diǎn)(附件壓縮包中edp_c是我移植好的壓縮包):
1)增加宏定義:_LINUX;
2)可以復(fù)用源碼自帶的cJSON,在//third_party/edp_c/BUILD.gn中包含:"//third_party/cJSON/";
3)強(qiáng)轉(zhuǎn)for循環(huán)中的變量為有符號(hào)數(shù),在for循環(huán)里面,不能用無(wú)符號(hào)32整形數(shù)據(jù)作為判斷條件;
4)修改宏定義#define BUFFER_SIZE (0x01<<20)為#define BUFFER_SIZE 1024;本次實(shí)驗(yàn)中包字節(jié)數(shù)較小,默認(rèn)申請(qǐng)1MB,運(yùn)行時(shí)報(bào)錯(cuò)內(nèi)存溢出;
5)自定義實(shí)現(xiàn)assert宏定義,因?yàn)榫幾g時(shí)報(bào)錯(cuò)未找到原因就先自定義實(shí)現(xiàn)替代;
6)還有很多定義未使用的變量,類(lèi)似這種修改“valuestring = valuestring; remain_len = remain_len;”即可;
2.根據(jù)sdk中的示例Main.c,編寫(xiě)edp測(cè)試源碼(附件壓縮包中edp_test.c是測(cè)試源碼);
1)建立tcp連接,平臺(tái)EDP監(jiān)聽(tīng)地址ip:183.230.40.39,port:876;
2)與平臺(tái)建立EDP連接,可以調(diào)用函數(shù)EdpPacket* PacketConnect1(const char* devid, const char* auth_key),傳入設(shè)備ID和APIKey;
- char src_dev[16] = "657055845";
- char src_api_key[64] = "NO5yPB4JzAypKLfXzLx6V0aUxg4=";
- EdpPacket* send_pkg;
- /* 利用sdk 中EdpKit.h 中PacketConnect1 方法封包連接協(xié)議 */
- send_pkg = PacketConnect1(src_dev, src_api_key);
- /* 向設(shè)備云發(fā)送連接請(qǐng)求 */
- int ret = DoSend(sockfd, (const char*)send_pkg->_data, send_pkg->_write_pos);
- if(ret <= 0)
- {
- printf("Dosend failed.\n");
- return NULL;
- }
- /* 使用完后必須刪除send_pkg , 否則會(huì)造成內(nèi)存泄漏 */
- DeleteBuffer(&send_pkg);
3)接收命令請(qǐng)求數(shù)據(jù),解析命令,執(zhí)行開(kāi)關(guān)燈動(dòng)作;例如:接收到字符串“redled:1”代表紅燈開(kāi),“redled:0”代表紅燈關(guān);
- * 解包 由設(shè)備云到設(shè)備的EDP協(xié)議包, 命令請(qǐng)求消息 */
- UnpackCmdReq(pkg, &cmdid, &cmdid_len, &cmd_req, &cmd_req_len);
- ......
- /*
- 根據(jù)解析出的命令,執(zhí)行燈的開(kāi)/關(guān)
- GPIO_10: RED
- GPIO_11: GREEN
- GPIO_12: YELLOW */
- if(strcmp(cmd_str, "redled") == 0)
- GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_10, cmd_val);
- else if(strcmp(cmd_str, "greenled") == 0)
- GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_11, cmd_val);
- else if(strcmp(cmd_str, "yellowled") == 0)
- GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_12, cmd_val);
4)調(diào)用EdpPacket* PacketSavedataSimpleString(const char* dst_devid, const char* input, uint16 msg_id),組裝以分號(hào)分隔的簡(jiǎn)單字符串形式,上傳數(shù)據(jù)到平臺(tái),用來(lái)更新數(shù)據(jù)流(燈的開(kāi)/關(guān)狀態(tài));例如:組裝字符串“,;redled,1”代表當(dāng)前紅燈亮,“,;redled,0”代表紅燈滅;
- /* 打包 設(shè)備到設(shè)備云的EDP協(xié)議包, 存儲(chǔ)數(shù)據(jù)(以分號(hào)分隔的簡(jiǎn)單字符串形式) */
- send_pkg = PacketSavedataSimpleString(NULL, cmd_resp, 0); //沒(méi)有轉(zhuǎn)發(fā)設(shè)備,第一個(gè)參數(shù)為NULL
- DoSend(sockfd, (const char*)send_pkg->_data, send_pkg->_write_pos);
- DeleteBuffer(&send_pkg);
5)采用AT命令的方式觸發(fā)edp測(cè)試,增加命令“AT+EDPTEST”,方便測(cè)試;
- const at_cmd_func g_at_edp_func_tbl[] = {
- {"+EDPTEST", 8, HI_NULL, HI_NULL, HI_NULL, (at_call_back_func)at_exe_edp_test_cmd},
- };
- void AtEdpExampleEntry(void)
- {
- hi_at_register_cmd(g_at_edp_func_tbl, sizeof(g_at_edp_func_tbl)/sizeof(g_at_edp_func_tbl[0]));
- }
總體測(cè)試流程
1.編譯固件,啟動(dòng)開(kāi)發(fā)板,首先是連接wifi,保證網(wǎng)絡(luò)暢通;
2.執(zhí)行AT+EDPTEST命令,連接Onenet平臺(tái),連接成功設(shè)備顯示在線;

3.打開(kāi)應(yīng)用led,對(duì)紅綠黃三燈進(jìn)行開(kāi)關(guān),能夠看到開(kāi)發(fā)板三原色燈正確亮滅;
4.串口的打印信息如下:wifi連接成功 -> AT+EDPTEST -> 接入平臺(tái)成功 -> 解析命令,控制燈亮滅 -> 上傳狀態(tài)信息,更新設(shè)備數(shù)據(jù)流;

5)手機(jī)操作更加便捷,應(yīng)用界面如下;

以上就是分享的全部?jī)?nèi)容,謝謝觀看!
想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):
51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)
https://harmonyos.51cto.com/#zz