MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(Publish/Subscribe)模式的轻量级通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布,目前最新版本为v3.1.1。MQTT最大的优点在于可以以极少的代码和有限的带宽,为远程设备提供实时可靠的消息服务。做为一种低开销、低带宽占用的即时通讯协议,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
众所周知,TCP/IP参考模型可以分为四层:应用层、传输层、网络层、链路层。TCP和UDP位于传输层,应用层常见的协议有HTTP、FTP、SSH等。MQTT协议运行于TCP之上,属于应用层协议,因此只要是支持TCP/IP协议栈的地方,都可以使用MQTT。
*基于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的过滤,将特定的消息转发给特定的订阅者。
发布者Publisher -> 代理Broker -> 订阅者Subscriber
连接Connect / disconnect 发布Publish 订阅Subscribe / unsubscribe
服务质量QoS(Quality of Service) 最多一次:发送一次,无需回复,消息有可能丢失。(传感器数据) 至少一次:发送者没有收到接收者的PUBACK,过一段时间会重新发送,消息可能重复。 只有一次:发送过程经过 PUBREC、PUBREL、PUBCOMP,保证一个包只收到一次 保留消息Retained Messages 持续会话Persistent Session 最后遗嘱Last will & Testament SYS主题 订阅位于$SYS层次下的主题来查看服务器的状态信息
基于主题:订阅感兴趣的主题Topic 基于内容:订阅感兴趣的消息的过滤查询 基于类型:基于消息的类型进行过滤