IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> BC26通过LWM2M协议连接ONENET,AT流程,STM32代码 -> 正文阅读

[嵌入式]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>=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<ackid> 整型。范围: 0-655350 上报的数据为不需要确认的消息
    1-65535 上报的数据为需要确认的消息

??因此指令为:

AT+MIPLNOTIFY=0,119350,3311,0,5851,3,2,25,0,0
OK

在这里插入图片描述

10、注销请求

??指令格式为:

AT+MIPLCLOSE=<ref>

<ref> 整型。 OneNET 通信套件的实例 ID;范围: 0-65535
AT+MIPLCLOSE=0

OK

+MIPLEVENT: 0,15

??此时在平台上可以看到设备已离线。

在这里插入图片描述

11、删除对象

??指令格式为:

AT+MIPLDELOBJ=<ref>,<objId>

<ref> 整型。 OneNET 通信套件的实例 ID;范围: 0-65535<objId> 整型。 LwM2M 对象 ID。 若对象 ID 不存在,则返回错误。
AT+MIPLDELETE=0

OK

STM32代码示例

待续

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-22 14:21:29  更:2021-07-22 14:23:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:50:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码