如何使用 NB-Iot + Arduino 通过MQTT协议上传数据至阿里云平台?

如何使用 NB-Iot + Arduino 通过MQTT协议上传数据至阿里云平台?,第1张

有很多通信模块只有TCP功能,没有MQTT功能,比如WIFI,W5500等模块,还有一些NBIOT模块,但是又想连接阿里云物联网平台,官方提供了操作系统,需要自己移植,很麻烦,比较难看得懂。就在想有没有一些简单一定的方法。心想MQTT是基于TCP的,能否使用TCP转MQTT?因此就想使用TCP协议然后转MQTT协议连接阿里云物联网平台,经过试验证明是可以的。首先我们先分析一下如何登陆接入Onenet平台。先从它数据格式开始分析。首先我们要从后台取出三个信息,我们以这个为例。我们把产品ID,设备名称,设备秘钥,简称三要素 (具体是什么看你自己的设备)其实阿里云物联网平台的MQTT协议用的就是标准的,不过它加入了自己的认证方式。MQTT协议需要上传四个参数,报活时间,clientID,用户名,密码。那么阿里云的就在clientID,用户名,密码做了手脚。clientID比较长,按照一定的格式用户名:设备名和秘钥组成密码:使用了加密串进行了加密,有sha1或者MD5加密方式下面我们来介绍一下MQTT接入都是发十六进制的数据。么我们发送的时候就是这样子的一串数据0x74 0x00 0x04 0x4d 0x51 0x54 0x54 0x04 0xC0 0078 0033 0x61 0x62 0x63 0x7c 0x73 0x65 0x63 0x75 0x72 0x65 0x6d 0x6f 0x64 0x65 0x3d 0x33 0x2c 0x73 0x69 0x670x6e 0x6d 0x65 0x74 0x68 0x6f 0x64 0x3d 0x68 0x6d 0x61 0x63 0x73 0x68 0x61 0x31 0x2c 0x74 0x69 0x6d 0x65 0x73 0x74 0x61 0x6d 0x70 0x3d 0x31 0x32 0x30 0x7c 00090x35 0x36 0x37 0x38 0x26 0x31 0x32 0x33 0x34 0028 0x32 0x32 0x32 0x37 0x35 0x30 0x44 0x45 0x44 0x46 0x45 0x34 0x46 0x37 0x37 0x34 0x30 0x30 0x32 0x45 0x45 0x38 0x37 0x45 0x45 0x44 0x32 0x39 0x43 0x46 0x44 0x30 0x36 0x33 0x38 0x43 0x35 0x46 0x36 0x36十六进制解释数据长度:0x74协议数据长度 0x00 0x04协议类型: 0x4d 0x51 0x54 0x54协议数据: 0x04 0xC0keepAlive数据:0078ClientID长度:0033ClientID: 0x61 0x62 0x63 0x7c 0x73 0x65 0x63 0x75 0x72 0x65 0x6d 0x6f 0x64 0x65 0x3d 0x33 0x2c 0x73 0x69 0x67 0x6e 0x6d 0x65 0x74 0x68 0x6f 0x64 0x3d 0x68 0x6d 0x61 0x63 0x73 0x68 0x61 0x31 0x2c 0x74 0x69 0x6d 0x65 0x73 0x74 0x61 0x6d 0x70 0x3d 0x31 0x32 0x30 0x7c用户名:0009用户名: 0x35 0x36 0x37 0x38 0x26 0x31 0x32 0x33 0x34密码长度:0028密码: 0x32 0x32 0x32 0x37 0x35 0x30 0x44 0x45 0x44 0x46 0x45 0x34 0x46 0x37 0x37 0x34 0x30 0x30 0x32 0x45 0x45 0x38 0x37 0x45 0x45 0x44 0x32 0x39 0x43 0x46 0x44 0x30 0x36 0x33 0x38 0x43 0x35 0x46 0x36 0x36复制代码上面的就是连接服务器的连接包下面呢,我们来做个发布包(上传数据到服务器)0x30 0x1D 0009 2f7379732f706f7374 0x7b 0x70 0x61 0x72 0x61 0x6d 0x73 0x3a 0x7b 0x74 0x65 0x6d 0x70 0x3a 0x31 0x30 0x7d 0x7d十六进制数据解释数据头:0x30数据长度:0x1DTopicName数据长度:0009TopicName数据内容:2f7379732f706f7374主体json数据: 0x7b 0x70 0x61 0x72 0x61 0x6d 0x73 0x3a 0x7b 0x74 0x65 0x6d 0x70 0x3a 0x31 0x30 0x7d 0x7d复制代码以上就是连接阿里云的数据包格式及发布数据的格式,由于时间问题没有做订阅的数据包分析,下一次更新订阅的内容。

SKW77接收到主机发过来的数据后,会将数据转发至指定的IP端口。

只需SKW77可以连接服务器即可,服务器和SKW77的连接可以通过以太网的方式连接,或者服务器在外网,SKW77可以连接外网即可(WAN口连接外网或者无线连接都行) 。

BC35-G 是一款高性能、低功耗的多频段 NB-IoT 无线通信模块,支持 B1/B3/B8/B5/B20/B28 频段,在设计和AT指令上与BC95兼容。

小熊派开发板右上角的开关拨到AT-PC一端,则模组直接与PC相连,方便调试。

指令:AT

功能:测试AT指令功能是否正常

示例:

指令:AT+CSQ

功能:返回从 UE 接收到的信号强度指示 <rssi> 和信道误码率 <ber>,其中第一个值rssi应当在0-31之间,如果为99则表示信号无法检测,第二个参数ber因为模组当前不支持,所以始终为99。

示例:

指令:AT+CEREG?

功能:查询当前 EPS 网络注册状态,该指令返回的第一个参数为0则表示禁止网络注册URC,第二个参数表示网络注册状态,1表示已注册本地网,5表示已注册漫游网络,其余值则表示注册失败。

示例:

指令:AT+CGATT?

功能:该命令用于查询当前是否将 UE 附着于 PS 域,返回值为1则表示已附着,即网络激活成功。

示例:

指令:AT+CGPADDR

功能:该命令用于查询模组当前的ip地址。

示例:

由于NB-IoT模组可以直接对接IoT平台,所以在单独测试使用UDP连接时,需要 在激活网络成功之后,在获取ip地址之前,关闭IoT平台注册功能

使用如下命令禁止该功能:

首先我们需要搭建一个UDP服务器,有两种方式:

因为 NB-IoT 模组直接注册的是公网ip地址,所以这里我们使用第一种方式,在Linux服务器上运行一个Python编写的UDP测试服务器:

这里的Python程序如下:

运行:

效果如下:

使用AT命令连接UDP服务器,首先需要创建一个 UDP 类型的 Socket,创建socket的指令如下:

其中第一个参数是socket类型,DGRAM表示UDP,STREAM表示UDP;第二个参数表示协议类型,UDP 为 17, UDP 为 6,最后一个参数指定socket使用的本地端口,如果为0则表示随机分配。

所以创建UDP socket的示例如下:

指令:

其中第一个参数是由 AT+NSOCR 返回的 Socket 编号,第二个参数是UDP服务器ip地址,也可以使用域名,第三个参数是UDP服务器开启监听的端口,第四个是发送数据的长度,最后一个是要发送的十六进制数据。

示例:

发送之后,在服务器端也可以看到:

模组发送数据到服务器后,服务器会自动发送消息,模组会打印出收到信息的提示:

该信息表示编号为1的socket收到了18字节的数据。

可以使用如下命令查看收到的数据,第一个参数是socket编号,第二个参数是查询的数据长度:

查看刚刚收到的数据:

其中收到的数据为倒数第二个参数,是十六进制格式:

使用 在线工具 将数据转化为字符串即可:

通信完毕之后,可以使用下面的命令关闭最开始创建的socket:

示例:


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/775253.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-08-22
下一篇2023-08-22

发表评论

登录后才能评论

评论列表(0条)

    保存