BC26通过LWM2M协议连接ONENET,AT流程,STM32代码
Posted qlexcel
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BC26通过LWM2M协议连接ONENET,AT流程,STM32代码相关的知识,希望对你有一定的参考价值。
onenet平台操作
登录onenet后,进入控制台
选择NB-IoT物联网套件
新建产品
产品名字、类别根据自己情况填,协议选择LWM2M
产品新建成功
点击产品名字,进入产品详情
给产品添加设备
填入设备信息
打开自动发现资源
Object、Instance、Resource
onenet采用了《IPSO-Smart-Objects-1.0.pdf》中规定的Object、Instance、Resource来定义控制对象,因此有必要先把他们的概念说清楚。
- Object(对象):表示某类传感器类型。
- Instance(实例):同一类传感器的数量。
- Resource(属性或资源):传感器某些特性描述。
举个例子来说,房间里的温度传感器、湿度传感器、灯、空调就是Object;如果要接入的灯只有一个,那么Instance就为1,如果要接入的灯有两个,那么Instance就为2;灯有开/关、亮度、颜色等属性,他们就是Resource。
打开手册《IPSO-Smart-Objects-1.0.pdf》看,也的确是这个样子的,比如Object有:
基本每种物联网设备,手册中都有定义,都有对应的Object ID。拿灯来说,他的Object ID=3311,他的Resource有:
Resource有开关状态、亮度、颜色等,每种Resource都有Resource ID、是否可读写、取值范围等。
最后再给个图:
模组端操作
1、查询模组IP地址,确定模组网络没问题
发送指令
AT+CGPADDR=1
接收到模组的IP地址说明正常,如果模组没有IP,则需要排查卡和网络问题。
+CGPADDR: 1,100.97.92.190
OK
2、创建Instance(实例)
假如我们要接入多个灯,那么要为每个灯都创建Instance,每个灯和它的Instance ID一一对应。这里就是为接入设备创建Instance,并且获取到它的Instance ID。
发送指令
AT+MIPLCREATE
接收到模组响应
+MIPLCREATE: 0
OK
响应解释为:
+MIPLCREATE: <ref>
<ref> 整型。 OneNET 通信套件的实例ID; 范围: 0-65535。
3、添加Object(对象)
指令为:
AT+MIPLADDOBJ=<ref>,<objId>,<insCount>,<insBitmap>,<attrCount>,<actCount>
<ref> 整型。 OneNET通信套件的实例ID; 范围:0-65535。
<objId> 整型。 LwM2M对象ID。若对象ID不存在,则返回错误。
<insCount> 整型。 实例个数。
<insBitmap> 带双引号的字符串类型。 实例位图。 例如,若 <insCount> 值为4 、<insBitmap>="1101",则表示实例ID 0、 2、 3 将被注册,而实例ID 1 不会被注册。
<attrCount> 整型。 属性个数,表示可读和/或可写资源的个数。
<actCount> 整型。 动作个数,表示可执行的资源个数。
这里就以前面的灯为例,Object ID=3311。创建2个Instance,但是只注册Instance ID=0的Instance。因此发送指令
AT+MIPLADDOBJ=0,3311,2,"01",4,2
接收到模组响应
OK
4、向OneNET发送注册请求
指令为:
AT+MIPLOPEN=<ref>,<lifetime>
<ref> 整型。 OneNET 通信套件的实例 ID;范围: 0-65535。
<lifetime> 整型。用于设置设备的使用期限, 实际使用期限为<lifetime>×0.9。 单位:秒。
0 3600 秒
15-268435455
发送指令为:
AT+MIPLOPEN=0,86400
接收到模组响应
OK
+MIPLEVENT: 0,1
+MIPLEVENT: 0,2
+MIPLEVENT: 0,4
+MIPLEVENT: 0,6
+MIPLOBSERVE: 0,119350,1,3311,0,-1
响应解释为:
+MIPLEVENT: <ref>,<evtid>[,<extend>[,<ackid>]]
<ref> 整型。 OneNET 通信套件的实例 ID;范围: 0-65535。
<evtid> 整型。 事件标识符:
1 EVENT_BOOTSTRAP_START
2 EVENT_BOOTSTRAP_SUCCESS
3 EVENT_BOOTSTRAP_FAILED
4 EVENT_CONNECT_SUCCESS
5 EVENT_CONNECT_FAILED
6 EVENT_REG_SUCCESS
+MIPLOBSERVE: <ref>,<msgId>,<flag>,<objId>,<insId>,<resId>
<ref> 整型。 OneNET 通信套件的实例 ID;范围: 0-65535。
<msgId> 整型。 数据包消息 ID。
<flag> 整型。 表示是否订阅
0 取消订阅
1 订阅
<objId> 整型。 从 OneNET 或者应用服务器处接收到的 LwM2M 对象 ID。
<insId> 整型。 从 OneNET 或者应用服务器处接收到的实例 ID。 -1 表示订阅或者取消订阅指定 LwM2M 对象下所有实例下的所有资源。
<resId> 整型。 从 OneNET 或者应用服务器处接收到的资源 ID。 -1 表示订阅或者取消订阅指定实例下的所有资源。
因此解释为:
+MIPLEVENT: 0,1 //开始连接到 Bootstrap 服务器。
+MIPLEVENT: 0,2 //成功连接到 Bootstrap 服务器。
+MIPLEVENT: 0,4 //成功连接到 OneNET 平台。
+MIPLEVENT: 0,6 //成功注册到 OneNET 平台。此时,刷新OneNET可看到设备显示绿色在线状态。
+MIPLOBSERVE: 0,119350,1,3311,0,-1 //接收到订阅请求(3311/0)。
接收到了+MIPLEVENT: 0,6 就表示成功注册到 OneNET 平台。此时,刷新OneNET可看到设备显示绿色在线状态。
5、响应订阅请求
在收到+MIPLOBSERVE: 0,119350,1,3311,0,-1后,10秒内必须响应订阅请求,否则平台会断开。
指令为:
AT+MIPLOBSERVERSP=<ref>,<msgId>,<result>
<ref> 整型。 OneNET 通信套件的实例 ID;范围: 0-65535。
<msgId> 整型。 消息ID;出自 URC +MIPLDISCOVER。
<result> 整型。 订阅结果,以下为结果码:
结果码 CoAP响应码 描述
1 2.05 内容,表示正确结果
11 4.00 无效请求
12 4.01 未授权
13 4.04 未找到
14 4.05 方式不允许
15 4.06 未接受
因此发送指令为:
AT+MIPLOBSERVERSP=0,119350,1
接收到模组响应
OK
+MIPLDISCOVER: 0,53815,3311
响应解释为:
+MIPLDISCOVER: <ref>,<msgId>,<objId> //通知模组响应发现资源请求
<ref> 整型。 OneNET 通信套件的实例 ID;范围: 0-65535。
<msgId> 整型。 数据包消息 ID。
<objId> 整型。从 OneNET 平台接收到的 LwM2M 对象 ID。
6、响应发现资源请求
在收到+MIPLDISCOVER: 0,53815,3311后,10秒内必须响应发现资源请求,否则平台会断开。
指令为:
AT+MIPLDISCOVERRSP=<ref>,<msgId>,<result>,<length>,<valuestring>
<ref> 整型。 OneNET 通信套件的实例 ID;范围: 0-65535。
<msgId> 整型。 消息ID;出自 URC +MIPLDISCOVER。
<result> 整型。 发现资源操作结果,以下为结果码:
结果码 CoAP响应码 描述
1 2.05 内容,表示正确结果
11 4.00 无效请求
12 4.01 未授权
13 4.04 未找到
14 4.05 方式不允许
15 4.06 未接受
<length> 整型。 参数<valuestring>的长度。单位: 字节。
<valuestring> 带双引号的字符串类型。 包含对象的属性,每个属性之间用分号隔开,例如:"1101;1102;1103",属性个数不应超过AT+MIPLADDOBJ 命令的<attrCount>和<actCount>参数值总和。
因此发送指令为:
AT+MIPLDISCOVERRSP=0,53815,1,19,"5850;5851;5706;5805"
接收到模组响应
OK
7、读取操作
现在已经连接到onenet,并且已经上报了对象的资源,接下来测试一下平台的读取操作。读取操作是由平台发起的,在平台上发起操作后,模组联网后就会收到请求,然后会主动上报URC,与模组连接的单片机收到模组吐出的URC后,再使用AT指令,把数据发送给模组,模组再把数据发送给平台。
接收到平台下发读取操作,模组上报的URC为:
+MIPLREAD: <ref>,<msgId>,<objId>,<insId>,<resId>
<ref> 整型。 OneNET 通信套件的实例 ID;范围: 0-65535。
<msgId> 整型。 数据包消息 ID。
<objId> 整型。 从 OneNET 或者应用服务器处接收到的 LwM2M 对象 ID。
<insId> 整型。 从 OneNET 或者应用服务器处接收到的实例 ID。 -1 表示读取指定 LwM2M对象下的所有资源。
<resId> 整型。 从 OneNET 或者应用服务器处接收到的资源 ID, -1 表示读取指定实例下的所有资源。
单片机发数据给模组的指令为:
AT+MIPLREADRSP=<ref>,<msgId>,<result>[,<objId>,<insId>,<resId>,<valueType>,<len>,<value>,<index>,<flag>]
<ref> 整型。 OneNET 通信套件的实例 ID;范围: 0-65535。
<msgId> 整型。 消息 ID; 出自 URC +MIPLREAD。
<result> 整型。 读取结果,以下为结果码:
结果码 CoAP响应码 描述
1 2.05 内容,表示正确结果
11 4.00 无效请求
12 4.01 未授权
13 4.04 未找到
14 4.05 方式不允许
15 4.06 未接受
<objId> 整型。 LwM2M 对象 ID; 出自 URC +MIPLREAD。
<insId> 整型。 实例 ID,出自 URC +MIPLREAD。
<resId> 整型。 资源 ID; 出自 URC +MIPLREAD。
<valueType> 整型。 <value>值的类型。
1 字符串类型
2 十六进制类型
3 整型
4 浮点型
5 布尔型(Boolean)
<len> 整型。 <value>值的长度;单位: 字节。
当<valueType>=1 时,该参数值为字符串类型<value>的长度,范围: 0-1024。
当<valueType>=2 时,该参数值为十六进制字符串类型<value>的长度,范围:0-512。
当<valueType>=3 时,该参数值可能为 2、 4 或者 8。
当<valueType>=4 时,该参数值为 4。
当<valueType>=5 时,该参数值为 1。
<value> 数据。
当<valueType>=1 时,该参数值为带双引号的字符串类型格式,最大 1024 字节。
当<valueType>=2 时,该参数值为十六进制字符串格式,最大 512 字节。
当<valueType>=3 时,该参数值为整型格式。
当<valueType>=4 时,该参数值为浮点型格式。
当<valueType>=5 时,该参数值为布尔型格式。
<index> 整型。 消息序号。若读取请求响应包含多条消息,则需发送多次 AT 命令以完成响应。例如, 若读取请求响应包含 N 条消息,则参数<index>需从 N-1 到 0 依次递减, AT 命令按照<index>取值从大到小的顺序执行。 <index>=0 表示数据中最后一条消息。
<flag> 整型。 消息指示; 范围: 0-2。
0 表示<value>中最后一条消息
1 表示<value>中第一条消息
2 表示<value>中中间的消息
当前版本仅支持<flag>=0。
首先在平台上发起,读Resource ID=5851资源的请求:
如果模组没有处于PSM,而是处于联网状态的话,就会收到平台下发的请求,然后上报URC:
+MIPLREAD: 0,6902,3311,0,5851
这个时候根据前面的指令格式,发送数据:(要在10s内回复)
AT+MIPLREADRSP=0,6902,1,3311,0,5851,3,2,75,0,0
就可以看到已经把数据发送到平台上了:
如果点击读资源后,看到平台一直在等待,最后超时,而且模组也没有上报URC,就说明模组当前处于跟基站断开的状态。
可以发送一下更新请求,这样模组就会恢复与基站的连接,同时就能收到平台下发的请求了。指令为:
AT+MIPLUPDATE=<ref>,<lifetime>,<withObjectFlag>
<ref> 整型。 OneNET 通信套件的实例 ID;范围: 0-65535。
<lifetime> 整型。 更新后的设备使用期限值(实际使用期限为<lifetime>×0.9)。 单位:秒。
0 3600 秒
15-268435455
<withObjectFlag> 整型。 是否更新对象列表。
0 不更新
1 更新
因此发送指令为:
AT+MIPLUPDATE=0,86400,1
指令响应为:
OK
+MIPLEVENT: 0,11
发送之后,再在平台上点击读资源,模组就能立马上报URC了。
7、写入操作
模组收到平台的写操作,上报的URC为:
+MIPLWRITE: <ref>,<msgId>,<objId>,<insId>,<resId>,<valueType>,<len>,<value>,<flag>,<index>
<ref> 整型。 OneNET 通信套件的实例 ID;范围: 0-65535。
<msgId> 整型。 数据包消息 ID。
<objId> 整型。 从 OneNET 或者应用服务器处接收到的 LwM2M 对象 ID。
<insId> 整型。 从 OneNET 或者应用服务器处接收到的实例 ID。
<resId> 整型。 从 OneNET 或者应用服务器处接收到的资源 ID。
<valueType> 整型。 <value>值的类型(当前仅显示十六进制类型。
1 字符串类型
2 十六进制类型
3 整型
4 浮点型
5 布尔型(Boolean)
<len> 整型。 <value>值的长度;单位: 字节。
<value> 字符串类型。数据。从 OneNET 或者应用服务器处接收到的数据,仅在 Direct push模式下有效。
<flag> 整型。 消息指示;范围: 0-2。
0 表示<value>中最后一条消息
1 表示<value>中第一条消息
2 表示<value>中中间的消息
该版本仅支持<flag>=0。
<index> 整型。 写入请求的索引号。若写入请求包含多条消息,则 URC 会被分成多个部分进行上报。例如, 若写入请求包含 N 条消息,则参数<index>需从 N-1 到 0 依次递减, URC 按照<index>取值从大到小的顺序进行上报。 <index>=0 表示这是写入请求中最后一条消息。
模组响应写入操作的指令为:
AT+MIPLWRITERSP=<ref>,<msgId>,<result>
<ref> 整型。 OneNET 通信套件的实例 ID;范围: 0-65535。
<msgId> 整型。 消息 ID; 出自 URC +MIPLWRITE。
<result> 整型。 写入结果,以下为结果码:
结果码 CoAP响应码 描述
2 2.04 Changed,表示正确结果
11 4.00 无效请求
12 4.01 未授权
13 4.04 未找到
14 4.05 方式不允许
首先在平台上发起,写Resource ID=5706资源的请求,写入内容为“hello”:
模组收到平台操作后,上报URC:
+MIPLWRITE: 0,33178,3311,0,5706,2,5,68656C6C6F,0,0
这个时候根据前面的指令格式,响应平台:(要在10s内回复,否则平台会超时)
AT+MIPLWRITERSP=0,33178,2
平台收到回复后,会提示操作成功。
从模组上报的URC,我们可以得到平台下发了5个字符“68656C6C6F”,是十六进制格式的,内容刚好是“hello”。
当然也可以以字符串的形式上报,操作如下:
AT+MIPLCONFIG=1,1 //设置 Buffer Access 模式,接收文本字符串类型数据
OK
AT+MIPLUPDATE=0,86400,1
OK
+MIPLEVENT: 0,11
+MIPLWRITE: 0,4012,3311,0,5706,2,5,0,0 //仅显示所接收数据的长度,然后发送 AT+MIPLRD 命令读取数据。
AT+MIPLWRITERSP=0,4012,2
OK
AT+MIPLRD=5 //从缓存中读取数据
+MIPLRD: 5,0 //已读取数据长度为 5 字节, 未读取数据长度为 0 字节
hello //所读取的文本字符串类型数据
OK
8、执行操作
模组收到平台的执行操作,上报的URC为:
+MIPLEXECUTE: <ref>,<msgId>,<objId>,<insId>,<resId>[,<len>,<arguments>]
<ref> 整型。 OneNET 通信套件的实例 ID;范围: 0-65535。
<msgId> 整型。 数据包消息 ID。
<objId> 整型。 从 OneNET 或者应用服务器处接收到的 LwM2M 对象 ID。
<insId> 整型。 从 OneNET 或者应用服务器处接收到的实例 ID。
<resId> 整型。 从 OneNET 或者应用服务器处接收到的资源 ID。
<len> 整型。 参数<arguments>的长度;单位:字节。
<arguments> 字符串类型。 执行操作中的<arguments>。
模组响应写入操作的指令为:
AT+MIPLEXECUTERSP=<ref>,<msgId>,<result>
<ref> 整型。 OneNET 通信套件的实例 ID;范围: 0-65535。
<msgId> 整型。 消息 ID; 出自 URC +MIPLEXECUTE。
<result> 整型。 执行结果,以下为结果码:
结果码 CoAP响应码 描述
2 2.04 Changed,表示正确结果
11 4.00 无效请求
12 4.01 未授权
13 4.04 未找到
14 4.05 方式不允许
操作过程如上:
//UE 已成功注册到 OneNET 平台。
//应用服务器已经向 UE 发送执行请求,其中包含 Argument: reset。
+MIPLEXECUTE: 0,36476,3303,0,5605,5,"reset" //接收到执行请求。
AT+MIPLEXECUTERSP=0,36476,2 //响应执行请求, 其结果码为 2。
OK
9、模组主动上报数据操作
指令格式为:
AT+MIPLNOTIFY=<ref>,<msgId>,<objId>,<insId>,<resId>,<valueType>,<len>,<value>,<index>,<flag>[,<ackid>]
<ref> 整型。 OneNET 通信套件的实例 ID;范围: 0-65535。
<msgId> 整型。 消息 ID;出自 URC +MIPLOBSERVE。
<objId> 整型。 LwM2M 对象 ID。
<insId> 整型。 实例 ID;出自 URC +MIPLOBSERVE。
<resId> 整型。 资源 ID;出自 URC +MIPLOBSERVE。
<valueType> 整型。 <value>值的类型。
1 字符串类型
2 十六进制类型
3 整型
4 浮点型
5 布尔型(Boolean)
<len> 整型。 <value>值的长度;单位:字节。
当<valueType>=1 时,该参数值为字符串类型<value>的长度,范围: 0-1024。
当<valueType>=2 时,该参数值为十六进制字符串类型<value>的长度,范围:0-512。
当<valueType>=3 时,该参数值可能为 2、 4 或者 8。
当<valueType>=4 时,该参数值为 4。
当<valueType>=5 时,该参数值为 1。
<value> 数据。
当<valueType>=1 时,该参数值为带双引号的字符串类型格式。
当<valueType>=2 时,该参数值为十六进制字符串格式。
当<valueType>=以上是关于BC26通过LWM2M协议连接ONENET,AT流程,STM32代码的主要内容,如果未能解决你的问题,请参考以下文章
BC26通过LWM2M接入电信AEP平台(非透传模式 Json格式)
BC28BC95通过LWM2M连接电信AEP(ctwing)