1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 树莓派63/100 - NB-IoT模块SIM7020使用MQTT发布消息

树莓派63/100 - NB-IoT模块SIM7020使用MQTT发布消息

时间:2024-05-19 17:53:20

相关推荐

树莓派63/100 - NB-IoT模块SIM7020使用MQTT发布消息

NB-IoT设备定位于窄带应用,采用http协议总让人感觉代价有点大,所以MQTT的应用场景更为适合,它的报文很短,订阅者/发布者的模式也非常适合一对多的消息通知。

MQTT基本原理不复杂,入门会比较快,看几篇文章即可,这篇《MQTT初学者指南》写得不错。

摘录其中的几个要点:

MQTT 是一种轻量级发布/订阅消息传递协议,专为低带宽环境中的 M2M(机器对机器)遥测而设计。它由 Andy Stanford-Clark (IBM) 和 Arlen Nipper 于 1999 年设计,专为TCP/IP 网络而设计,用于通过卫星连接石油管道遥测系统。虽然它最初是作为专有协议,但在 年免版税发布,并于 年成为 OASIS 标准。

MQTT代表MQ遥测传输,但以前称为消息队列遥测传输。MQTT正迅速成为IOT(物联网)部署的主要协议之一。

MQTT 有两种不同的变体和多个版本:

MQTT v3.1MQTT v3.1.1 – 最常用的版本,与v3.1差异很小MQTT v5 – 1月获得批准,目前使用范围有限MQTT-SN – 左右指定,旨在通过UDP、ZigBee 和其他传输方式工作。MQTT-SN目前似乎不是很流行,并且规范已经好几年没有改变了。

MQTT 代理或服务器

最初的术语是经纪人broker,也翻译为代理,但现在的标准化称呼是服务器。有很多免费开源的服务器可用,Mosquitto是一个免费的开源 MQTT 代理,多平台可用。

MQTT 客户端

由于 MQTT 客户端没有电子邮件地址、电话号码等地址,因此您无需像使用大多数消息传递系统那样为客户端分配地址。对于 MQTT v3.1.1,几乎所有编程语言和主要操作系统 Linux、Windows、来自Eclipse Paho 项目的Mac 都有客户端软件可用。

我这里安装了MQTTX客户端软件。

MQTT基于TCP/IP协议,因此需要指定IP地址和端口号,还有一个最重要的术语是主题topic。主题是树状结构,在订阅主题时常用到通配符“#”,理解它的含义就可以动手试验MQTT了。

假设我有两个主题,sensor/sim7020c 和 sensor/esp32,sensor/# 就是表示订阅sensor主题之下的任何层级的所有子主题。

我在学习CSDN上的一门MQTT课程时,老师提供了一个用于试验的MQTT服务器,我直接拿来用了,暂时不用安装服务器环境,但不保证以后这个服务器一直能够稳定访问。

MQTT服务器信息是:

IP地址: mqtt://

端口:1883

用户名:mastermu

密码:自己到课程里获得

先在MQTTX客户端里连接这个服务器,并订阅senser/sim7020c主题,如果我用pico发布消息,那么客户端就会收到这些消息。

然后开始在树莓派pico里写程序:

import sim7020import utimeuart = machine.UART(0, 115200, txbuf=1024, rxbuf=1024)print(uart) sim = sim7020.SIM7020(uart)sim.reboot(force=True)sim.wait_ready() resp = sim.exec_cmd('AT+CMQNEW="",1883,12000,1024')print(resp)resp = sim.exec_cmd('AT+CMQCON=0,4,"slb-sim7020",3600,0,0,mastermu,password_from_mastermu_course')print(resp)while True:cmd = 'AT+CMQPUB=0,"sensor/sim7020c/slb-mqtt-test",0,0,0,16,"3132333435363738"'resp = sim.exec_cmd(cmd)print(resp)utime.sleep(30)

如果一切正常,每30秒树莓派Pico通过SIM7020C物联网卡发布(publish)一条消息到服务器,由于我的MQTTX客户端订阅了该主题,所以马上就会看到这条消息。

SIM7020与MQTT相关的AT命令先要用到三条:

AT+CMQNEW=“”,1883,12000,1024

四个参数分别是IP地址、端口、超时毫秒数和缓存大小。

AT+CMQCON=0,4,“slb-sim7020”,3600,0,0,mastermu,password

几个参数分别对应着:

<mqtt_id>,<version>,<client_id>,<keepalive_interval>,<cleansession>,<will_flag>[,<will_options>][,<username>,<password>]

AT+CMQPUB=0,“sensor/sim7020c/slb-mqtt-test”,0,0,0,16,“3132333435363738”

几个参数分别对应着:

<mqtt_id>,<topic>,<QoS>,<retained>,<dup>,<message_len>,<message>

这里面的消息是十六进制编码,代表着“12345678”。

程序稍微修改一下,可以把板载的温度值通过MQTT每隔30秒发送到服务器。

import sim7020import utimeimport ubinasciifrom ulogging import *def curTime():now = machine.RTC().datetime()return "{:02d}:{:02d}:{:02d}".format(now[4], now[5], now[6])uart = machine.UART(0, 115200, txbuf=1024, rxbuf=1024)print(uart) sim = sim7020.SIM7020(uart)#sim.reboot(force=True)sim.reboot()sim.wait_ready() resp = sim.exec_cmd('AT+CMQNEW="",1883,12000,1024')print(resp)resp = sim.exec_cmd('AT+CMQCON=0,4,"slb-sim7020",3600,0,0,mastermu,password')print(resp)sensor_temp = machine.ADC(4) # Pico的温度传感器conversion_factor = 3.3 / (65535)while True:reading = sensor_temp.read_u16() * conversion_factor# 0.706V的时候是27度, 每增加0.001721V,温度下降1度temperature = 27 - (reading - 0.706)/0.001721strtemp = "Temperature: {:6.2f}".format(temperature)msg = ubinascii.hexlify(strtemp).decode()print(curTime())#cmd = 'AT+CMQPUB=0,"sensor/sim7020c/slb-mqtt-test",0,0,0,16,"3132333435363738"'cmd = 'AT+CMQPUB=0,"sensor/sim7020c/slb-mqtt-test",0,0,0,' + str(len(msg)) + ',"' + msg + '"'print(cmd)resp = sim.exec_cmd(cmd)print(resp)utime.sleep(30)

推荐阅读:

树莓派Pico开发系列文章

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。