OneNET NB-IoT物联网套件(现接入协议LwM2M数据协议IPSO)提供了一种方便用户使用NB模组将设备连接到OneNET平台实现丰富NB-IoT应用的能力。平台侧可实现与中国移动NB-IoT网络无缝对接,满足高并发大量设备的快速入云需求,同时实现对设备进行资源订阅、存储、转发和命令下发等功能。
本文通过对MN316 SDK中的OneNET demo代码进行解析,介绍如何使用MN316连接至OneNET NB-IoT物联网套件。
一、OneNET使用流程解析
以下流程图为使用MN316 OpenCPU SDK OneNET功能时的常见流程介绍。
图1 OneNET连接使用流程
图1介绍了使用OneNET连接的使用流程,可结合MN316_OpenCPU(R14)_Standard_X.X.X.XXXXXX_release\examples\onenet cm_demo_onenet.c中的demo示例程序加深理解。
OneNET功能包含的全部函数接口详细定义可在include\cmiot\cm_onenet.h中查看
二、OneNET连接demo代码解析
SDK中有一个OneNET连接常规使用方法的demo程序,可在cm_demo_onenet.c文件中查看,下面我们详细看一下。
2.1 初始化OneNET任务
图2 初始化OneNET任务
第一步初始化OneNET任务(cm_OneNET_init):需在使用OneNET相关函数之前调用。
2.2 设置回调函数
图3 设置回调函数
第二步使用cm_cot_cb_t结构体定义回调函数,如图3所示。
cm_cot_cb_t中设置的回调参数有:
①cot_read_cb_t:读回调,平台下发Read请求时触发;
②cot_write_cb_t: 写回调,平台下发Write请求时触发;
③cot_execute_cb_t:执行回调,平台下发Exec请求时触发;
④cot_observe_cb_t:订阅回调,平台下发订阅请求时触发;
⑤cot_params_cb_t:策略参数回调,平台下发策略时触发;
⑥cot_event_cb_t:事件状态通知;
⑦cot_notify_cb_t:Notify通知;
⑧cot_discover_cb_t:平台下发Discover请求时触发。
2.3 创建cot设备
图4 创建设备
第三步使用cm_onenet_create()函数设置OneNET平台接入参数,创建设备,如图4所示,此函数有3个参数如下:
①第一个参数IP:需注册的OneNET平台服务器IP或域名;
②第二个参数is_bs:是否bootstrap服务器;
③第三个参数是cot_cb:需注册的回调函数;
2.4 添加object
图5 添加object
第四步使用cm_onenet_add_obj()函数添加object,如图5所示,此函数有5个参数如下:
①第一个参数objid是object id(本次需添加的object);
②第二个参数 inscount是设置该object对象的instance个数;
③第三个参数为bitmap是实例位图,字符串格式(每一个字符表示为一个实例,其 中1表示可用,0表示不可用);
④第四个参数为attcount是属性个数,当前版本暂不使用,置0即可;
⑤第五个参数为actcount是操作个数,当前版本暂不使用,置0即可。
2.5 添加object的资源列表
图6 mqtt连接
第五步使用cm_onenet_discover()函数添加资源列表(resource),如图6所示,此函数有3个参数如下:
①第一个参数objid是需discover操作的对象ID;
②第二个参数 len是data的长度;
③第三个参数为data是object的resource要求(多个resource之间使用分号";"隔开,例如"1101;1102;1103")。
2.6 订阅主题向OneNET平台发起注册请求
图7向OneNET平台发起注册请求
第六步使用cm_onenet_open()函数向平台发起注册请求,如图7所示,此函数有2个参数如下:
①第一个参数timeout是本次注册的超时时长,单位为s,超时后将关闭当前操作, 并上报(不可为0);
②第二个参数lifetime是本次注册成功后生命周期,单位为s。(生命周期超时后 如未及时update将注销当前连接,并上报消息给模组)。
2.7 判断注册请求是否成功
第七步判断注册回调函数的事件,可判断CM_CIS_EVENT_BOOTSTRAP_SUCCESS表示Bootstrap 流程成功、CM_CIS_EVENT_REG_SUCCESS注册 OneNET 平台成功等上报类型,如图8所示。
图8 状态事件上报类型
可参考demo进行判断,如图9所示。
图9 状态事件上报判断
2.8 发送数据至OneNET
当第八步使用cm_onenet_notify()函数发送数据,如图10所示,此函数有8个参数:
图10 发送数据至OneNET
①objid:object id(本次需上报数据的对象ID)
②insid:instance id(本次需上报数据的实例ID)
③resid:resource id(本次需上报数据的资源ID)
④type:发送的数据类型:1-string-字符串、2-opaque-不透明、3- integer-整形、4-float-浮点型、5-bool-布尔型,其中不透明类型为十六进制字符串直接上报
⑤value:发送的数据
⑥flag:消息标识(0:该Notify消息暂不上报,1:上报未上报的Notify消息(同一instance下))
⑦ack_id:指定该消息是否以响应形式上报(-1:非响应模式, >=0:响应模式;如果为响应模式,该条Notify消息成功时将被cot_notify_cb_t回调,该ack_id应该为不同的值)
⑧mode:是否使用RAI功能,当前暂不提供该功能
2.9 接收OneNET平台下发数据
当第九步接收平台下发数据,将在读、写、执行回调函数中进行打印输出,如图11所示。
图11接收下行数据
2.10 对读、写和执行操作进行回复
(1)通过cm_onenet_read()函数进行读回复,如图12所示,该函数有7个参数:
①mid:收到的+MIPLREAD的消息携带的mid;
②objid:object id,本次需回复数据的对象ID;
③insid:instance id,本次需回复数据的实例ID;
④resid:resource id,本次需回复数据的资源ID;
⑤type:回复的数据类型:1-string-字符串、2-opaque-不透明、3- integer-整形、4-float-浮点型、5-bool-布尔型,其中不透明类型为十六进制字符串直接上报;
⑥value:回复的数据;
⑦flag:消息标识 0:该read回复暂不回复 1:回复未回复的read消息(同一instance下)。
图12 读回复
(2)通过cm_onenet_result()函数进行写和执行回复,如图13所示,该函数有3个参数:
①mid:收到的操作消息携带的mid;
②result:操作结果返回;
③is_observe:是否是MIPLOBSERVE操作。
图13写和执行回复
2.11 断开连接
(1)通过cm_onenet_close()函数断开连接;cm_onenet_del_obj()函数释放obj订阅的资源,如图14所示。
图14断开连接
cm_onenet_close()函数有1个参数,如图15所示。
①Level:2(注销与OneNET连接,清除resource数据);4(关闭与OneNET连接,清除所有resource、instance、object数据)。
图15 level值
三、OneNET连接使用流程示例
下面我们使用MN316 OpenCPU SDK提供的 OneNET接口进行平台连接和数据收发,整体程序流程与第二章MQTT demo代码几乎一致,为避免重复,我们只解析与第二章存在差异的部分,以下为完整步骤及程序流程解析。
3.1 平台侧创建LWM2M产品及设备
首先,登录OneNET平台https://open.iot.10086.cn/,进入首页右上角“开发者中心”,点击左上角“全部产品服务”-“基础服务”-“物联网开放平台”,进入页面后点击产品开发,然后开始创建产品,添加设备,完成以上步骤后即可继续在SDK继续以下操作
3.2 修改服务器地址为LWM2M服务器接入地址
“OneNET平台-OneNET LWM2M接入”的地址为183.230.40.39,若要接入其他省级平台需更换为对应接入地址;端口为5683。
3.3 登录平台并上传数据
输入CM:OneNET:CHECKIN登录OneNET平台,并上行数据。
图16 登录OneNET平台,并上行数据
3.4 接收下行数据
OneNET平台下发数据,模组回调函数打印相关信息。
图17 接收下行消息
3.5 注销平台
输入CM:OneNET:CHECKOUT,注销OneNET平台。
图18 注销ONENET平台
四、常见问题
设备登录OneNET平台需要先在平台创建产品和创建设备,可参考阅读以下链接进行相关操作:
https://open.iot.10086.cn/doc/v5/develop/detail/115 OneNET - 中国移动物联网开放平台