漫谈LiteOS-端云互通组件-LwM2M开发指南(上)
1 前言
本文档主要通过实例讲述如何通过Agent Tiny SDK的端云互通组件,使用LwM2M协议快速接入华为物联网平台。
2 Agent Tiny SDK简介
Agent Tiny是部署在具备广域网能力、对功耗/存储/计算资源有苛刻限制的终端设备上的轻量级互联互通中间件,您只需调用API接口,便可实现设备快速接入到物联网平台以及数据上报和命令接收等功能。 Agent Tiny SDK是Huawei Agent Tiny软件开发工具包(Software Development Kit),通过Agent Tiny SDK端云互通组件,简单快速地实现与华为物联网平台安全可靠连接,可以大大减少开发周期, 快速构建IoT产品。端云互通组件可以采用MQTT、CoAP和LwM2W协议接入物联网平台。
IOT SDK 架构图
图2-01
3接入物联网平台流程
本章分别从 IoT 平台侧和端侧阐述通过端云互通组件接入物联网平台的开发流程,旨在帮助开发者在 IoT 设备上集成端云互通组件,进行IoT应用开发和调测。 端云互通组件接入华为 OceanConnect IoT 云平台默认采用的是以太网方式(即以太网口驱动+LwIP网络协议栈+LwM2M协议+Agent Tiny SDK 对接云平台), 同时也支持WIFI、GSM、NB-IoT等无线方式。OceanConnect 即华为IoT联接管理平台(IoT Connection Management Platform)是面向运营商和企业/行业领域的统一开放云平台, 支持SIM和非SIM场景的各种联接和联接管理。通过开放的APIs,向上集成各种行业应用,向下接入各种传感器、终端和网关,帮助运营商和企业/行业客户实现多种行业终端的快速接入, 多种行业应用的快速集成。华为IoT联接管理平台提供安全可控的全联接管理,使能行业革新,构建IoT生态(本章中提到的IoT平台指OceanConnect)。
平台对接信息
图3-01
设备接入云端可分为直连接入和BS引导接入,如下示意图
图3-02直连接入物联网平台示意图
图3-03 BS引导接入物联网平台示意图
4直连接入实例
(参考)端云互通组件以太网接入实例
- 硬件设备:野火STM32F429开发板,调试下载器(J-Link、ST-Link等)、网线、路由器、USB转串口线。
说明:本章以野火STM32F429IG开发板为例进行介绍,板子的详细资料可以从http://www.firebbs.cn/forum.php下载。
4.0-01图STM32F429IG_FIRE开发板外设
4.0-02 直连模式下整体配置流程
4.1平台侧开发
使用“开发中心”完成平台侧的开发。开发中心是基于设备管理服务提供的一站式开发工具,帮助开发者快速开发产品(Profile、编解码插件) ,并进行自动化测试,生成测试报告。平台侧配置流程包括:新建项目,新建产品、开发profile,开发编解码插件,注册设备。
1环境准备
在开发之前,需要提前获取如下信息:
开发中心的访问账号/密码,需要向OceanConnect IoT平台申请
2新建项目
项目是物联网平台提供物联网应用和设备的调测空间,可以根据场景的不同创建不同项目空间分别调测。 在基于开发中心进行物联网开发时,需要根据行业属性创建独立的项目,并在该项目空间内开发物联网产品和应用。
创建项目时,物联网平台会分配一个应用ID(接口调用时参数名为appId)作为项目的唯一标识。若应用服务器需要调用物联网平台的API接口进行一些业务处理, 请求中必须携带appId以接入对应的项目空间,鉴权接口携带在Body中,其他接口的appId的值一般携带在Header中。 创建项目后,可以在项目中查看应用服务器和设备的接入地址和端口信息,方便您快速对接应用服务器和设备。 项目被删除后项目内的所有资源,如设备、产品、订阅数据在平台中的信息会被全部删除,并且不可恢复,请谨慎操作。
(1)登录物联网平台。
(2)进入开发者中心,在我的项目中点击“新建项目”。
(3)在新弹出窗口中,配置项目信息,点击“确定”。
配置示例如下图,点击“确定”后,IoT平台会返回项目对应的应用ID和应用密钥,请妥善保存应用密钥,以便于应用服务器接入平台时使用。如果遗忘密钥,需要通过“对接信息”->"重置密钥”进行重置。
图4.1-02配置项目
图4.1-03 项目创建成功
3产品开发
在物联网平台中,某一类具有相同能力或特征的设备的合集被称为一款产品。产品包含Profile(产品模型)、编解码插件、测试报告等资源, 其中产品信息被记录在Profile中。产品的Profile文件用来描述设备类型和设备服务能力。它定义了设备具备的服务能力,每个服务具备的属性、 命令以及命令参数。
在一个项目里最多可以创建20个产品。产品开发最重要的是开发Profile,Profile用于描述设备具备的能力和特性。定义Profile,即在物联网平台构建一款设备的抽象模型,使平台理解该款设备支持的服务、属性、命令等信息。如果设备上报的数据是二进制码流格式,就需要开发对应的编解码插件,用于物联网平台完成二进制格式和JSON格式的转换。 删除产品后,该产品下的Profile、编解码插件等资源将被清空,请谨慎操作。
开发中心上提供了多种创建产品的方法。
图4.1-04
(1)登录IoT平台的开发者中心。
(2)进入项目->选择“产品开发”->点击“新建产品”->选择“自定义产品”->点击“自定义产品”。
IoT平台提供了产品的Profile模板库,开发者可以根据自己需要,选择合适的模板直接使用。如果在模板库中未找到需要的Profile,再自己定义,示例如下。
图4.1-05创建Profile文件
说明:如上配置仅为参考举例,具体配置请以现网需求为准。
(3) 选择新创建的产品,点击“新建服务”,配置设备的服务能力。
可参考“产品开发”->“添加”->“基于系统模板创建”中的产品进行配置。例如新建一个名为LightControl的服务,包含一种属性light(灯亮LUX数)和一种命令(设置灯亮on或者灭off)
图4.1-06新建LightControl服务
(4)(可选)开发者中心提供了Profile文件的导出功能。
选择“产品开发”->选择已创建的产品->点击右上角“导出Profile”,可以对线上开发的Profile文件进行导出。
图4.1-07导出Profile文件
4开发编解码插件
IoT设备和IoT平台之间采用LwM2M协议通信,LwM2M消息的数据为应用层数据,应用层数据的格式由设备厂商自行定义。由于IoT设备对省电要求较高,所以应用层数据一般采用二进制格式。IoT平台在对应用层数据进行协议解析时,会转换成统一的json格式,以方便应用服务器使用。要实现二进制消息与json格式消息的转换,IoT平台需要使用编解码插件。
(1)选择“产品开发”->选择已创建的产品->选择“编解码插件开发”,选择“在线编解码插件编辑器”。
图4.1-08创建插件
(2)点击“新增消息”,配置二进制码流和Profile属性/命令/命令响应的映射关系。
图4.1-09开发插件(新增数据上报消息)
图4.1-10开发插件(添加字段)
图4.1-11开发插件(添加字段
图4.1-12开发插件(新建命令下发消息)
图4.1-13开发插件(添加字段)
编解码插件的开发,即定义:
l Profile文件定义的属性/响应在设备上报的二进制码流中的位置,以便于平台对设备上报数据和命令响应进行解码。
l Profile文件定义的命令在平台下发的二进制码流中的位置,以便于平台对下发命令进行编码。
图4.1-14 二进制码流和Profile文件的映射关系
(3)点击右上角“部署”。
点击部署后,需要先“保存”插件,之后才开始部署。部署需要等待时间小于60s。
图4.1-15保存插件
图4.1-16部署插件
(4)(可选)开发者中心提供了编解码插件的下载功能。
选择“产品开发”->选择已创建的产品->选择“编解码插件开发”,选择“插件管理”,点击“下载”可以对线上开发的编解码插件进行导出。
5添加真实&虚拟设备
平台通过接入真实&虚拟的设备,对开发的应用和设备进行在线调测,并进行统一的设备管理。
(1)选择“设备管理”->“添加真实设备”->选择已创建的产品->输入设备名称和设备标识,并根据业务需求选择是否加密设备。最后点击“确定”。
图4.1-17注册设备信息
添加设备后,IoT平台会返回设备ID和PSK码,请妥善保存。新添加的设备状态为“离线”。
图4.1-18 注册设备
4.2设备侧开发
直连模式设备侧开发包括: 配置Demo中对接云端设备的信息、编译、运行SDK、数据上报任务与命令下发调测。
设备侧开发环境准备
在开发之前,需要提前进行如下操作:
l 搭建好Eclipse开发工具软件环境
l 使用网线将野火STM32F429开发板接入互联网并使用USB转串口线连接开发版的串口1与PC
l 获取端云互通组件代码:https://github.com/LiteOS/LiteOS/tree/iot_link
配置Demo中对接云端设备的信息
1. 开发板的网口通过网线连接到路由器。 2. 设置本地IP。
在net_driver.c中修改device接入的局域网的IP地址值。目前demo程序采用的是静态IP地址的方式,如果需要使用DHCP方式,请在main.c中顶部头文件包含之后定义USE_DHCP宏即可。
void net_init(void) { /* IP addresses initialization */ IP_ADDRESS[0] = 192; IP_ADDRESS[1] = 168; IP_ADDRESS[2] = 0; IP_ADDRESS[3] = 115; NETMASK_ADDRESS[0] = 255; NETMASK_ADDRESS[1] = 255; NETMASK_ADDRESS[2] = 255; NETMASK_ADDRESS[3] = 0; GATEWAY_ADDRESS[0] = 192; GATEWAY_ADDRESS[1] = 168; GATEWAY_ADDRESS[2] = 0; GATEWAY_ADDRESS[3] = 1; }
接口net_init()的作用是完成lwip协议相关的初始化。net_driver.c位于 LiteOS-iot_link/targets/STM32F429IGTx_FIRE/Src。
3 网口的mac地址修改。
在eth.c中将MAC_ADDR0~MAC_ADDR5修改成真实的mac地址值保证不重复。
static int8_t eth_init(struct netif* netif) { HAL_StatusTypeDef hal_eth_init_status; MACAddr[0] = 0x00; MACAddr[1] = 0x80; MACAddr[2] = 0xE1; MACAddr[3] = 0x00; MACAddr[4] = 0x00; MACAddr[5] = 0x00; }
注意:接口eth_init()将在步骤2中的net_init()中被调用。eth.c位于 LiteOS-iot_link/targets/STM32F429IGTx_FIRE/Src。
4 设置云平台IP以及设备EP Name和PSK。
根据开发中心添加的设备信息修改oc_dtls_lwm2m_demo.c中参数。
/**/#define cn_endpoint_id "LedLight001" /**/#define cn_app_server "49.4.85.232" /**/#define cn_app_port "5684" const unsigned char s_app_psk[]={0xd6,0x69,0x42,0x7e,0x2d,0xd4,0x38,0xf1,0xd5,0xb5,0xed,0x32,0x96,0x29,0xe6,0x20};
oc_dtls_lwm2m_demo.c位于 LiteOS-iot_link/demos。
5编译并运行程序。
config.mk位于 LiteOS-iot_link/targets/STM32F429IGTx_FIRE/GCC。
修改配置参数为:
CONFIG_OS_TYPE := "liteos" CONFIG_ARCH_CPU_TYPE := "armv7-m" CONFIG_SHELL_ENABLE := y CONFIG_STIMER_ENABLE := y CONFIG_DRIVER_ENABLE := y CONFIG_AT_ENABLE := y CONFIG_CJSON_ENABLE := y CONFIG_TCPIP_ENABLE := y CONFIG_TCPIP_TYPE := "lwip_socket" CONFIG_DTLS_ENABLE := y CONFIG_DTLS_TYPE := "mbedtls_psk" CONFIG_MQTT_ENABLE := n CONFIG_MQTT_TYPE := "lite_mqtt" CONFIG_LWM2M_ENABLE := y CONFIG_LWM2M_TYPE := "wakaama_lwm2m" CONFIG_COAP_ENABLE := n CONFIG_COAP_TYPE := "lite_coap" CONFIG_OC_COAP_ENABLE := n CONFIG_OC_COAP_TYPE := "soft" CONFIG_OC_MQTT_ENABLE := n CONFIG_OC_MQTT_TYPE := "soft" CONFIG_OC_LWM2M_ENABLE := y CONFIG_OC_LWM2M_TYPE := "soft" CONFIG_OTA_ENABLE := n CONFIG_PCP_ENABLE := n CONFIG_DEMO_ENABLE := y CONFIG_DEMO_TYPE := "oc_dtls_lwm2m_demo" include $(TOP_DIR)/iot_link/iot.mk
6查看设备状态。
登录IoT平台开发者中心,选择“设备管理”,在设备列表中查看对应设备的状态。如果状态为“在线”,则表示设备已经成功接入IoT平台。
图4.2-01 查看设备状态
4.3调测
数据上报
对于开发者来说,只需在app\_report\_task\_entry\(\)中将其传递给数据上报结构体 light 即可。具体调测过程如下:
设备侧执行app_report_task_entry函数,使设备上报数据。
oc_lwm2m_demo_dtls.c中的函数app_report_task_entry如下:
static int app_report_task_entry() { int ret = -1; int lux = 0; oc_config_param_t oc_param; app_light_intensity_t light; memset(&oc_param,0,sizeof(oc_param)); oc_param.app_server.address = cn_app_server; oc_param.app_server.port = cn_app_port; oc_param.app_server.ep_id = cn_endpoint_id; oc_param.app_server.psk = (char *)s_app_psk; oc_param.app_server.psk_len = sizeof(s_app_psk); oc_param.app_server.psk_id = cn_endpoint_id; oc_param.boot_mode = en_oc_boot_strap_mode_factory; oc_param.rcv_func = app_msg_deal; ret = oc_lwm2m_config(&oc_param); if(ret == 0) //success ,so we could receive and send { //install a dealer for the led message received while(1) //--TODO ,you could add your own code here { lux++; lux= lux%10000; light.msgid = cn_app_light; light.intensity = htons(lux); oc_lwm2m_report((char *)&light,sizeof(light),1000); ///< report the light message osal_task_sleep(10*1000); } } return ret; }
oc_dtls_lwm2m_demo.c位于 LiteOS-iot_link/demos。
查看设备状态
登录IoT平台的开发者中心,在“设备管理”界面的设备列表中,选择上报数据的设备,查看“历史数据”,验证设备数据上报的情况。
图4.3-01 使用端云互通组件的IoT设备数据上报业务流程
图4.3-02 查看数据上报结果
命令下发
命令下发一般分为两种形式:立即下发和缓存下发。
立即下发: IoT平台立即发送收到的命令,如果设备不在线或者设备没收到指令则下发失败。立即下发适合对命令实时性有要求的场景,比如路灯开关灯,燃气表开关阀。使用立即下发时,应用服务器需要自己保证命令下发的时机。
图4.3-03 命令立即下发流程
缓存下发: 平台收到命令后放入队列。在设备上线的时候,平台依次下发命令队列中的命令。缓存下发适合对命令实时性要求不高的场景,比如配置水表的参数。缓存下发平台根据设备的省电模式进行不同处理。
应用服务器向IoT平台下发命令时,携带参数expireTime(简称TTL,表示最大缓存时间)。如果不带expireTime,则默认expireTime为48小时。
expireTime=0:命令立即下发。
expireTime>0:命令缓存下发。
端云互通组件场景命令下发的调测过程,命令下发步骤如下:
(1)登录IoT平台的开发者中心。开发者中心的账号和密码需要向IoT平台服务商申请。
(2)在“设备管理”界面的设备列表中,点击接收命令的设备,点击“调试产品”。在弹出应用模拟器界面中选择“命令发送”,配置下发给设备的命令参数。
图4.3-05 命令下发
在“设备管理”界面的设备列表中,点击接收命令的设备->“历史命令”,查看“状态”栏的显示。
图4.3-06 命令下发状态
状态说明如下:
超期: 表示命令在IoT平台缓存时间超期,未向设备下发。
成功: 表示IoT平台已经将命令下发给设备,且收到设备上报的命令执行结果。
失败: 表示编解码插件解析为空,或执行结果响应里面有“ERROR CODE”等。
超时: 表示IoT平台等待ACK响应超时。
取消: 表示应用侧已经取消命令下发。
等待: 表示命令在IoT平台缓存,还未下发给设备。
已发送: 表示IoT平台已经将命令下发给设备。
已送达: 表示IoT平台已经将命令下发给设备,且收到设备返回的ACK消息。
- 点赞
- 收藏
- 关注作者
评论(0)