主要实现开发者实际的终端设备在 OneNET 平台上的创建、连接和数据交互。在完成用户注册和产品创建后,即可根据相关所创建产品的协议类型选择相应的硬件接入的开发。
接入流程可参见下图:
1、LWM2M 协议 - NB-IoT
测试接入流程分为平台域和设备域,用于进行首次接入体验,以便对平台的功能以及接入协议有大致的了解。
测试流程图: 基于 NB 模组 / SDK 方式接入流程
接入步骤如下:
Step1 创建产品,选择接入协议:
首先需要在平台创建一个 NB-IoT 产品,在设备接入协议选择时选择 LWM2M 协议(因NB-IOT 设备需通过 NB 基站接入平台,创建产品时联网方式请选择“移动蜂窝网络”)。
创建产品后,记录该产品的用户ID。
Step2 创建设备,记录设备ID等信息
创建设备有两种方式:
第一种 可以通过页面点击添加设备,输入设备名称和鉴权信息(即 IMEI、IMSI - 通过 AT 指令可以获取)并记录下该设备编号,参考 Blog 设备接入实例。
第二种 可以通过调用创建设备 API 实现设备的创建,输入设备的设备名、接入协议、鉴权信息以及 MasterKey 等信息,即可在平台上创建设备。
Step3 移植 SDK 或搭载 NB 模组,建立 UDP 连接
结合 NB-IOT 设备的实际接入方式,目前来看主要有两种:
第一种,NB-IOT 设备搭载了已经实现接入 OneNET 平台的 NB 模组,设备通过 NB 模组和 NB 基站以及核心网等网元连接,实现和 OneNET 平台进行交互,完成同 bootstrap 服务器建立 UDP 连接。
具体方式为设备上电后通过发送 AT 指令给模组,同时携带 endpoint name 参数(也即鉴权信息IMEI、IMSI等信息)实现设备和平台之间的 UDP 连接。连接建立成功后,bootstrap 服务器会返回的 LWM2M 接入服务器地址和端口;
已经实现接入 OneNET 平台的 NB 模组部分展示见下表:
厂商名称 | 产品类型 | 产品型号 |
---|---|---|
广和通 | 模组 | N700-CN |
移远 | 模组 | BC95 |
骐俊物联 | 模组 | ML5330 |
SIMCom | 模组 | SIM7000C-N |
新华三 | 模组 | IM2209 |
中兴微电子 | 芯片 | RoseFinch7100 |
高通 | 芯片 | MDM9206 |
MTK | 芯片 | MT2625 |
华为海思 | 芯片 | Boudica120 |
华为海思 | 芯片 | Boudica150 |
第二种,NB-IOT 设备搭载的 NB 模组未实现接入 OneNET 平台,该情况建议有两种方式:
第一种方式开展 NB 模组接入 OneNET 的适配工作;另外一种方式需要用户下载 NB-IOT 的SDK,开展相应的开发工作自行移植至设备的MCU中。
若SDK已成功移植至MCU后,可在MCU中配置好 bootstrap 服务器地址、端口号,以及 endpoint name 参数(也即鉴权信息IMEI、IMSI等信息)信息后,通过SDK实现和 bootstrap 服务器的UDP连接。连接建立成功后,bootstrap 服务器会返回的 LWM2M 接入服务器地址和端口。
bootstrap 服务器域名为:nbiotbt.heclouds.com 端口号为:5683
Step4 建立设备与平台间的协议连接
在Step3中完成设备获取 LWM2M 接入服务器的地址后,设备会自动完成和平台间的协议连接。
Step5 设备资源列表查看
在Step4中完成设备上线后,通过点击最右边的“资源列表”按钮可以进入该设备的资源列表中进行信息查看。设备上线后会上传一个资源列表到平台中,平台可以对这些资源做读、写、执行、订阅等操作。
在资源列表中可以看到设备下的对象名称、实例个数和属性个数。
Step6 设备属性查看,资源数据操作
在Step5中看到设备资源列表后,点击某个具体的对象名称后可以看到具体的对象实例以及该对象实例下的属性值等信息。在该页面上可以实现对具体某个属性的读、写、执行以及查看详情等权限,完成对设备某个具体属性的实际操作。
Step7 结合实际场景开展 NB-IOT 应用 通过Step1-6上述操作,可以实现对具体 NB-IOT 设备的连接、资源列表查看、对象属性的读、写、执行等实际操作等,满足在NB环境下整个NB-IOT应用的开展。
在设备接入OneNET平台之前,设备侧需完成由OneNET平台提供的基础通信套件SDK的移植工作。目前,按SDK集成在终端的方式可将终端分为如下三类:
a、“MCU+NB 通信模组”架构中,SDK 移植到 MCU 中;
b、“MCU+NB 通信模组”架构中,SDK 移植到 NB 通信模组中;
c、“NB 芯片”的 SOC 架构中,SDK 移植到 NB 芯片中。
2、接入实例
基于 M5310 模组实现 NB 设备接入实例 - LWM2M。
2.1、上电初始化
注意:每个 AT 命令之间应该留有一定时间间隔
M5310 | |
---|---|
OK | //开机启动信息 |
AT | //开机之后循环发送AT直到返回OK,证明模块初始化正常 |
OK | |
AT+COPS=1,2,"46000" | //设置手动注册移动运营MNC |
OK | |
AT+NEARFCN=0,3555 | //锁定频点为3555,锁频可以有效减小搜网时间,但是频点设置错误会导 //致搜网失败,建议通常情况下不要设置锁频 |
OK | |
AT+CSCON=1 | //打开信号提示自动上报 |
OK | |
AT+CEREG=1 | //打开注册信息自动上报 |
OK | |
+CSCON:1 | //自动上报的网络信号提示——已连接 |
+CEREG:1,19E6,94,7 | //自动上报的网络注册信息——1-本地网络已注册入网,5-漫游已 //注册,其它情况为注册异常,详细请参考AT命令手册 //如果未使能自动上报,则用户需要使用AT+CEREG?查询注册状态 |
AT+CGDCONT? | |
+CGDCONT:0,"IP", "nbiot.MNC002.MCC460.GPRS",,0,0 |
//查询当前APN,次步骤可省略 |
OK | - |
注:需要确认入网状态为已注册才能进行后续数据收发操作,如果不使用自动上报功能,可使用 AT+CEREG? 命令主动查询当前注册状态直到变为已注册,目前测试开机注册时间范围为 20s-120s
2.2、UDP 数据收发
2.2.1、创建 UDP Socket
AT+NSOCR=
,
,
[,
]
例如:
AT+NSOCR="DGRAM",17,2334,1 | //创建本地UDP监听端口,开启数据到达自动上报 |
---|---|
0 | //创建成功返回socket编号,数值0-6,最多监听7个端口 |
OK | //创建UDP成功 |
2.2.2、发送UDP数据 向目的UDP地址发送数据可使用AT+NSOST或AT+NSOSTF命令,如下, AT+NSOST=
,
,
,
, AT+NSOSTF=
,
,
,
,
, 例如:
AT+NSOST=0,183.230.40.150, 36000,10,30313233343536373839 |
--- |
---|---|
0,10 | //第0号Socket成功发送10 Byte UDP数据 |
OK | |
+NSONMI:0,30 | //第0号Socket接收到30 Bytes数据 |
2.2.3、接收UDP数据 当接收到UDP数据时,可以使用AT+NSORF读取,当读取长度大于实际接收长度时,返回缓冲区实际接收数据长度
AT+NSORF= ,
|
--- | |
---|---|---|
+NSONMI:0,30 | //提示第0号Socket接收到30 Bytes数据 | |
AT+NSORF=0,30 | //读取接收到的30Bytes数据, | |
0,183.230.40.150,36000,30, 5B3131372E3136392E33362E 31353A323137395D30313233343536373839,0 |
//读取到183.230.40.150:36000发过来的30 | Bytes数据 |
注:本示例的测试服务器为中移物联网公司内部测试服务器,会自动回复”[远程IP:端口]接收数据”,只做测试用途,不保证服务器功能。
2.4、关闭UDP
AT+NSOCL='' | //''为2.1创建时系统分配的id |
---|---|
OK | - |
2.3、OneNET 数据收发
2.3.1、OneNET 平台端创建设备
访问 OneNET 门户网站:http://open.iot.10086.cn/ ,创建NB-IOT产品及设备。 创建设备所使用的鉴权信息 imei 及 imsi 需要记录并在终端登录时使用,返回的 device_id 为平台端创建的设备接入标识,如果需要查询设备信息,需要提供设备 id。
2.3.2、设备注册流程
(1)版本统一与创建基础通信套件
AT+MIPLVER? |
---|
+MIPLVER: 版本号 |
OK |
该指令验证终端基础通信套件版本是否符合送测声明,直接在客户端读取通信套件版本信息,并将读取的版本信息与送测时声明的版本对比。 |
AT+MIPLCREATE |
+MIPLCREATE:ref值(通常为0) |
OK |
为基础通信套件添加对象和实例,并从终端侧向OneNet平台侧发起注册过程,注册成功则判定创建通信套件成功。 |
(2)向通信套件添加 objec t组
AT+MIPLADDOBJ=0,3303,2,"11",6,1 |
---|
OK |
AT+MIPLADDOBJ=0,3306,1,"1",5,0 |
OK |
LWM2M 规范定义了每个对象对应客户端的某个特定功能实体 object,instance 代表着这个 object 的不同实例。通过 objectid 和instanceid 可以确认到一个指定的 object 实例;而每个 object 下可以有多个 resource 属性数据。例如:一个设备有芯片温度传感器与外界温度传感器的值须上报,温度传感器便是一种 object 对象,而具体到某个温度传感器则需要 instanceid 来区分;某个温度传感器所对应的单位、温度等数值可视为其 resource 属性,具体的编码规范可参照IPSO规范或OMA模型规范http://www.openmobilealliance.org/wp/OMNA/LwM2M/LwM2MRegistry.html 。
终端侧向 OneNet 平台侧注册,检查 OneNet 平台侧下发的 discover 请求,discover 请求中包含 3303、3306 则判定添加成功。
(3)发起注册请求
A、注册操作
设备发送注册请求到平台侧,平台侧接收到设备发送的注册信息,在平台侧检查设备注册情况。
AT+MIPLOPEN=0,3600,30
OK
+MIPLEVENT: 0,6
+MIPLDISCOVER:0,msgid,3303
+MIPLDISCOVER:0,msgid,3306
+MIPLOBSERVE:0,msgid,1,3303,0,-1
+MIPLOBSERVE:0,msgid,1,3303,1,-1
+MIPLOBSERVE:0,msgid,1,3306,0,-1
在OneNet平台侧(http://api.heclouds.com)查看终端在线状态(图标为绿色),终端在线则判定设备注册成功。
控制平台下判断注册操作的API报文示例
GET http://api.heclouds.com/devices/status?imei=<终端设备IMEI>&devIds=
B、无参数更新注册
AT+MIPLUPDATE=0,0,0 OK +MIPLEVENT:0,11 终端侧在本次lifetime周期之内发送不携带参数的更新注册信息到平台侧,平台侧对该更新注册信息回应,确认检查终端侧是否收到平台侧的回应。
C、参数变动更新注册 AT+MIPLUPDATE=0,3600,1 OK +MIPLEVENT:0,11 终端侧在本次lifetime周期之内发送携带参数的更新注册信息到平台侧,平台侧对该更新注册信息回应确认,检查终端侧是否收到平台侧的回应。
用户上报数据
AT+MIPLNOTIFY=0,msgid1,3303,0,5700,4,4,98,0,0
OK
AT+MIPLNOTIFY=0,msgid2,3303,0,5601,4,4,88,0,0
OK
在OneNet平台侧查看终端上报最新数据和历史数据,数据完整且正确则判定成功。
控制平台下判断注销操作的API报文示例
GET http://api.heclouds.com/devices/设备ID/datapoints?imei=<终端设备IMEI>
HTTP/1.1
Host: api.heclouds.com/
api-key: OneNet分配的api-key
Content-Length: 0
终端侧预期回复:
{"errno":0,"data":{5700和5601最新数据},"error":"succ"}
2.3.4、设备 Bootstrap 流程
在设备已初始化且基础通信套件(配置信息包含Bootstrap服务器地址coap://183.230.40.39:5683)已创建成功且基础通信套件已添加对象和实例(3303、3306)且Bootstrap服务器就绪条件下,客户端向平台侧发起注册以触发Bootstrap过程并检查Bootstrap过程是否成功。
AT+MIPLOPEN=0,3600,30
OK
+MIPLEVENT: 0,1
+MIPLEVENT: 0,2
+MIPLEVENT: 0,6
+MIPLDISCOVER:0,msgid,3303
+MIPLDISCOVER:0,msgid,3306
+MIPLOBSERVE:0,msgid,1,3303,0,-1
+MIPLOBSERVE:0,msgid,1,3303,1,-1
+MIPLOBSERVE:0,msgid,1,3306,0,-1
在OneNet平台侧(http://api.heclouds.com)查看终端在线状态(图标为绿色),终端在线则判定Bootstrap过程成功。
控制平台下判断Bootstrap操作的API报文示例
GET http://api.heclouds.com/devices/status?imei=<终端设备IMEI>&devIds=
Host: api.heclouds.com/
api-key: OneNet分配的api-key
Content-Length: 0
终端侧预期回复:online : true
2.3.5、设备管理流程
设备管理目前版本提供6操作:discover、read、write、execute、write-attributes、observe、
MCU应在执行平台下发的规定操作后数秒内(建议3s)上报对应操作结果,否则传输信息可能丢失。
(1) discover操作
设备发送注册请求到平台侧,检查设备接收到的平台侧信息中的Discover请求信息,并回应Discover请求,在平台侧检查设备资源情况。
AT+MIPLOPEN=0,3600,30
OK
+MIPLEVENT: 0,6
+MIPLDISCOVER:0,msgid1,3303
+MIPLDISCOVER:0,msgid2,3306
+MIPLOBSERVE:0,msgid3,1,3303,0,-1
+MIPLOBSERVE:0,msgid4,1,3303,1,-1
+MIPLOBSERVE:0,msgid5,1,3306,0,-1
AT+MIPLDISCOVERRSP=0,msgid1,1,34,"5700;5701;5601;5602;5603;5604;5605"
AT+MIPLDISCOVERRSP=0,msgid2,1,24,"5850;5851;5852;5853;5750"
OK
在OneNet平台侧查看终端资源列表,完整显示终端设备的实例和资源信息则判定成功。
控制平台下获取discover状态的API报文示例:
GET http://api.heclouds.com/nbiot/resources?imei=<终端设备IMEI>&obj_id=3303&obj_inst_id=0 HTTP/1.1
Host: api.heclouds.com/
api-key: OneNet分配的api-key
Content-Length: 0
预期结果:
终端设备的完整对象、实例、资源列表信息。
(2) read操作
A、读取 resource 请求
平台侧向设备发送指定资源的 Read 操作请求,设备收到消息后,终端通信套件获取设备的资源值信息返回给平台侧,在平台侧检查读取结果。
AT+MIPLREADRSP=0,msgid,1,3303,0,5700,4,4,20.123,0,0
OK
OneNet平台侧预期结果:
{"errno":0,"data":[{"res":[{"val":20.123,"res_id":5700}],"obj_inst_id":0}],"error":"succ"}
控制平台下读操作的API报文示例:
GET http://api.heclouds.com/nbiot?imei=<终端设备IMEI>&obj_id=3303&obj_inst_id=0&res_id=5700 HTTP/1.1
Host: api.heclouds.com/
api-key: OneNet分配的api-key
Content-Length: 0
终端侧预期回复:
+MIPLREAD:0,msgid,3303,0,5700
B、读取 instance 请求
平台侧向设备发送指定实例的Read操作请求,设备收到消息后,终端通信套件获取设备的实例资源信息返回给平台侧,在平台侧检查读取结果。
AT+MIPLREADRSP=0,msgid,1,3303,0,5700,4,4,20.123,5,0
AT+MIPLREADRSP=0,msgid,1,3303,0,5701,1,3, "Cel",4,0
AT+MIPLREADRSP=0,msgid,1,3303,0,5601,4,4,10.123,3,0
AT+MIPLREADRSP=0,msgid,1,3303,0,5602,4,4,60.2,2,0
AT+MIPLREADRSP=0,msgid,1,3303,0,5603,4,4,0.0,1,0
AT+MIPLREADRSP=0,msgid,1,3303,0,5604,4,4,99.0,0,0
OK
OK
OneNet平台侧预期结果:
{"errno":0,"data":[{"res":[{"val":20.123,"res_id":5700},{"val":"Cel","res_id":5701},{"val":10.123,"res_id":5601},{"val":60.2,"res_id":5602},{"val":0.0,"res_id":5603},{"val":99.0,"res_id":5604}],"obj_inst_id":0}],"error":"succ"}
控制平台下读操作的API报文示例:
GET http://api.heclouds.com/nbiot?imei=<终端设备IMEI>&obj_id=3303&obj_inst_id=0 HTTP/1.1
Host: api.heclouds.com/
api-key: OneNet分配的api-key
Content-Length: 0
终端侧预期回复:
+MIPLREAD:0,msgid,3303,0,-1
C、读取 object 请求
平台侧向设备发送指定对象的 Read 操作请求,设备收到消息后,终端通信套件获取设备的对象实例资源信息返回给平台侧,在平台侧检查读取结果。
AT+MIPLREADRSP=0,msgid,1,3303,0,5701,1,3, "Cel",3,0
AT+MIPLREADRSP=0,msgid,1,3303,0,5602,4,4,50.123,2,0
AT+MIPLREADRSP=0,msgid,1,3303,1,5701,1,3, "Cel",1,0
AT+MIPLREADRSP=0,msgid,1,3303,1,5602,4,4,55.123,0,0
OK
OK
OK
OK
OneNET平台侧预期结果:
{"errno":0,"data":[{"res":[{"val":"Cel","res_id":5701},{"val":50.123,"res_id":5602}],"obj_inst_id":0},{"res":[{"val":"Cel","res_id":5701},{"val":55.123,"res_id":5602}],"obj_inst_id":1}],"error":"succ"}
控制平台下读操作的API报文示例:
GET http://api.heclouds.com/nbiot?imei=<终端设备IMEI>&obj_id=3303 HTTP/1.1
Host: api.heclouds.com/
api-key: OneNet分配的api-key
Content-Length: 0
终端侧预期回复:
+MIPLREAD:0,msgid,3303,-1,-1
资源读取API报文协议如下:
操作 | Read(资源读取) |
---|---|
lwm2m-URI | address /{Object ID}/{Object Instance ID}/{Resource ID} |
参数说明 | { Object ID }:必选,如设备上的传感器类型; { Object Instance ID }:可选,该类型传感器的编号; {Resource ID}:可选,该传感器的某种类型的数据,如温度的当前值,最大值等 |
CoAP-Method | GET |
CoAP-Option Option | 1:Uri-Path(11):{Object ID} Option 2:Uri-Path(11):{Object Instance ID} Option 3:Uri-Path(11):{Resource ID} Option 4:Accept(17): 第1节中的Content Format表中的类型,如application/vnd.oma.lwm2m+tlv这个参数是指明读取数据的格式。 |
CoAP-payload | - |
Success | 2.05 Content |
Failure | 4.00 Bad Request, 4.01 Unauthorized, 4.04 Not Found, 4.05 Method Not Allowed |
注:每次read操作后模块响应上报COAP报文长度应小于512Bytes。
(3) write操作
A、写入 source 请求
平台侧向设备发送指定资源的Write操作请求,设备收到消息后,终端通信套件将指定值写入指定资源,在终端侧检查写入结果。
AT+MIPLWRITERSP=0,msgid,2
OK
OneNet平台侧预期结果:
{"errno":0,"error":"succ"}
控制平台下写操作的API报文示例:
POST http:// /api.heclouds.com/nbiot?imei=<终端设备IMEI>&obj_id=3306&obj_inst_id=0&mode=2 HTTP/1.1 Host: api.heclouds.com/ api-key: OneNet分配的api-key Content-Length: 47 //数值根据HTTP报文实际body大小修改 Content-Type:application/json HTTP内容:{"data":[{"res_id":5850,"val":1}]} 终端侧预期回复: +MIPLWRITE:0,msgid,3306,0,5850,2,1,01,0,0
B、写入 instance 请求
平台侧向设备发送指定实例的Write操作请求,设备收到消息后,终端通信套件将指定值写入指定实例下的资源,在终端侧检查写入结果。
AT+MIPLWRITERSP=0,msgid,2
OK
OneNet平台侧预期结果:{"errno":0,"error":"succ"}
控制平台下写操作的 API 报文示例:
POST http:// /api.heclouds.com/nbiot?imei=<终端设备IMEI>&obj_id=3306&obj_inst_id=0&mode=2 HTTP/1.1
Host: api.heclouds.com/
api-key: OneNet分配的api-key
Content-Length: 47 //数值根据HTTP报文实际body大小修改
Content-Type:application/json
HTTP内容:{"data":[{"res_id":5850,"val":1},{"res_id":5851,"val":22}]}
终端侧预期回复:
+MIPLWRITE:0,msgid,3306,0,5850,2,1,01,0,1
+MIPLWRITE:0,msgid,3306,0,5851,2,1,16,0,0
资源写入API报文协议如下:
操作 | Write(资源写入) |
---|---|
lwm2m-URI | address /{Object ID}/{Object Instance ID}/{Resource ID}/{NewValue} |
参数说明 { Object ID }:必选,如设备上的传感器类型; | { Object Instance ID }:必选,该类型传感器的编号; {Resource ID}:必选,该传感器的某种类型的数据,如温度的当前值,最大值等; {NewValue}:必选,写入的资源属性值。 |
CoAP-Method PUT/POST | CoAP-Option Option 1:Uri-Path(11):{Object ID} Option 2:Uri-Path(11):{Object Instance ID} Option 3:Uri-Path(11):{Resource ID} Option 4:Content-Format(12):格式为Content Format表中的几种格式, 如application/vnd.oma.lwm2m+tlv |
CoAP-payload | {NewValue},数据格式为Option4中指定的数据格式 |
Success | 2.04 Changed |
Failure | 4.00 Bad Request, 4.01 Unauthorized, 4.04 Not Found, 4.05 Method Not Allowed |
注:每次write操作下发COAP报文长度应小于512Bytes,故下发数据段长度最大480Bytes。
(4) execute 操作
平台侧向设备发送指定资源的Exec操作请求,设备收到消息后,终端通信套件将操作值写入指定资源,在终端侧检查执行结果。
AT+MIPLEXECUTERSP=0,msgid,2
OK
OneNet平台侧预期结果:{"errno":0,"error":"succ"}
控制平台下发 execute 消息的 API 报文示例:
POST http://api.heclouds.com/nbiot/execute? imei=<终端设备IMEI>&obj_id=3303&obj_inst_id=0&res_id=5605 HTTP/1.1
api-key:OneNet分配的api-key
Host: api.heclouds.com
Content-Length: 21 //数值根据HTTP报文实际body大小修改
Content-Type:application/json
HTTP内容:{"args":"reset"}
终端侧预期回复:
+MIPLEXECUTE:0,msgid,3303,0,5605,5, "reset"
资源执行API报文协议如下:
操作 | Execute(资源执行) |
---|---|
lwm2m-URI | address /{Object ID}/{Object Instance ID}/{Resource ID}/{Arguments} |
参数说明 | { Object ID }:必选,如设备上的传感器类型; { Object Instance ID }:必选,该类型传感器的编号; {Resource ID}:必选,该传感器的某种类型的数据,如温度的当前值,最大值等; {Arguments}:可选,待执行的命令,如重启,关机等。 |
CoAP-Method | POST |
CoAP-Option | Option 1:Uri-Path(11):{Object ID} Option 2:Uri-Path(11):{Object Instance ID} Option 3:Uri-Path(11):{Resource ID} |
CoAP-payload | {Arguments},格式为Content Format表中的text/plain格式 |
Success | 2.05 Changed |
Failure | 4.00 Bad Request, 4.01 Unauthorized, 4.04 Not Found, 4.05 Method Not Allowed |
注:每次execute操作下发COAP报文长度应小于512Bytes,故下发数据段长度最大480Bytes。
(5) Write-Attributes操作
平台侧向设备发送指定资源的Write-Attributes操作请求,设备收到消息后,终端通信套件将属性值写入指定资源,在终端侧检查执行结果。
AT+MIPLPARAMETERRSP=0,msgid1,2
AT+MIPLPARAMETERRSP=0,msgid2,2
OK
OK
OneNet平台侧预期结果:{"errno":0,"error":"succ"} {"errno":0,"error":"succ"}
控制平台下发Write-Attributes消息的API报文示例:
POST http://api.heclouds.com/nbiot/observe? imei=<终端设备IMEI>&cancel=false&obj_id=3303&obj_inst_id=0&res_id=5700&pmin=15&pmax=60>=50<=0&st=2 HTTP/1.1
POST http://api.heclouds.com/nbiot/observe? imei=<终端设备IMEI>&cancel=false&obj_id=3303&obj_inst_id=0&res_id=5601&pmin=18&pmax=90>=60<=0&st=2 HTTP/1.1
api-key:OneNet分配的api-key
Host: api.heclouds.com
Content-Length: 21 //数值根据HTTP报文实际body大小修改
Content-Type:application/json
{"args": " reset "}
终端侧预期回复:
+MIPLPARAMETER:0,msgid1,3303,0,5700,37,"pmin=15;pmax=60;lt=0.0;gt=50.0;st=2.0"
+MIPLPARAMETER:0,msgid2,3303,0,5601,37,"pmin=18;pmax=90;lt=0.0;gt=60.0;st=2.0"
(6) Observe操作
A、观察resource请求
平台侧向设备发送指定资源的Observe操作请求,设备收到消息后,终端通信套件订阅指定资源,在终端侧检查执行结果。
AT+MIPLPARAMETERRSP=0,msgid1,2
AT+MIPLPARAMETERRSP=0,msgid2,2
OK
OK
+MIPLOBSERVE:0,msgid3,1,3303,0,5700
+MIPLOBSERVE:0,msgid4,1,3303,0,5601
AT+MIPLOBSERVERSP=0,msgid3,1
AT+MIPLOBSERVERSP=0,msgid4,1
OK
OK
OneNet平台侧预期结果:
{"errno":0,"error":"succ"}
{"errno":0,"error":"succ"}
控制平台下观察操作的API报文示例:
GET http://api.heclouds.com/nbiot/observe?imei=<终端设备IMEI>&cancel=false&obj_id=3303&obj_inst_id=0&res_id=5700&pmin=15&pmax=60>=50<=0&st=2 HTTP/1.1
GET http://api.heclouds.com/nbiot/observe?imei=<终端设备IMEI>&cancel=false&obj_id=3303&obj_inst_id=0&res_id=5601&pmin=18&pmax=90>=60<=0&st=2 HTTP/1.1
api-key:OneNet分配的api-key
Host: api.heclouds.com
Content-Length: 21 //数值根据HTTP报文实际body大小修改
Content-Type:application/json
终端侧预期回复:
+MIPLPARAMETER:0,msgid1,3303,0,5700,37,"pmin=15;pmax=60;lt=0.0;gt=50.0;st=2.0"
+MIPLPARAMETER:0,msgid2,3303,0,5601,37,"pmin=18;pmax=90;lt=0.0;gt=60.0;st=2.0"
B、观察instance请求
平台侧向设备发送指定实例的Observe操作请求,设备收到消息后,终端通信套件订阅指定实例,在终端侧检查执行结果。
AT+MIPLOBSERVERSP=0,msgid,1
OK
OneNet平台侧预期结果:
{"errno":0,"error":"succ"}
控制平台下观察操作的API报文示例:
GET http://api.heclouds.com/nbiot/observe?imei=<终端设备IMEI>&cancel=false&obj_id=3303&obj_inst_id=0 HTTP/1.1
api-key:OneNet分配的api-key
Host: api.heclouds.com
Content-Length: 21 //数值根据HTTP报文实际body大小修改
Content-Type:application/json
终端侧预期回复:
+MIPLOBSERVE:0,msgid,1,3303,0,-1
C、观察object请求
平台侧向设备发送指定对象的Observe操作请求,设备收到消息后,终端通信套件订阅指定对象,在终端侧检查执行结果。
AT+MIPLOBSERVERSP=0,msgid,1
OK
OneNet平台侧预期结果:
{"errno":0,"error":"succ"}
控制平台下观察操作的API报文示例:
GET http://api.heclouds.com/nbiot/observe?imei=<终端设备IMEI>&cancel=false&obj_id=3303 HTTP/1.1
api-key:OneNet分配的api-key
Host: api.heclouds.com
Content-Length: 21 //数值根据HTTP报文实际body大小修改
Content-Type:application/json
终端侧预期回复:
+MIPLOBSERVE:0,msgid,1,3303,-1,-1
D、取消观察resource请求
平台侧向设备发送指定资源的取消观察的操作请求,设备收到消息后,终端通信套件取消订阅指定资源,在终端侧检查执行结果。
AT+MIPLOBSERVERSP=0,msgid,1
OK
OneNet平台侧预期结果:
{"errno":0,"error":"succ"}
控制平台下取消观察操作的API报文示例:
GET http://api.heclouds.com/nbiot/observe?imei=<终端设备IMEI>&cancel=true&obj_id=3303&obj_inst_id=0&res_id=5700 HTTP/1.1
api-key:OneNet分配的api-key
Host: api.heclouds.com
Content-Length: 21 //数值根据HTTP报文实际body大小修改
Content-Type:application/json
终端侧预期回复:
+MIPLOBSERVE:0,msgid,0,3303,0,5700
E、取消观察instance请求
平台侧向设备发送指定实例的取消观察的操作请求,设备收到消息后,终端通信套件取消订阅指定实例,在终端侧检查执行结果。
AT+MIPLOBSERVERSP=0,msgid,1
OK
OneNet平台侧预期结果:
{"errno":0,"error":"succ"}
控制平台下取消观察操作的API报文示例:
GET http://api.heclouds.com/nbiot/observe?imei=<终端设备IMEI>&cancel=true&obj_id=3303&obj_inst_id=0 HTTP/1.1
api-key:OneNet分配的api-key
Host: api.heclouds.com
Content-Length: 21 //数值根据HTTP报文实际body大小修改
Content-Type:application/json
终端侧预期回复:
+MIPLOBSERVE:0,msgid,0,3303,0,-1
F、取消观察odject请求
平台侧向设备发送指定对象的取消观察的操作请求,设备收到消息后,终端通信套件取消订阅指定对象,在终端侧检查执行结果。
AT+MIPLOBSERVERSP=0,msgid,1
OK
OneNet平台侧预期结果:
{"errno":0,"error":"succ"}
控制平台下取消观察操作的API报文示例:
GET http://api.heclouds.com/nbiot/observe?imei=<终端设备IMEI>&cancel=true&obj_id=3303 HTTP/1.1
api-key:OneNet分配的api-key
Host: api.heclouds.com
Content-Length: 21 //数值根据HTTP报文实际body大小修改
Content-Type:application/json
终端侧预期回复:
+MIPLOBSERVE:0,msgid,0,3303,-1,-1
2.3.6、设备注销流程
AT+MIPLCLOSE=0
OK
在OneNet平台侧查看终端离线状态(图标为灰色),终端离线则判定注销成功。
AT+MIPLDELETE=0(ref值通常为0)
OK
终端侧向OneNet平台侧发起注册过程,注册失败则判定删除通信套件成功。
AT+MIPLDELOBJ=0,3306
OK
终端侧向OneNet平台侧注销后再次注册,检查OneNet平台侧下发的discover请求,discover请求中不包含3306则判定对象3306删除成功
控制平台下判断注销操作的API报文示例
GET http://api.heclouds.com/devices/status?imei=<终端设备IMEI>&devIds=
Host: api.heclouds.com/
api-key: OneNet分配的api-key
Content-Length: 0
终端侧预期回复:
online : false
注:用户亦可在向平台发送注销请求后执行销毁实例,此时模组会自动删除所有object。
用户亦可直接执行销毁实例,模组将会在向平台提出注销请求后删除object再销毁Object以及通信实例。
基于 MCU 实现 NB 设备接入实例 - LWM2M
基于MCU的方式实现NB设备接入,即通过移植 SDK 至设备 MCU 中,通过 MCU 和模组进行交互实现连接到 OneNET 平台。该情况适用于实验阶段或是终端设备对接入 OneNET 平台有较紧急意愿,但设备所用模组暂未支持接入 OneNET 的情况下。
具体的接入实例及步骤见下:
(1)首先需要完成对 SDK 的移植操作,实现把SDK植入所需连接到OneNET的MCU芯片中;
(2)网络配置。在连接 OneNET 平台之前需要对设备侧进行网络配置:
包括接入机的地址和鉴权信息等参数(即IMEI、IMSI)。
同时还需要对设备和平台所交互的资源进行资源配置,在设备端的SDK中,设备上所有与onenet进行交互的数据变量都需要表示为资源,比如温湿度传感器的温度和湿度分别可以表示为2个资源,配置好资源属性后,设备在向服务器注册的过程中会携带相应的资源列表 , 服务器端会主动向设备订阅(Observe)资源列表中所有资源。
属性 | 描述 |
---|---|
objid | 描述了设备上的传感器类型 |
instid | 描述了该类型传感器的编号 |
resid | 描述传感器的某种类型的数据,如温度的当前值,最大值,最小值 |
flag | 该资源的可操作性,支持的类型有可读/可写/可执行 |
type | 该资源的数据类型,支持的类型有bool/int/float/string/bin |
write | 用户写该资源的钩子函数 |
execute | 用户执行该资源的钩子函数 |
注意:objid和resid是不能够随意定义的,必须遵守《IPSO-Smart-Objects-Expansion-Pack》文档中的规定
配置示例:
(3)心跳设置。设备端的SDK在初始化的时候会设置lifetime的值,并在向服务器注册的时候上传该值,SDK在到期后会主动向服务器发送Update消息,如服务器端未收到Update消息,服务器端将抛弃所有上报的Notify消息并向该设备发送RST消息。
(4)数据发送。如果有资源的值被更新了,需要调用nbiot_device_notify通知SDK该资源的值发生了变化,由SDK择机上传至onenet。
(5)下行处理。 命令由第三方应用发送至onenet,并由云平台转发至终端设备,读写命令和执行命令均直接发送至终端,SDK会自动调用该命令对应的资源中的write钩子函数或者execute钩子函数,用户只需要编写该两个函数即可以完成下行命令的处理。