(参考)端云互通组件以太网接入实例

接入IoT平台

  1. 开发板的网口通过网线连接到路由器。

  2. 设置本地IP。

    在sys_init.c中修改device接入的局域网的IP地址值。目前demo程序采用的是静态IP地址的方式,如果需要使用DHCP方式,请在main.c中顶部头文件包含之后定义USE_DHCP宏即可。

    1. void net_init(void)
    2. {
    3. /* IP addresses initialization */
    4. IP_ADDRESS[0] = 192;
    5. IP_ADDRESS[1] = 168;
    6. IP_ADDRESS[2] = 0;
    7. IP_ADDRESS[3] = 115;
    8. NETMASK_ADDRESS[0] = 255;
    9. NETMASK_ADDRESS[1] = 255;
    10. NETMASK_ADDRESS[2] = 255;
    11. NETMASK_ADDRESS[3] = 0;
    12. GATEWAY_ADDRESS[0] = 192;
    13. GATEWAY_ADDRESS[1] = 168;
    14. GATEWAY_ADDRESS[2] = 0;
    15. GATEWAY_ADDRESS[3] = 1;
    16. }

    接口net_init()的调用在agent tiny入口函数agent_tiny_entry()之前,作用是完成lwip协议相关的初始化。

    sys_init.c位于 LiteOS/targets/Cloud_STM32F429IGTx_FIRE/Src。

  3. 网口的mac地址修改。

    在eth.c中将MAC_ADDR0~MAC_ADDR5修改成真实的mac地址值保证不重复。

    1. static int8_t eth_init(struct netif* netif)
    2. {
    3. HAL_StatusTypeDef hal_eth_init_status;
    4. MACAddr[0] = 0x00;
    5. MACAddr[1] = 0x80;
    6. MACAddr[2] = 0xE1;
    7. MACAddr[3] = 0x00;
    8. MACAddr[4] = 0x00;
    9. MACAddr[5] = 0x00;
    10. }

    (参考)端云互通组件以太网接入实例 - 图1 注意:
    接口eth_init()将在步骤2中的net_init()中被调用。eth.c位于 LiteOS/targets/Cloud_STM32F429IGTx_FIRE/Src。

  4. 设置云平台IP以及设备EP Name和PSK。

    现在需要设定相关配置参数。这些参数将作为入参传入atiny_init()以对LiteOS端云互通组件进行初始化。EP Name就是在云平台上注册设备时开发者设定的验证码,必须保证是唯一的;而PSK(预共享密钥)是用来加密传输的秘钥,agent_tiny_demo.c中示例如下:

    1. #define DEFAULT_SERVER_IPV4 "139.159.140.34" //OC
    2. char * g_endpoint_name = "44440003"; //与IoT平台上一致
    3. #ifdef WITH_DTLS
    4. char *g_endpoint_name_s = "11110006";
    5. unsigned char g_psk_value[16] = {0xef,0xe8,0x18,0x45,0xa3,0x53,0xc1,0x3c,0x0c,0x89,0x92,0xb3,0x1d,0x6b,0x6a,0x96};
    6. #endif

    agent_tiny_demo.c位于 LiteOS/demos/agenttiny_lwm2m。

  5. 编译并运行程序。

  6. 查看设备状态。

    登录IoT平台开发者Portal,选择“我的设备”,在设备列表中查看对应设备的状态。如果状态为“绑定(bound)”,则表示设备已经成功接入IoT平台。

    图 1 查看设备状态
    (参考)端云互通组件以太网接入实例 - 图2

数据上报

本文档在 第4章 中详细介绍了LiteOS SDK端云互通组件设备进行数据上报的完整流程。对于开发者来说,只需要获取传感器数据,并在接口app_data_report()中将其传递给数据上报结构体report_data即可。具体调测过程如下:

  1. 在设备侧执行app_data_report函数,使设备上报数据。

    修改agent_tiny_demo.c中的函数app_data_report如下:

    1. struct Led_Light
    2. {
    3. uint8_t lightvalue;
    4. };
    5. extern get_led_lightvalue (void); //获取传感器数据
    6. void app_data_report(void)
    7. {
    8. struct Led_Light light;
    9. data_report_t report_data;
    10. int ret;
    11. int cnt = 0;
    12. report_data.buf = (uint8_t *)&light;
    13. report_data.callback = ack_callback;
    14. report_data.cookie = 0;
    15. report_data.len = sizeof(struct Led_Light);
    16. report_data.type = APP_DATA;
    17. while(1)
    18. {
    19. report_data.cookie = cnt;
    20. cnt++;
    21. ret = atiny_data_report(g_phandle, &report_data);
    22. printf("report ret:%d\n",ret);
    23. (void)LOS_TaskDelay(250*8);
    24. }
    25. }

    agent_tiny_demo.c位于 LiteOS/demos/agenttiny_lwm2m。

  2. 查看设备状态

    登录IoT平台的开发者Portal,在“我的设备”界面的设备列表中,选择上报数据的设备,查看“历史数据”,验证设备数据上报的情况。

    图 1 使用LiteOS SDK端云互通组件的IoT设备数据上报业务流程
    (参考)端云互通组件以太网接入实例 - 图3

    图 2 查看数据上报结果
    (参考)端云互通组件以太网接入实例 - 图4

命令下发

命令下发一般分为两种形式:立即下发和缓存下发。

  • 立即下发: IoT平台立即发送收到的命令,如果设备不在线或者设备没收到指令则下发失败。立即下发适合对命令实时性有要求的场景,比如路灯开关灯,燃气表开关阀。使用立即下发时,应用服务器需要自己保证命令下发的时机。

图 1 命令立即下发流程
(参考)端云互通组件以太网接入实例 - 图5

  • 缓存下发: 平台收到命令后放入队列。在设备上线的时候,平台依次下发命令队列中的命令。缓存下发适合对命令实时性要求不高的场景,比如配置水表的参数。缓存下发平台根据设备的省电模式进行不同处理。

图 2 命令缓存下发流程
(参考)端云互通组件以太网接入实例 - 图6

应用服务器向IoT平台下发命令时,携带参数expireTime(简称TTL,表示最大缓存时间)。如果不带expireTime,则默认expireTime为48小时。

expireTime=0:命令立即下发。

expireTime>0:命令缓存下发。

LiteOS SDK端云互通组件场景命令下发的调测过程,命令下发步骤如下:

  1. 登录IoT平台的开发者Portal。开发者Portal的访问地址、账号和密码需要向IoT平台服务商申请。

  2. 在“我的设备”界面的设备列表中,选择接收命令的设备,点击“命令下发(</>)”。在弹出界面中,配置下发给设备的命令参数。

    图 3 命令下发
    (参考)端云互通组件以太网接入实例 - 图7

  3. 在“我的设备”界面的设备列表中,选择接收命令的设备->“历史命令”,查看“状态”栏的显示。

    图 4 命令下发状态
    (参考)端云互通组件以太网接入实例 - 图8

    状态说明如下:

    • 超期: 表示命令在IoT平台缓存时间超期,未向设备下发。
    • 成功: 表示IoT平台已经将命令下发给设备,且收到设备上报的命令执行结果。
    • 失败: 表示编解码插件解析为空,或执行结果响应里面有“ERROR CODE”等。
    • 超时: 表示IoT平台等待ACK响应超时。
    • 取消: 表示应用侧已经取消命令下发。
    • 等待: 表示命令在IoT平台缓存,还未下发给设备。
    • 已发送: 表示IoT平台已经将命令下发给设备。
    • 已送达: 表示IoT平台已经将命令下发给设备,且收到设备返回的ACK消息。
  4. LiteOS SDK端云互通组件从消息缓存中获取消息码流并解析,agent_tiny_cmd_ioctl.c中atiny_cmd_ioctl()接口对应的回调函数(实际调用atiny_write_app_write()处理下发命令)。

    1. int atiny_write_app_write(void* user_data, int len)
    2. {
    3. int i;
    4. uint8_t cmd_data[len];
    5. memcpy(cmd_data, user_data, len);
    6. for(i=0;i<len;i++)
    7. {
    8. //打印下发的命令数据,用户可以处理下发的命令,根据具体的命令控制硬件设备
    9. printf("######## %d",cmd_data[i]);
    10. }
    11. (void)atiny_printf("write num19 object success\r\n");
    12. return ATINY_OK;
    13. }

    agent_tiny_cmd_ioctl.c位于 LiteOS/demos/agenttiny_lwm2m。