MQTT是什么?
MQTT是一种通信协议,基于TCP/IP协议,广泛应用在物联网(IoT)领域.
MQTT的优点
- 轻量且高效:MQTT 客户端非常小,只需要最少的资源,因此可以在小型微控制器上使用。MQTT 消息头很小,可以优化网络带宽。
- MQTT 允许在设备到云和云到设备之间进行消息传递。这使得向一组事物广播消息变得容易。
- MQTT 可以扩展到与数百万物联网设备连接。
- 可靠的消息传递:消息传递的可靠性对于许多物联网用例来说非常重要。这就是为什么 MQTT 有3个定义的服务质量级别: 0-最多一次,1-至少一次,2-正好一次
- 对不可靠的网络的支持: 许多物联网设备通过不可靠的蜂窝网络连接。MQTT 对持久会话的支持减少了重新连接客户机与代理的时间。
- 安全性保障:MQTT 使得使用 TLS 加密消息和使用现代身份验证协议(如 OAuth)对客户端进行身份验证变得很容易。
MQTT的设计原理
MQTT采取发布/订阅模式,发布者和订阅者不像C/S模式中进行直接通信,两者之间的通信通过第三方代理,如下图所示:
MQTT关键功能
MQTT通过在空间上解耦发布者和订阅者,使得两者不需要知道对方的信息,只需要知道第三方代理的IP地址和端口号就可以实现发布或者接收信息.
MQTT对发布者和订阅者进行时间上的解耦,虽然大部分情况发布者和订阅者都是同时在线,但是如果确实有必要,MQTT也可以实现为离线订阅者缓存订阅信息.
MQTT进行异步工作.因为大部分的客户端都是异步进行的,会采取callback的形式,所以任务不需要阻塞在等待消息或者发布消息过程中.
MQTT基于主题来过滤消息.每个消息都带有自己的主题.代理通过主题来决定某个订阅者是否可以获取到对应的消息.
MQTT有三个服务质量分级.
MQTT与消息队列的区别
消息队列存储信息直到这些信息被消费,如果没有人消费,这些信息会一直保存在消息队列里,就像在MQTT中没有订阅者订阅信息一样.
消息队列的消息只能被一个客户端消费.MQTT正好相反:每一个订阅者都可以获取到消息.
消息队列必须在队列被命名并且创建之后才能发布或者消费消息,MQTT的主题则非常灵活,可以在运行中进行创建.
发布
MQTT客户端一旦连接服务器代理之后就可以发布消息,每个消息都包含topic(主题)以及payload(消息内容)两部分,服务器代理通过topic来过滤消息内容来决定发送哪些信息给到对应的订阅者.MQTT是数据无关的,客户端来决定payload的组织结构.发布者决定发送的数据是二进制数据或文本数据甚至是xml,json.
发布的信息包含以下几个参数:
Package Identifier:用来唯一标识一个信息, 这个id只在qos大于0的情况下才有意义,客户端或者代理服务器来设置这个id信息.
Topic Name: 通常是一个带分级结构的带/的简单字符串,例如"myhome/livingroom/temperatu