在 MQTT 中的服务质量水平划分
“临终遗嘱”信息
该协议提供了检测方式,利用KeepAlive机制在客户端异常断开时发现问题。因此当客户端电量耗尽、崩溃或者网络断开时,消息代理会采取相应措施。
客户端会向任意点的消息代理发送“临终遗嘱”(LWT)信息,当消息代理检测到客户端离线(连接并未关闭),就会发送保存在特定主题上的 LWT 信息,让其它客户端知道该节点已经意外离线。
安全性
MQTT(及通常的物联网设备)的安全性是一个相当大的主题,之后我们会详加描述,不过在本文中仅涉及两个主要的安全性功能:身份验证与加密。
身份验证是通过在 MQTT 连接包中发送用户名与密码来实现,几乎所有消息代理与客户端在实现时都支持这一功能。但由于信息太容易被拦截,为了避免,应当尽可能地使用安全传输层协议(TLS)。
协议本身未提供加密功能,但由于 MQTT 是在 TCP 上层运行的,我们可以很容易地利用 TLS 来提供加密连接。但这确实增加了发送与接收信息的计算复杂性,不但在约束系统中会造成问题,还会影响消息代理的性能。稍后我们会就这个问题进行更多讨论。
消息代理软件
有许多不同方式实现的可用消息代理,最常见的系统包括:
Mosquitto —— 这是最早在生产环境中可用的消息代理之一,以 C 语言编写,提供多种配置与高性能。
Mosca —— 以 Node.js 编写,可嵌入 Node 应用或以独立可执行文件的形式运行。由于配置简单并具有可扩展性,它也是我们最喜欢的消息代理,具有高性能的优点。
RSMB —— IBM 对 MQTT 协议的实现,也是最不常用的选项之一,不过它是一个用C语言编写的成熟系统。
HiveMQ —— HiveMQ 是一种相对较新的消息代理,面向企业环境,在博客上有很多关于 MQTT 不错的信息。
客户端库
几乎包含了所有流行语言的客户端库,想要具体了解的话,Paho 项目会是你的最佳选择。这个项目隶属于 Eclipse,旨在提供各种语言尽可能多样化的 MQTT 客户端实现参考。这是个很好的资源,包含以C、Java、Python、Javascript等语言编写的可用客户端。
结论
MQTT 是一个理想的协议,它在物联网与 M2M 通信中的应用是无限的。如果你需要轻量级的消息传输系统,那么它会是很好的选择,而且在未来几年中很可能会流行起来。希望本文能帮助读者对 MQTT 做以了解。
参考阅读:异步消息传递技术的比较:JMS、AMQP和MQTT