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测试
配置
检查影子状态
订阅监听设备数据变化
天工云的限制:
3.python paho.mqtt.client 测试
sub订阅:
pub发布:
*代码详见:https://github.com/yanjingang/study/tree/master/lot/mqtt/client/mqtt-py
参考:
MQTT Mosquitto broker – Client Authentication and Client Certificates