我是靠谱客的博主 寒冷可乐,最近开发中收集的这篇文章主要介绍树莓派63/100 - NB-IoT模块SIM7020使用MQTT发布消息,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

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

摘录其中的几个要点:

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

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

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

  • MQTT v3.1
  • MQTT v3.1.1 – 最常用的版本,与v3.1差异很小
  • MQTT v5 – 2018年1月获得批准,目前使用范围有限
  • MQTT-SN – 2013年左右指定,旨在通过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://mqtt.mastermu.cn
端口:1883
用户名:mastermu
密码:自己到课程里获得

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

在这里插入图片描述

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

import sim7020
import utime

uart = 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="mqtt.mastermu.cn",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=“mqtt.mastermu.cn”,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 sim7020
import utime
import ubinascii
from 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="mqtt.mastermu.cn",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.001721
    strtemp = "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开发系列文章

最后

以上就是寒冷可乐为你收集整理的树莓派63/100 - NB-IoT模块SIM7020使用MQTT发布消息的全部内容,希望文章能够帮你解决树莓派63/100 - NB-IoT模块SIM7020使用MQTT发布消息所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部