#2020徵文-開發板# Onenet平臺+開發板開關燈控制

目錄:
Onenet平臺EDP配置
Hi3861開發板準備
整體測試流程
源碼包html

OneNET是由中國移動打造的PaaS物聯網開放平臺。平臺可以幫助開發者輕鬆實現設備接入與設備鏈接,快速完成產品開發部署,爲智能硬件、智能家居產品提供完善的物聯網解決方案。api

採用Onenet平臺:多協議接入-》EDP,經過edp協議完成控制命令的下發(下發開/關燈命令)、數據流信息的上傳(燈的開/關狀態)等通訊流程。網絡

EDP (Enhanced Device Protocol加強設備協議)是OneNET平臺根據物聯網特色專門定製的徹底公開的基於TCP的協議,能夠普遍應用到家居、交通、物流、能源以及其餘行業應用中。tcp

總體流程大體以下:函數

一、Onenet平臺建立EDP產品、設備、數據流、開關燈應用;

 

二、Hi3861開發板鏈接到EDP設備;post

三、經過Onenet EDP應用下發控制命令(開/關燈);測試

四、開發板解析命令作出對應的動做(開/關燈),而且上傳燈的狀態值,更新數據流信息;ui

五、Onenet應用讀取數據流的狀態值,更新展現;3d

 

圖片.png

參考官方文檔:https://open.iot.10086.cn/doc...code

Onenet平臺EDP配置

1.進入onenet平臺控制檯https://open.iot.10086.cn/con...,選擇多協議接入-》EDP;

圖片.png

2.添加產品led、添加設備device1;

圖片.png

3.添加數據流,由於我使用的三色燈擴展板,建立3條數據流:redled、greenled、yelloled;

圖片.png

4.應用管理-》添加應用led;

圖片.png

5.編輯應用led,添加紅綠黃三原色燈的開關,調整屬性,紅燈的配置以下,EDP命令內容「redled:{V}」(其他以此類推);

圖片.png

Hi3861開發板準備

1.移植Onenet edp sdk,官網連接:https://open.iot.10086.cn/doc...

圖片.png

移植過程當中注意點(附件壓縮包中edp_c是我移植好的壓縮包):

1)增長宏定義:_LINUX;

 

2)能夠複用源碼自帶的cJSON,在//third_party/edp_c/BUILD.gn中包含:"//third_party/cJSON/";

3)強轉for循環中的變量爲有符號數,在for循環裏面,不能用無符號32整形數據做爲判斷條件;

4)修改宏定義#define BUFFER_SIZE (0x01<<20)爲#define BUFFER_SIZE 1024;本次實驗中包字節數較小,默認申請1MB,運行時報錯內存溢出;

5)自定義實現assert宏定義,由於編譯時報錯未找到緣由就先自定義實現替代;

6)還有不少定義未使用的變量,相似這種修改「valuestring = valuestring; remain_len = remain_len;」便可;

2.根據sdk中的示例Main.c,編寫edp測試源碼(附件壓縮包中edp_test.c是測試源碼);

1)創建tcp鏈接,平臺EDP監聽地址ip:183.230.40.39,port:876;

 

2)與平臺創建EDP鏈接,能夠調用函數EdpPacket PacketConnect1(const char devid, const char* auth_key),傳入設備ID和APIKey;

char src_dev[16] = "657055845";
    char src_api_key[64] = "NO5yPB4JzAypKLfXzLx6V0aUxg4=";

    EdpPacket* send_pkg;
    /* 利用sdk 中EdpKit.h 中PacketConnect1 方法封包鏈接協議 */
    send_pkg = PacketConnect1(src_dev, src_api_key);  
    /* 向設備雲發送鏈接請求 */
    int ret = DoSend(sockfd, (const char*)send_pkg->_data, send_pkg->_write_pos);
    if(ret <= 0)
    {   
        printf("Dosend failed.\n");
        return NULL;
    }
    /* 使用完後必須刪除send_pkg , 不然會形成內存泄漏 */
    DeleteBuffer(&send_pkg);

圖片.png

3)接收命令請求數據,解析命令,執行開關燈動做;例如:接收到字符串「redled:1」表明紅燈開,「redled:0」表明紅燈關;

/* 解包 由設備雲到設備的EDP協議包, 命令請求消息 */
UnpackCmdReq(pkg, &cmdid, &cmdid_len, &cmd_req, &cmd_req_len);

......

/*
   根據解析出的命令,執行燈的開/關
   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)調用EdpPacket PacketSavedataSimpleString(const char dst_devid, const char* input, uint16 msg_id),組裝以分號分隔的簡單字符串形式,上傳數據到平臺,用來更新數據流(燈的開/關狀態);例如:組裝字符串「,;redled,1」表明當前紅燈亮,「,;redled,0」表明紅燈滅;

/* 打包 設備到設備雲的EDP協議包, 存儲數據(以分號分隔的簡單字符串形式) */
send_pkg = PacketSavedataSimpleString(NULL, cmd_resp, 0);    //沒有轉發設備,第一個參數爲NULL
DoSend(sockfd, (const char*)send_pkg->_data, send_pkg->_write_pos);
DeleteBuffer(&send_pkg);

5)採用AT命令的方式觸發edp測試,增長命令「AT+EDPTEST」,方便測試;

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]));
}

整體測試流程

1.編譯固件,啓動開發板,首先是鏈接wifi,保證網絡暢通;
2.執行AT+EDPTEST命令,鏈接Onenet平臺,鏈接成功設備顯示在線;


做者:HarryP0tter
想了解更多內容,請訪問: 51CTO和華爲官方戰略合做共建的鴻蒙技術社區https://harmonyos.51cto.com

相關文章
相關標籤/搜索