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里写程序:
AT+CMQNEW=“mqtt.mastermu.cn”,1883,12000,1024
四个参数分别是IP地址、端口、超时毫秒数和缓存大小。
AT+CMQCON=0,4,“slb-sim7020”,3600,0,0,mastermu,password
几个参数分别对应着:
AT+CMQPUB=0,“sensor/sim7020c/slb-mqtt-test”,0,0,0,16,“3132333435363738”
几个参数分别对应着:
这里面的消息是十六进制编码,代表着“12345678”。
程序稍微修改一下,可以把板载的温度值通过MQTT每隔30秒发送到服务器。