#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

相关文章
相关标签/搜索