1. 程式人生 > 實用技巧 >#2020徵文-開發板# Onenet平臺+開發板開關燈控制

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

目錄:
Onenet平臺EDP配置
Hi3861開發板準備
總體測試流程
原始碼包

OneNET是由中國移動打造的PaaS物聯網開放平臺。平臺能夠幫助開發者輕鬆實現裝置接入與裝置連線,快速完成產品開發部署,為智慧硬體、智慧家居產品提供完善的物聯網解決方案。

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

EDP (Enhanced Device Protocol增強裝置協議)是OneNET平臺根據物聯網特點專門定製的完全公開的基於TCP的協議,可以廣泛應用到家居、交通、物流、能源以及其他行業應用中。

整體流程大致如下:

                  1、Onenet平臺建立EDP產品、裝置、資料流、開關燈應用;

                  2、Hi3861開發板連線到EDP裝置;

                  3、通過Onenet EDP應用下發控制命令(開/關燈);

                  4、開發板解析命令做出對應的動作(開/關燈),並且上傳燈的狀態值,更新資料流資訊;

                  5、Onenet應用讀取資料流的狀態值,更新展示;

參考官方文件:https://open.iot.10086.cn/doc/multiprotocol/

Onenet平臺EDP配置

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

2.新增產品led、新增裝置device1;

3.新增資料流,因為我使用的三色燈擴充套件板,建立3條資料流:redled、greenled、yelloled;

4.應用管理-》新增應用led;

5.編輯應用led,新增紅綠黃三原色燈的開關,調整屬性,紅燈的配置如下,EDP命令內容“redled:{V}”(其餘以此類推);

Hi3861開發板準備

1.移植Onenet edp sdk,官網連結:https://open.iot.10086.cn/doc/multiprotocol/book/develop/edp/device/doc-tool.html;

移植過程中注意點(附件壓縮包中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);

    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