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 023 将被注册,而实例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 360015-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 时,该参数值可能为 24 或者 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-10 依次递减, AT 命令按照<index>取值从大到小的顺序执行。 <index>=0 表示数据中最后一条消息。
<flag> 整型。 消息指示; 范围: 0-20 表示<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 360015-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-20 表示<value>中最后一条消息
    1 表示<value>中第一条消息
    2 表示<value>中中间的消息
    该版本仅支持<flag>=0<index> 整型。 写入请求的索引号。若写入请求包含多条消息,则 URC 会被分成多个部分进行上报。例如, 若写入请求包含 N 条消息,则参数<index>需从 N-10 依次递减, 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 时,该参数值可能为 24 或者 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)

BC25通过LWM2M连接电信AEP(ctwing)

使用ML302模组通过MQTT协议接入OneNet平台与mqtt Broker

nbiot之bc26 连接电信网联网平台

bc25 bc28区别