OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 13150|回复: 15

NB-IOT模块(M5311)通过MQTT协议对接华为云IOT平台

[复制链接]

6

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2019-8-4
在线时间
24 小时
发表于 2020-5-15 00:18:09 | 显示全部楼层 |阅读模式
本帖最后由 核聚变 于 2020-5-15 09:15 编辑

说明:最近做项目要用到M5311模块对接华为云,遇到了不少坑。最后成功了。关于这个网上资料很少,我几乎没找到很有用的资料。做的过程中就想着等做出来了写篇教程。本文目的:1、让大家避坑,节省时间。2、分享技术。
        刚开始要着手解决这个问题的时候很懵。首先买了M5311模块(NB-IOT模块的一种),拿到模块相关资料之后,感觉好像没有针对我的应用的资料。然后资料中各种内容一大堆,表示看不太懂。。。后来,就有了这篇文章。
技术关键词:NBIOT、M5311、MQTT协议、华为云、JSON数据格式、STM32单片机、USART通信。
一、简介
我要实现的功能:用STM32F1控制M5311模块通过MQTT协议(MQTT协议模块内部已经集成了,我们只需要调用相关AT指令就可以了)对接华为云平台,实现数据的上传与下发。
针对我的应用的主要资料:
(1) M5311的AT指令(包括MQTT有关的AT指令)
(2) 华为云平台官方的开发指南
二、AT流程
-----------基础AT指令--------------
模块开机
|
AT
| res: OK\r\n
ATE0  //关闭AT指令回显,节省单片机接收缓冲区的空间
| res:OK\r\n
AT+CMSYSCTRL=0,2   //设置LED指示网络状态
| res: OK\r\n
AT+SM=LOCK_FOREVER //设置不休眠模式
| res:OK\r\n
AT+CLPLMN    //清除注网记录
| res: +CLPLMN:空格0\r\n \r\n OK\r\n
AT+CEDRXS=0,5  //关闭eDRX功能
| res:  OK\r\n
AT+CPSMS=2,,,"01001111","00100010" //关闭PSM功能
| res: OK\r\n
AT+CIMI  //确认读SIM卡正常
| res:460043193208917\r\n \r\n OK \r\n  
AT+CSQ   //查询信号质量
| res:+CSQ:空格9,0\r\n \r\nOK\r\n
AT+CEREG?  //确认基站注册状态 (第二位:1本地已注册,5漫游已注册)
| res: +CEREG:空格0,1\r\n\r\nOK\r\n
AT+CGATT?  //确认PDP激活状态(1已激活,0未激活)
| res: +CGATT: 空格1\r\n\r\nOK\r\n
AT+CEREG=5  //For a UE that wants to apply PSM, enable network registration
| res:OK\r\n
AT+CEREG?   //确认 PSM 参数是否设置成功
| res: +CEREG:空格5,1,"3FE9","0CA3D416",9,"00",0,0,"00100010","11100000"\r\n\r\nOK\r\n

注意:有关MQTT的AT指令的参数需要根据自己的实际情况修改。
-------------MQTT协议AT指令------------------------
AT+MQTTCFG="iot-mqtts.cn-north-4.myhuaweicloud.com",1883,"5eaaa3ed3766a6040511451a_123_0_0_2020043018",120,"5eaaa3ed3766a6040511451a_123","35415eb57f16397205d0056ca4269fa90fc17c4dbcbc8a8f717b48dcea70d3a3",1
(说明:1、第三个参数”客户端ID“必须按照华为云平台要求的格式,即:设备ID+下划线+0或1+下划线+0或1+下划线+时间戳 (具体参考平台官方文档中:”文档首页 > 设备接入 IoTDA > API参考> 设备侧MQTT接口参考> 设备连接鉴权“有关内容 )
           2、第四个参数”用户名“即华为云平台中的设备ID
          3、第五个参数”密码“的值为使用“HMACSHA256”算法以时间戳为密钥,对平台密钥(创建设备时你自己设置的)进行加密后的值。)
| res:OK\r\n
AT+MQTTOPEN=1,1,0,0,0,"","" //发送连接建立请求
| res:OK\r\n\r\n+MQTTOPEN:空格OK\r\n
//注意:从这里往下的内容就有老版本和新版本之分了,我下边的示例都是用的新版本V5版本的topic(topic即主题),若需要老版本V3版本的topic可以去开发文档里找。新老版本的主要区别之一就是平台默认的topic不同。
AT+MQTTSUB="$oc/devices/5eaaa3ed3766a6040511451a_123/sys/commands/#",0 //订阅平台命令下发topic

AT+MQTTSUB="$oc/devices/5eaaa3ed3766a6040511451a_123/sys/properties/set/#",0 //订阅平台设置属性主题(订阅这个topic的目的是,你在平台上修改设备影子的期望值后,设备能够收到平台下发的期望值)
----------------------------------
设备上报属性:
AT+MQTTPUB="$oc/devices/5eaaa3ed3766a6040511451a_123/sys/properties/report",0,1,0,116,7B227365727669636573223A5B7B22736572766963655F6964223A227331222C2270726F70657274696573223A7B224461746131223A2253544D333220636F6E74726F6C204D3533313120636F6E6E65637420746F2048554157454920636C6F756420544553542042592048575121227D7D5D7D
平台命令下发响应:
AT+MQTTPUB="$oc/devices/5eaaa3ed3766a6040511451a_123/sys/commands/response/request_id={request_id}",0,1,0,18,7B22726573756C745F636F6465223A20307D
平台设置属性响应:
AT+MQTTPUB="$oc/devices/5eaaa3ed3766a6040511451a_123/sys/properties/set/response/request_id={request_id}",0,1,0,18,7B22726573756C745F636F6465223A20307D

-----------平台下发的数据(示例)-----------------
//平台下发命令
+MQTTPUBLISH: 0,0,0,0,$oc/devices/5eaaa3ed3766a6040511451a_123/sys/commands/request_id=9343402b-7cb0-490c-805d-c2c93ad28c85,68,{"paras":{"parm1":"VV"},"service_id":"s1","command_name":"command1"}
//平台修改设备属性
+MQTTPUBLISH: 0,0,0,0,$oc/devices/5eaaa3ed3766a6040511451a_123/sys/properties/set/request_id=2ba841f9-dbeb-4bab-9d04-6e8a89183f07,159,{"services":[{"properties":{"Data1":"11111111112222222223333333"},"service_id":"s1"}]}
三、注意事项
华为云部分:
1、MQTT协议的端口有两个,1883是针对MQTT协议的,8883是针对MQTTS协议的。(我用的MQTT端口1883)
2、华为物联网平台上的MQTT接口有新老版本之分,老版本是V3版本,新版本是V5版本。(由于开发文档东西有点多,我在看开发文档的时候,没有意识到这个问题,后来才发现的)平台的开发文档中说的是新老版本的接口不同,但我的感觉应该就是两个版本默认定义的topic不同。新版本topic比较多,功能也比老版本多。具体参见官方的开发文档。(这里我之说设备侧的开发,应用侧的开发我没研究)
3、平台有关IOT的开发文档我觉的有点乱,大类有两个,一个是“设备接入 IoTDA”的开发文档,另一个是“设备管理 IoTDM”的开发文档。刚开始我都不知道还有两个文档。貌似”设备接入 IoTDA”的开发文档是针对新版本V5的,而另一个是针对老版本的V3的,只是说貌似。(这么说的依据是这个目录“ 文档首页 > 设备接入 IoTDA > API参考> 设备侧MQTT接口参考> Topic定义 ”和这个目录“ 文档首页 > 设备管理 IoTDM > API参考> 设备侧MQTT接口参考> 使用前必读 ”中定义的topic不同 。具体我也不清楚,自己看吧)
4、平台上下行数据方式有JSON数据格式和二进制码流之分。(但是我在创建产品的时候数据传输方式只有JSON一个选项) 如果上报的格式是JSON则不用自己开发插件,如果是用二进制码流的格式则需要自己开发插件来解析数据。老版本的topic有个参数能选择上报数据时的方式,但是新版本的topic好像不能选择(我没看到怎么选择),默认的是JSON格式。
5、关于JSON数据格式可以自己网上找一下资料。并不难。
6、不按照JSON格式上报的数据平台不会显示(当然不包括采用老版本的二进制码流格式),只能在平台的消息跟踪里边看到相关的提示。
M5311模块部分:
1、模块AT指令的参数中不能含有逗号。而华为云要用的JSON格式中必须要有逗号。所以要用16进制的形式发送。具体内容见手册中的AT+MQTTPUB指令的说明。
M5311模块对接平台部分:
1、建议先通过电脑的串口调试助手连接并控制M5311模块(用USB转串口模块或者单片机开发板自带的USB转串口模块),对接成功之后再去编程实现功能。
2、平台连接在发送完 “AT+MQTTOPEN=1,1,0,0,0,"","" ”之后如果连接成功会返回 “+MQTTOPEN: OK”。(注意,只返回“OK”的话不代表连接成功,必须是“+MQTTOPEN: OK)
3、设备断开连接之后,以前订阅的主题全都没了,需要重新订阅主题。
4、设备标识码可以不用模块的IMEI号(虽然有些地方说让设置为NB模块的IMEI号),自己随便设置即可。
5、设备必须订阅命令下发的主题之后才能在平台上发送命令(没有提前订阅topic就下发命令,会平台提示发送失败)
6、开发文档中给出的默认topic中,需要自己配置的参数用大括号括起来了,但是改这个参数的时候大括号要去掉,例如:平台给出的默认topic形式“$oc/devices/{device_id}/sys/commands/response/request_id={request_id} ”,你自己改的时候要改成这样“$oc/devices/123/sys/commands/response/request_id=456 ”(123,456只是示例,具体根据实际情况改)
7、设备的影子有个期望值,平台上说的是修改期望值之后,如果正常连接,平台会下发期望值到设备。但是我用老版本的接口订阅了命令下发的默认topic,然后修改影子的期望值NBIOT模块并没有收到下发的数据,后来我改用新版本的接口,订阅了平台设置属性的topic,修改设备影子中的期望值,设备端收到了数据。(所以可能老版本的接口不支持修改设备影子中的期望值后,平台下发期望值的操作。新版本的能支持)
8、(1)设备不在线,更改设备影子期望值,等设备上线,并且订阅了平台设置属性topic后,平台并不会下发之前修改的设备影子期望值。
     (2)设备没有提前订阅平台设置属性topic时,等更改完设备影子期望值后又订阅了该topic,平台并不会下发之前修改的设备影子期望值。
     (3)当设备上报的属性值与影子中的期望值不一致时,平台会下发影子中的期望值。但是当设备上报一次与影子中的期望值相同后,若影子中的期望值一直保持不变,再上报与影子中不同的值,平台不会再下发影子中的期望值。
        前两点与平台的开发文档中描述不太一致,不清楚是平台的bug还是我的操作有问题。(如果想等设备上线时把影子中的数据同步到设备可以考虑用“设备侧获取平台的设备影子数据”的方法,平台开发文档有详细介绍)
9、平台下发数据到设备之后,设备需要返回应答,至于没有应答的后果,,,一段时间之内没有进行应答,会导致连接断开。但是我的测试有时候设备没有进行应答并不会断开连接,但有时候会断开连接,具体原因不太清楚。所以还是建议进行应答。

结束语:
1、如果需要STM32控制M5311模块对接华为云平台源码的可以留言或者联系Q1693794917(注明来意)
2、如果遇到实在解决不了的问题可以在平台上创建工单,咨询平台工程师。
3、华为云平台以及NBIOT模块功能很多也有点复杂,我并没有全面的了解、测试。所以本文的观点可能会有些片面、不当、错误之处,望各位谅解、指正。

未完待续。。。。。。。。。。。。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-11-14
在线时间
2 小时
发表于 2020-6-5 22:10:42 | 显示全部楼层
我也在学习NB-IOT,写的有实际参考价值
回复 支持 反对

使用道具 举报

6

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2019-8-4
在线时间
24 小时
 楼主| 发表于 2020-6-13 13:39:51 | 显示全部楼层
后续可能会在这篇博客里更新一些内容(https://blog.csdn.net/JACK__Q/article/details/106122438
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2019-7-5
在线时间
9 小时
发表于 2020-7-15 21:53:32 | 显示全部楼层
请问一下你使用M5311连接MQTT  会不会经常出现连接断开的情况?
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2019-7-5
在线时间
9 小时
发表于 2020-7-15 21:54:43 | 显示全部楼层
请问一下你使用M5311连接MQTT   会不会经常出现自动断开连接的情况?
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2019-7-8
在线时间
12 小时
发表于 2020-8-17 14:10:03 | 显示全部楼层
NB-IOT模块型号不一样开发差别大吗
回复 支持 反对

使用道具 举报

6

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2019-8-4
在线时间
24 小时
 楼主| 发表于 2020-8-19 01:32:39 | 显示全部楼层
zxh2209 发表于 2020-7-15 21:53
请问一下你使用M5311连接MQTT  会不会经常出现连接断开的情况?

连接断开应该是因为平台下发数据之后你没有回复对应的响应造成的。
回复 支持 反对

使用道具 举报

6

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2019-8-4
在线时间
24 小时
 楼主| 发表于 2020-8-19 01:34:01 | 显示全部楼层
shihao 发表于 2020-8-17 14:10
NB-IOT模块型号不一样开发差别大吗

模块都用同一种协议的话应该差别不大。我只用过M5311模块。
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2018-9-12
在线时间
4 小时
发表于 2020-9-2 15:24:07 | 显示全部楼层
实战经验必须点赞
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2020-9-3
在线时间
6 小时
发表于 2020-9-4 16:15:52 | 显示全部楼层
谢谢大佬分享
回复 支持 反对

使用道具 举报

0

主题

24

帖子

0

精华

高级会员

Rank: 4

积分
585
金钱
585
注册时间
2020-8-17
在线时间
82 小时
发表于 2020-11-17 11:06:06 | 显示全部楼层
感谢大佬分享
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2021-10-26
在线时间
1 小时
发表于 2021-10-26 15:10:03 | 显示全部楼层
大神,我也购买了M5311物联网模块,可是厂家给的STM32例程一直调试不通,可以参考你的代码吗,我的QQ 1049899776
回复 支持 反对

使用道具 举报

7

主题

237

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1101
金钱
1101
注册时间
2019-5-6
在线时间
127 小时
发表于 2022-2-14 17:05:26 | 显示全部楼层
兄弟很棒
回复 支持 反对

使用道具 举报

0

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
343
金钱
343
注册时间
2018-3-20
在线时间
74 小时
发表于 2022-2-28 13:31:12 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

0

主题

451

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3316
金钱
3316
注册时间
2016-3-19
在线时间
815 小时
发表于 2022-3-29 10:52:46 | 显示全部楼层
请问M5311使用怎么样,稳定吗?
Nothing is impossible
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2022-5-16
在线时间
1 小时
发表于 2022-5-16 10:58:18 来自手机 | 显示全部楼层
不知道为什么我用32只能收到乱码,可以分享一下你的程序给我参考吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 16:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表