MQTT入门(1)- 简要介绍
程序员文章站
2022-06-12 14:16:08
...
MQTT(MQ Telemetry Transport)消息队列遥测传输协议
是TCP / IP协议之上,基于发布Publish/订阅Subscribe模式,机器到机器(M2M)通信,二进制传输的轻量级消息协议。1999年IBM开发,2010年对外免费开放,2014年正式成为OASIS的官方标准。
虽然名称里有MQ,但它不是Message Queue,它并不会保证消息的顺序。
和 RabbitMQ 相比:考虑在低带宽、不可靠的4G/LTE网络上运行(可靠性),多用于IoT、M2M、IM。
和 HTTP 相比:通信量减少(低带宽)、设备耗电量减少(低功耗)、支持消息推送、Pub/Sub模型,双向1对多/多对多通信等。
MQTT最小的packet大小是只有2个字节的header。
目前百度、阿里、腾讯、京东、移动等都有物联网平台,而MQTT是物联网中相当重要的角色。
物联网环境下,大量的device或sensor需要将很小的数据定期发送出去,并接受外部传回来的数据。这样的数据交换是大量存在的。
MQTT通过Broker转发消息,所以可以穿透NAT,类似的协议还有AMQP、XMPP等。
MQTT协议里面是按照设备一直在线设计的,数据都是保存在内存里的,所以MQTT是比较吃内存的。
官方网站:http://mqtt.org/
默认端口:1883/8883(TLS)
最新标准:MQTT v3.1.1(OASIS)
英文版:http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/mqtt-v3.1.1.html
中文版:https://github.com/mcxiaoke/mqtt
下一个版本MQTT v5.0也即将很快发布。(没有 MQTT v4.0,因为 protocol level v3.1是3,而v3.1.1是4)
https://blog.codecentric.de/en/2017/11/hello-mqtt-version-5-0/
(1)基本概念
Publish/Subscribe
替代传统的客户端/服务器模型
多维度解耦
空间解耦:发布者和订阅者不需要知道对方
时间解耦:发布者和订阅者不需要同时运行(离线消息)
同步解耦:发布和接受都是异步通信,无需停止任何处理
订阅者可以取消订阅
Messages
Topics
树状结构命名用“/”区分,类似于REST,比如:home/light/brightness
通配符:
+ 单层通配符 如,a/b/+” 匹配 “a/b/c1” 和 “a/b/c2”,但是不匹配 “a/b/c/d”
# 多层通配符 如 “a/b/c/#" 可以匹配 “a/b/c”、“a/b/c/d” 和 “a/b/c/d/e”
命名规范:http://tinkerman.cat/mqtt-topic-naming-convention/
Server/Broker
负责接收消息,过滤消息并转发给消息订阅者
Client
Broker之外的都是客户端,可以发布或订阅消息
*** pub/sub模型是基于topic的消息转发系统,每个消息都会被贴上一个特定的topic,
消息并不会直接发送给订阅者,而是发布者首先将带有topic的消息发送broker。
订阅者可以从broker订阅自己相关的topic,当broker接收到发布过来的消息后,
broker开始执行基于topic的过滤,将特定的消息转发给特定的订阅者。
(2)三种角色
发布者Publisher -> 代理Broker -> 订阅者Subscriber
(3)14种消息类型
(4)功能
连接Connect / disconnect
发布Publish
订阅Subscribe / unsubscribe
(5)特性
服务质量QoS(Quality of Service)
最多一次:发送一次,无需回复,消息有可能丢失。(传感器数据)
至少一次:发送者没有收到接收者的PUBACK,过一段时间会重新发送,消息可能重复。
只有一次:发送过程经过 PUBREC、PUBREL、PUBCOMP,保证一个包只收到一次
保留消息Retained Messages
持续会话Persistent Session
最后遗嘱Last will & Testament
SYS主题
订阅位于$SYS层次下的主题来查看服务器的状态信息
(6)消息过滤
基于主题:订阅感兴趣的主题Topic
基于内容:订阅感兴趣的消息的过滤查询
基于类型:基于消息的类型进行过滤
(7)相关软件
MQTT只是个协议标准,实际的运用还需要各种软件来实现。
a - Servers/Brokers
VerneMQ https://vernemq.com/
EMQTT http://emqtt.io/
Mosquitto https://mosquitto.org/
其他:https://github.com/mqtt/mqtt.github.io/wiki/servers
b - Client Library
Eclipse Paho https://www.eclipse.org/paho/
MQTT.js https://github.com/mqttjs/MQTT.js
更多的可以参考:http://mqtt.org/software
(8)MQTT与消息队列的区别
MQTT来自名为MQSeries的IBM产品,与MQ无关。
消息队列存储消息,直到它们被消耗
消息队列中只有一个消费者处理消息,MQTT中订阅主题的每个订阅者都会收到消息
消息队列要提前并明确创建,MQTT中可以随时实时创建
(9)MQTT与HTTP的区别
http://www.rfwireless-world.com/Terminology/MQTT-vs-HTTP.html
(10)开发模块IoT boards
ESP8266(Wifi芯片)、Arduino、Raspberry Pi(树莓派)、LattePanda(拿铁熊猫)
推荐阅读HiveMQ Blog里的两个关于MQTT的系列文章:
MQTT Essentials :https://www.hivemq.com/blog/mqtt-essentials/
MQTT Security Fundamentals :https://www.hivemq.com/blog/mqtt-security-fundamentals/
参考:
https://www.hivemq.com/blog/how-to-get-started-with-mqtt
https://dzone.com/refcardz/getting-started-with-mqtt
http://geek.csdn.net/news/detail/228329
http://geek.csdn.net/news/detail/229509
http://dataguild.org/?tag=mqtt
http://www.blogjava.net/yongboy/category/54835.html
https://codezine.jp/article/corner/508
https://www.programmableweb.com/api-university/how-and-why-to-provide-event-driven-streaming-apis
https://www.survivingwithandroid.com/2016/10/mqtt-protocol-tutorial.html
是TCP / IP协议之上,基于发布Publish/订阅Subscribe模式,机器到机器(M2M)通信,二进制传输的轻量级消息协议。1999年IBM开发,2010年对外免费开放,2014年正式成为OASIS的官方标准。
虽然名称里有MQ,但它不是Message Queue,它并不会保证消息的顺序。
和 RabbitMQ 相比:考虑在低带宽、不可靠的4G/LTE网络上运行(可靠性),多用于IoT、M2M、IM。
和 HTTP 相比:通信量减少(低带宽)、设备耗电量减少(低功耗)、支持消息推送、Pub/Sub模型,双向1对多/多对多通信等。
MQTT最小的packet大小是只有2个字节的header。
目前百度、阿里、腾讯、京东、移动等都有物联网平台,而MQTT是物联网中相当重要的角色。
物联网环境下,大量的device或sensor需要将很小的数据定期发送出去,并接受外部传回来的数据。这样的数据交换是大量存在的。
MQTT通过Broker转发消息,所以可以穿透NAT,类似的协议还有AMQP、XMPP等。
MQTT协议里面是按照设备一直在线设计的,数据都是保存在内存里的,所以MQTT是比较吃内存的。
官方网站:http://mqtt.org/
默认端口:1883/8883(TLS)
最新标准:MQTT v3.1.1(OASIS)
英文版:http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/mqtt-v3.1.1.html
中文版:https://github.com/mcxiaoke/mqtt
下一个版本MQTT v5.0也即将很快发布。(没有 MQTT v4.0,因为 protocol level v3.1是3,而v3.1.1是4)
https://blog.codecentric.de/en/2017/11/hello-mqtt-version-5-0/
(1)基本概念
Publish/Subscribe
替代传统的客户端/服务器模型
多维度解耦
空间解耦:发布者和订阅者不需要知道对方
时间解耦:发布者和订阅者不需要同时运行(离线消息)
同步解耦:发布和接受都是异步通信,无需停止任何处理
订阅者可以取消订阅
Messages
Topics
树状结构命名用“/”区分,类似于REST,比如:home/light/brightness
通配符:
+ 单层通配符 如,a/b/+” 匹配 “a/b/c1” 和 “a/b/c2”,但是不匹配 “a/b/c/d”
# 多层通配符 如 “a/b/c/#" 可以匹配 “a/b/c”、“a/b/c/d” 和 “a/b/c/d/e”
命名规范:http://tinkerman.cat/mqtt-topic-naming-convention/
Server/Broker
负责接收消息,过滤消息并转发给消息订阅者
Client
Broker之外的都是客户端,可以发布或订阅消息
*** pub/sub模型是基于topic的消息转发系统,每个消息都会被贴上一个特定的topic,
消息并不会直接发送给订阅者,而是发布者首先将带有topic的消息发送broker。
订阅者可以从broker订阅自己相关的topic,当broker接收到发布过来的消息后,
broker开始执行基于topic的过滤,将特定的消息转发给特定的订阅者。
(2)三种角色
发布者Publisher -> 代理Broker -> 订阅者Subscriber
(3)14种消息类型
(4)功能
连接Connect / disconnect
发布Publish
订阅Subscribe / unsubscribe
(5)特性
服务质量QoS(Quality of Service)
最多一次:发送一次,无需回复,消息有可能丢失。(传感器数据)
至少一次:发送者没有收到接收者的PUBACK,过一段时间会重新发送,消息可能重复。
只有一次:发送过程经过 PUBREC、PUBREL、PUBCOMP,保证一个包只收到一次
保留消息Retained Messages
持续会话Persistent Session
最后遗嘱Last will & Testament
SYS主题
订阅位于$SYS层次下的主题来查看服务器的状态信息
(6)消息过滤
基于主题:订阅感兴趣的主题Topic
基于内容:订阅感兴趣的消息的过滤查询
基于类型:基于消息的类型进行过滤
(7)相关软件
MQTT只是个协议标准,实际的运用还需要各种软件来实现。
a - Servers/Brokers
VerneMQ https://vernemq.com/
EMQTT http://emqtt.io/
Mosquitto https://mosquitto.org/
其他:https://github.com/mqtt/mqtt.github.io/wiki/servers
b - Client Library
Eclipse Paho https://www.eclipse.org/paho/
MQTT.js https://github.com/mqttjs/MQTT.js
更多的可以参考:http://mqtt.org/software
(8)MQTT与消息队列的区别
MQTT来自名为MQSeries的IBM产品,与MQ无关。
消息队列存储消息,直到它们被消耗
消息队列中只有一个消费者处理消息,MQTT中订阅主题的每个订阅者都会收到消息
消息队列要提前并明确创建,MQTT中可以随时实时创建
(9)MQTT与HTTP的区别
http://www.rfwireless-world.com/Terminology/MQTT-vs-HTTP.html
(10)开发模块IoT boards
ESP8266(Wifi芯片)、Arduino、Raspberry Pi(树莓派)、LattePanda(拿铁熊猫)
推荐阅读HiveMQ Blog里的两个关于MQTT的系列文章:
MQTT Essentials :https://www.hivemq.com/blog/mqtt-essentials/
MQTT Security Fundamentals :https://www.hivemq.com/blog/mqtt-security-fundamentals/
参考:
https://www.hivemq.com/blog/how-to-get-started-with-mqtt
https://dzone.com/refcardz/getting-started-with-mqtt
http://geek.csdn.net/news/detail/228329
http://geek.csdn.net/news/detail/229509
http://dataguild.org/?tag=mqtt
http://www.blogjava.net/yongboy/category/54835.html
https://codezine.jp/article/corner/508
https://www.programmableweb.com/api-university/how-and-why-to-provide-event-driven-streaming-apis
https://www.survivingwithandroid.com/2016/10/mqtt-protocol-tutorial.html
上一篇: PreparedStatement的用法
下一篇: mysql的学习-(六)子查询和多表操作