NB-IOT 设备接入OneNET平台
1、前言
现在网上的相关资料都是使用的旧版本的OneNET平台的账号,所以旧的文章里最常出现的比如像资源列表这类东西在新平台账号是没有的,使用的NB模块也都是内部集成好SDK的,非内部集成SDK的模块连接也没有那么方便,或者说有些许不一样,并且近两年新出的物模型网上也没有相关资料或者说很难找到,网上可能有新的资料但是不太好找我没有找到,我是到处东拼西凑才摸索着完成的,在这里记录一下方便后来者,毕竟我这份资料应该是你们可以最容易找到的并且是最全的资料了,跟我我的步骤走一定可以顺利走通平台发送数据给到物模型解析。
2、OneNET平台的注册与配置
2.1、注册与创建产品
平台账号很好注册就不说了,至于企业与个人用户的区别就是设备数量等,前期测试倒也无所谓,如果后期有项目正式上线的想法可以后期再认证企业用户,毕竟OneNET的企业认证跟AEP不同还是蛮麻烦的。
-
注册好账号之后点击左上角的
全部产品服务
,选择物联网开放平台
-
点击产品开发
-
点击创建产品
-
产品种类自己看着填写接入协议也是看自己的选择,我这里是用的LwM2M,数据协议一定记得选择OneJson这样才可以使用物模,联网方式选择NB,开发方案为标准方案,最后点击确定创建成功
2.2、物模型的设置
可以先了解一下平台对物模型的解释OneNET - 中国移动物联网开放平台 (10086.cn),要是用我的话来简单理解就是,物模型可以把你发的数据按照你设定的数据格式解析出来,然后在平台以类似键值对的形式展示出来。
接下来我们还是先看看怎么在平台设置物模吧:
-
创建成功之后点击产品开发
-
点击设置物模型
-
创建一个简单的测试用例物模型
- 点击添加自定义功能节点
- 创建一个简单的物模型,完成后点击新增
可以看到列表中看到了新增的信息事件,点击保存,就可以将我们刚才设置的事件保存到我们的物模型中
2.3、添加设备
设置完一个简单的物模型后我们先来测试一下它的可用性,但是此时我们的产品下还没有设备,所以我们先来添加一个设备
-
点击设备接入管理->设备管理->添加设备
-
产品选择我们刚刚创建的测试,设备名称随意,我们还缺少两个必填项
IMIE
和IMSI
-
打开串口调试助手输入
AT+CGSN=1 获取
IMEI
号AT+CIMI 获取
IMSI
码 -
将获取到的
IMEI
和IMSI
输入,点击确定
我们就可以在设备列表中看到我们刚才添加的设备了
2.4、测试物模
-
点击设备详情
-
点击设备调试->事件上报->启动调试
-
事件选择我们刚才创建的测试用例,具体的参数随意填写,之后点击事件上报
-
可以在右边的调试日志中看到设备上报到平台的数据形式
我们先把它复制出来,在后面需要用到{ “title”: “事件上报”, “timestamp”: “2023-06-27 09:54:04”, “message”: “{“payloads”:{“id”:“1687830843101”,“version”:“1.0”,“params”:{“Test”:{“value”:{“Begin”:110,“Mid”:119,“End”:120}}},“method”:“thing.event.post”},“url”:”/19/0/0"}" }
在这里可以先了解一点连接平台相关的知识
3、连接NB-IOT
3.1、模块初始化
//确认模块能正常响应 AT 命令
AT
OK
//获取模块 IMEI 号
AT+CGSN=1
+CGSN: “865324037375316”
OK
//查询模块固件版本号
AT+CGMR
+CGMR: N306_C1-E05-STD-BZ-001
OK
//确认模块能识别到 SIM 卡
AT+CPIN?
+CPIN: READY
OK
//获取 IMSI
AT+CIMI
460016657520885
OK
//确认信号良好 12< CSQ <31
AT+CSQ
+CSQ: 31, 99
OK
//主动关闭低功耗模式
AT+ECPMUCFG=1,1
OK
// 查询网络附着情况
AT+CGATT?
+CGATT: 1
OK
// 查询网络注册情况
AT+CEREG?
+CEREG: 0,1
OK
//查询 PDP 是否激活成功
AT+CGPADDR
+CGPADDR: 0,“10.20.221.89”
OK
这里具体的命令可能会有所不同,具体的命令要找模组厂商要资料,我这里使用的是有方的N306模块(很明显这不是广告)
3.2、模块接入 OneNET 平台,完成注册
//查询基础通信套件版本
AT+MIPLVER?
+MIPLVER: 2.3.0OK
//创建基础通信套件成功,返回 < ref > 为 0,0 是基础通信套件标识,后续 AT 指令都需要使用到它
AT+MIPLCREATE
+MIPLCREATE: 0OK
//添加对象为 19
AT+MIPLADDOBJ=0,19,1,“1”,1,1
OK//模块请求注册AT+MIPLOPEN=0,3600
OK+MIPLEVENT:0,1 //OneNET 平台返回结果 BOOTSTRAP_START
+MIPLEVENT:0,2 //OneNET 平台返回结果 BOOTSTRAP_SUCCESS
//不是内部集成平台SDK的模块不返回0,4
+MIPLEVENT:0,4 //OneNET 平台返回结果 CONNECT_SUCCESS
+MIPLEVENT:0,6 //OneNET 平台返回结果 REG_SUCCESS
//OneNET 平台对象/实例 Observe 请求
+MIPLOBSERVE: 0,125579,1,19,0,-1
//模块响应 Observe 请求,其中 msgid=125579 必须对应 OneNET 平台 Observe 请求消息中下发的 msgidOK
AT+MIPLOBSERVERSP=0,125579,1
//OneNET 平台对象 Discover 请求
+MIPLDISCOVER: 0,60044,19
//模块响应 Discover 请求,其中 msgid=60044 必须对应 OneNET 平台 Discover 请求消息中下发的 msgid。
AT+MIPLDISCOVERRSP=0,60044,1,1,“1”
OK//平台返回 Discover 请求结果给模块,完成订阅。
+MIPLEVENT: 0,11
到这里我们就成功的与平台建立了通信,查看设备状态为在线
4、上传数据到ONENET平台
设备要向平台上传能被物模型解析的数据的格式要是16进制的OneJson格式数据
所以这个时候需要用到我们前面在设备调试时复制来的数据了,我们可以用几个实用的工具网站来转换成我们需要的数据
- 我们在这里可以使用去转义功能,将我们复制来的数据格式化成我们需要的样子(只需要playload里面的内容)JSON在线 | JSON解析格式化—SO JSON在线工具
转换后我们得到了这样的数据
{
"id": "1687830843101",
"version": "1.0",
"params": {
"Test": {
"value": {
"Begin": 110,
"Mid": 119,
"End": 120
}
}
},
"method": "thing.event.post"
}
- 保险起见我们再清除空白字符在线字数统计工具 | 菜鸟工具 (runoob.com)
我们可以得到这样的结果
{"id":"1687830843101","version":"1.0","params":{"Test":{"value":{"Begin":110,"Mid":119,"End":120}}},"method":"thing.event.post"}
- 我们再使用文本转换工具将其转换为16进制数据16进制转换,16进制转换文本字符串,在线16进制转换 | 在线工具 (sojson.com)
我们就的到了这样的16进制数据
7b226964223a2231363837383330383433313031222c2276657273696f6e223a22312e30222c22706172616d73223a7b2254657374223a7b2276616c7565223a7b22426567696e223a3131302c224d6964223a3131392c22456e64223a3132307d7d7d2c226d6574686f64223a227468696e672e6576656e742e706f7374227d
-
最后我们将这个数据复制回我们前面去除空白符的计字工具中,将这个总字符数和转换后的数据记下来,后面要用到
-
打开串口工具发送数据
AT+MIPLNOTIFY=0,86296,19,0,0,2,128,"7b226964223a2231363837383330383433313031222c2276657273696f6e223a22312e30222c22706172616d73223a7b2254657374223a7b2276616c7565223a7b22426567696e223a3131302c224d6964223a3131392c22456e64223a3132307d7d7d2c226d6574686f64223a227468696e672e6576656e742e706f7374227d",0,0,797
回码 26 即为发送成功,打开平台的事件记录
看到了我们刚才上传的数据
- 这里简单介绍一下发送数据命令的格式
AT+MIPLNOTIFY=0,86296 ,19,0,0,2,128,"7b226964223a2231363837383330383433313031222c2276657273696f6e223a22312e30222c22706172616d73223a7b2254657374223a7b2276616c7565223a7b22426567696e223a3131302c224d6964223a3131392c22456e64223a3132307d7d7d2c226d6574686f64223a227468696e672e6576656e742e706f7374227d",0,0,797
0—就是前面的ref基础通信套件标识
86296 —是Observe请求的msdID
19,0,0—平台物模型通道上行-数据上报在前面的OneNET - 中国移动物联网开放平台 (10086.cn)中有提到
2—是不透明型的意思,是AT+MIPLNOTIFY这条指令规定的一种数据类型,如需上传OneJson格式数据被平台物模型解析就要选择这种格式的数据(具体视不同模组厂商的AT指令说明,我这里仅限于我使用的这个模组)
128—这个就是我前面为什么说要记住字符数256,因为这是字节长度是从字符数计算得来的,但是并不是都填写的是字节长度,看具体前面选择的数据类型是什么,但是针对这款NB模组来说的话要上传OneJson数据被物模解析的话,是一定这么选择计算的
"7b22…277d"很明显就是要发送的内容了就是需要经过我上面说的一系列的转化得出来的
最后的0,0,797其实一般来说没有太大的意义,写0,0,0也行
第一个0是指令序号,如果需要多条指令组合成一个完整指令则从N-1 至 0 降序编号,为0则为这条指令结束
第二个0是如果有多条消息的话:
1 第一条消息
2 中间消息
0 最后一条消息
这个797是adcid,该数值随+MIPLEVENT 指令返回,写797也就是个人习惯,0是不会随着指令返回,1-65535都会随着指令返回
5、注意
- 不同模组厂商的AT指令不一定相同,具体实现需要结合自己模组的AT指令。
- 文中的Observe有所不同,因为中间出了点小插曲我重连了一遍,懒得再次截图了所以导致了不同,这个注意一下就好了,但是应该没有人会连这个也一起复制走。
- AEP平台有的命令下发功能OneNET也是不能够在平台直接实现的,需要自己通过平台API去编写调用。
6、结语
- 有疑问的可以在评论区留言交流,哪里写错了也欢迎指正。
- 电信AEP平台我也有在使用,但是那个比较简单,如果评论区需要的人多的话我后续也可以再出一个AEP平台的连接使用教程。
- 如果觉得写的有帮助到你的话可以送个
三连
支持一下,谢谢大家ORZ。