MQTT—一种适用于物联网的实时可靠消息传输协议

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种构建于TCP/IP协议上基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。做为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。

MQTT协议运行在TCP/IP或其他网络协议,提供有序、无损、双向连接。

特点:       

1.使用的发布/订阅消息模式,它提供了一对多消息分发,以实现与应用程序的解耦。
2.对负载内容屏蔽的消息传输机制。
3.对传输消息有三种服务质量(QoS):
(1)最多一次,这一级别会发生消息丢失或重复,消息发布依赖于底层TCP/IP网络。即<=1
(2)至多一次,这一级别会确保消息到达,但消息可能会重复。即>=1
(3)只有一次,确保消息只有一次到达。即=1。在一些要求比较严格的计费系统中,可以使用此级别。
4.数据传输和协议交换的最小化(协议头部只有2字节),以减少网络流量
5.通知机制,异常中断时通知传输双方。

协议原理:

看起来很像kafka的架构设计,与kafka的区别:

资料:

MQTT协议:

http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.pdf               主流版本,可以参考的工业标准
https://legacy.gitbook.com/book/mcxiaoke/mqtt-cn/details                          中文版
https://mcxiaoke.gitbooks.io/mqtt-cn/content/mqtt/01-Introduction.html      中文版
一些其他资料
https://www.jianshu.com/p/5c42cb0ed1e9
https://www.jianshu.com/p/3d5b487c6860?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

业界参考实现:

https://github.com/mqtt/mqtt.github.io/wiki/software?id=software              包括服务端、Client、 SDK各种实现
重点参考下面几个服务端的实现,端上的在上面的列表中
C/C++
http://mosquitto.org/                                                  eclipse的项目,比较完善
go版本
https://emitter.io/                                                       go实现,比较完善
JAVA
https://github.com/moquette-io/moquette                  star数还可以,各方面比较全

 

Mosquitto Broker测试:

Mosquitto是一款实现了MQTT v5.0、v3.1协议的开源消息代理软件,提供轻量级的,支持发布/订阅的的消息推送模式,适合在从低功耗单板计算机到完整服务器的所有设备上使用。

centos安装:yum install mosquitto

# 1.简单测试
启动服务:mosquitto -d -p 1883
订阅主题 mosquitto_sub -h 127.0.0.1 -p 1883 -v -t testtopic 
发布内容 mosquitto_pub -h 127.0.0.1 -p 1883 -t testtopic -m "Hello World"

# 2.增加mqtt+ssl支持
cd /home/work/project/study/ssl/
wget https://github.com/yanjingang/study/blob/master/ssl/generate-*CA.sh
./generate-ServerCA.sh   #生成服务端ssl测试用证书
./generate-ClientCA.sh   #生成客户端测试用证书

vim /etc/mosquitto/mosquitto.conf
  port 1883   # mqtt 协议

  listener 8883  # mqtt+ssl 协议
  cafile /home/work/project/study/ssl/ca.crt         # CA根证书
  certfile /home/work/project/study/ssl/mars.crt     # mosquitto服务器上的证书
  keyfile /home/work/project/study/ssl/mars.key      # mosquitto服务器上的密钥

  #listener 1884  # websocket 协议
  #protocol websockets

  #listener 8884  # websocket+ssl 协议
  #protocol websockets
  #cafile /home/work/project/study/ssl/ca.crt
  #certfile /home/work/project/study/ssl/mars.crt 
  #keyfile /home/work/project/study/ssl/mars.key
  #crlfile /home/work/project/study/ssl/ca.crl

#重启mqtt broker服务
mosquitto -c /etc/mosquitto/mosquitto.conf -v

# mqtt + ssl协议订阅
mosquitto_sub -h 127.0.0.1 -p 8883 -t testtopic -v --cafile ca.crt --cert client.crt --key client.key

百度天工云MQTT Broker测试:

1.新建天工云项目、物、物影子(Broker)

参考:https://console.bce.baidu.com/iot2/hub/project/list
物接入与裸MQTT相比的优点:
-通过物模型控制各类通信规范(消息格式规范/校验、消息唯一IDtrace);自动的topic创建;支持设备在线状态、权限、反控等常见物联网特性
-各端直接与天工通信,通信不需要插入中间层做转发控制,减少转发环节、降低时延、提高服务稳定性
-内置的时序库,cache影子shandow数据

2.mqtt.fx client测试

配置

 pub

检查影子状态

订阅监听设备数据变化

天工云的限制:

3.python paho.mqtt.client 测试

sub订阅:

pub发布:

*代码详见:https://github.com/yanjingang/study/tree/master/lot/mqtt/client/mqtt-py

 

参考:

MQTT 协议和 mosquitto

Eclipse Mosquitto MQTT broker

MQTT Mosquitto broker – Client Authentication and Client Certificates

百度云天工平台+20行代码DIY一个智能家居环境监测站

MQTT客户端代码示例

天工云物接入IoT -系统限制

ESP8266连接百度云天工

欢迎关注下方“非著名资深码农“公众号进行交流~

发表评论

邮箱地址不会被公开。