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

目录

一、简介

二、AT流程

三、注意事项


说明:最近做项目要用到M5311模块对接华为云,遇到了不少坑。最后成功了。关于这个网上资料很少,我几乎没找到很有用的资料。做的过程中就想着等做出来了写篇教程。本文目的:1、让大家避坑,节省时间。2、分享技术。

        刚开始要着手解决这个问题的时候很懵。首先买了M5311模块(NB-IOT模块的一种),拿到模块相关资料之后,感觉好像没有针对我的应用的资料。然后资料中各种内容一大堆,表示看不太懂。。。后来,就有了这篇文章。

本文主要对关键部分做介绍。华为云平台上的配置比较简单,不做赘述了。进入平台官网(https://www.huaweicloud.com/product/iothub.html)根据介绍配置即可。

技术关键词: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格式上报的数据平台不会显示(当然不包括采用老版本的二进制码流格式),只能在平台的消息跟踪里边看到相关的提示。

7、华为云平台支持发送短信、邮件、HTTPS消息等通知功能。这一功能正好弥补了M5311模块无法发送短信的缺点。用户可以通过平台发送短信、邮件等,实现如:报警、通知之类的功能。

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、此文章有时效性。华为云平台的功能、操作可能后续会不断更新。我在使用的时候平台上有些小问题、小bug(咨询客服确认过了),但是后续这些问题后续应该会被修复的。

2、如果需要STM32控制M5311模块对接华为云平台源码的可以留言或者联系Q1693794917(注明来意)

3、如果遇到实在解决不了的问题可以在平台上创建工单,咨询平台工程师。
4、华为云平台以及NBIOT模块功能很多也有点复杂,我并没有全面的了解、测试。所以本文的观点可能会有些片面、不当、错误之处,望各位谅解、指正。

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

 

上边这些主要是写了设备侧的开发。另外,有时间准备写一下有关华为云IOT平台的应用侧开发(基于Python)。

 

 

 

  • 5
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
NB-IoT无线网络系统优化指导书 目录 1总则 1 1.1编写说明 1 1.2缩略语 1 1.3编写依据 3 1.4版本更新历史 3 1.5指导书结构 3 2网络评估 5 2.1准备工作 5 2.1.1基站基础数据核查 5 2.1.2无线参数核查 5 2.1.3设备隐性故障排查 5 2.2网管指标评估 5 2.2.1概述 5 2.2.2呼叫接入类指标 5 2.2.3呼叫保持类指标 6 2.2.4业务流量类指标 6 2.2.5业务完整类指标 6 2.2.6资源负荷类指标 6 2.2.7设备可用性指标 7 2.3路测指标评估 7 2.3.1 DT测试方法 7 2.3.2 CQT评估 7 2.3.3覆盖类指标 8 2.3.4接入类指标 8 2.3.5完整类指标 8 2.3.6感知类指标 8 2.3.7移动性指标 8 2.4 N800&L800协同覆盖评估 9 2.5用户投诉评估 9 3覆盖干扰优化 10 3.1 NB-IOT覆盖增强理论 10 3.1.1 NB-IoT功率谱密度(PSD) 10 3.1.2重复(Repetition)增益 10 3.2基础优化方法 12 3.2.1基础优化流程 12 3.2.2 RF优化 15 3.2.3参数优化 16 3.2.4干扰排查 17 3.2.5异频组网策略 20 3.3 N800&L800协同优化 23 3.3.1利用L800进行N800网络问题评估 23 3.3.2 L800&N800协同优化案例 26 3.4覆盖干扰问题分析 30 3.4.1弱覆盖 30 3.4.2越区覆盖 31 3.4.3重叠覆盖 32 3.4.4上行覆盖受限 33 3.4.5上下行覆盖不平衡 33 3.4.6上行干扰 34 3.4.7下行干扰 34 3.4.8模三干扰 35 3.4.9其他问题 36 4异常事件优化 37 4.1 RRC连接建立失败 37 4.1.1 RRC连接建立流程 37 4.1.2 RRC连接建立失败现象 39 4.1.3 RRC连接失败定位流程 40 4.1.4 RRC连接失败常见原因 43 4.2 ATTACH附着失败 43 4.2.1 Attach附着流程 43 4.2.2 Attach附着失败现象 44 4.2.3 Attach失败定位流程 45 4.2.4 Attach失败常见原因 46 4.3重选失败 47 4.3.1小区重选流程 47 4.3.2小区重选失败现象 47 4.3.3小区重选失败定位流程 48 4.3.4小区重选失败常见原因 50 4.3.5路测参数配置建议值 50 4.4空口掉线 52 4.4.1 UE上下文释放流程 52 4.4.2空口掉线现象 53 4.4.3空口掉线定位流程 54 4.4.4空口掉线常见原因 55 4.5故障排查常用工具 55 4.5.1华为网管工具 55 4.5.2中兴网管工具 68 5功耗优化 76 5.1无线侧参数 76 5.1.1默认寻呼周期 76 5.1.2 UE不活动定时器 76 5.1.3 DRX特性开关 76 5.1.4前导初始接收目标功率值 77 5.1.5功率攀升步长 77 5.1.6 NPRACH前导重复次数 77 5.1.7上行初始传输重复次数 78 5.1.8路径损耗因子 78 5.1.9 NPUSCH标称P0值 78 5.1.10消息3相对前导的功率偏置 79 5.2核心侧参数(中兴) 79 5.2.1 Active Time(T3324)(s) 79 5.2.2 MME本地配置的周期性跟踪区更新定时器(T3412)时长(秒) 79 5.2.3 NB PTW Value 80 5.3核心网参数(华为) 80 5.3.1 PSM开关 80 5.3.2 Active Timer定时器时长 80 5.3.3 eDRX开关 81 5.3.4窄带S1模式寻呼时间窗口时长 81 5.3.5窄带S1模式寻呼周期 81 6关键参数配置 82 6.1系统配置类 82 6.1.1参考信号功率 82 6.1.2 SI重复传输模式 82 6.1.3 SI无线帧偏移 82 6.1.4 SI窗口长度 83 6.1.5 SIB1重复次数 83 6.1.6 SIB2周期 83 6.1.7 SIB3周期 83 6.1.8 SIB4周期 84 6.1.9 SIB5周期 84 6.1.10 SIB14周期 84 6.2小区选择类 85 6.2.1最低接收电平 85 6.2.2最低接入信号质量 85 6.3小区重选类 85 6.3.1同频测量门限配置指示 85 6.3.2同频测量启动门限 86 6.3.3最低接收电平 86 6.3.4同频重选时间 86 6.3.5同频小区重选设置 87 6.3.6异频/异系统测量启动门限配置指示 87 6.3.7异频/

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值