MQTT协议调研

作者: 古斟布衣 | 来源:发表于2019-05-01 22:13 被阅读1次

MQTT是基于二进制消息的发布/订阅编程模式的消息协议,最早由IBM提出,如今已经成物联网领域最成熟的协议之一。目前MQTT最新版本为3.1.1

1. 概述

MQTT协议包含MQTT客户端和MQTT服务器两种实体:

  1. MQTT客户端可以连接到服务器,向其他客户端以某个主题发布消息或者订阅其他客户端以以某个主题发布发布的消息;
  2. MQTT服务器端作为MQTT客户端之间的代理,负责转发和缓存消息,从而实现MQTT客户端之间的解耦;
  3. MQTT客户端发布的消息包含主题和消息体两部分,可以为不超过65535字节的任意字符串;MQTT客户端使用包含可选的通配符的主题表达式来订阅其他客户端发布的消息;
  4. MQTT将消息分为3级:QoS0(尽力而为、不保证订阅者收到)、QoS1(要求服务器确认以保证收到)和QoS2(要求服务器确保订阅者能且仅能收到1次)。

MQTT协议基于TCP协议的长连接模式,基本报文格式包括固定报文头、可选的可变报文头和载荷。其中可选的可变报文头和载荷与具体类型相关,而固定报文头则包含报文类型、标志和长度。MQTT协议支持如下报文类型:

类型 方向 描述
Reserved 0 N/A 保留
CONN ECT 1 客户端到服务端 客户端请求连接服务端
CONNACK 2 服务端到客户端 连接报文确认
PUBLISH 3 双向 发布消息
PUBACK 4 双向 QoS 1消息发布收到确认
PUBREC 5 双向 发布收到(保证交付第一步)
PUBREL 6 双向 发布释放(保证交付第二步)
PUBCOMP 7 双向 QoS 2消息发布完成(保证交互第三步)
SUBSCRIBE 8 客户端到服务端 客户端订阅请求
SUBACK 9 服务端到客户端 订阅请求报文确认
UNSUBSCRIBE 10 客户端到服务端 客户端取消订阅请求
UNSUBACK 11 服务端到客户端 取消订阅报文确认
PINGREQ 12 客户端到服务端 心跳请求
PINGRESP 13 服务端到客户端 心跳响应
DISCONNECT 14 客户端到服务端 客户端断开连接
Reserved 15 N/A 保留

MQTT协议作为传输层协议,只关注消息传输,不关注安全性。因此实现者需要考虑使用SSL/TLS和AES等加密技术。目前,基于SSL/TLS的MQTT客户端和服务器端比较成熟,但是该技术依赖与OpenSSL、mbedtls等复杂的基础设施,因此不适用与资源有限的物联网设备;而基于AES加密技术的的MQTT客户端和服务器端尚未发现,因此可选的方法是通过物联网网关进行中转从而保证安全性,但也会相应的增加成本。

2. MQTT基本功能验证

本文中选择的测试环境如下:

  • MQTT服务器端:Mosquitto托管测试端

  • MQTT桌面客户端: 可以从MQTT Desktop tools中选择,本文选择MQTT.fx;该客户端支持普通模式和TLS加密模式通信,包括连接、断开、发布、订阅、服务器状态、日志等;

    选区_065.png
  • MQTT手机客户端:可以从MQTT Mobile platforms中选择,本文选择iOS端的MQTTool;MQTTool为开源工具,支持普通模式通信,包括连接、断开、发布、订阅、连接状态等。

MQTT.fx可通过点击齿轮图标或从Extras->Edit Connection Profiles进入连接配置,具体配置如下图所示:

  • 普通连接


    MQTT.fx普通连接
  • TLS加密链接
    MQTT.fx加密连接
    其中,服务器地址、端口号、证书可以从Mosquitto托管测试端获取。

MQTTool配置与MQTT.fx类似,连接到Mosquitto托管测试端即可。

PC和手机客户端都连接到同一个测试服务器之后,即可通过发布、订阅功能进行通信:

  • MQTT.fx使用QOS0mqttfx-spc-test主题发布消息:

    MQTT.fx主题发布
  • MQTTool订阅mqttfx-spc-test主题,即可收到消息:

    MQTTool主题订阅

同样,也可以通过MQTTool发布消息,而MQTT.fx订阅相应主题以收取消息。

3. MQTT客户端和服务器端

MQTT服务器软件主页提供了主流服务器软件支持,包括Apache ActiveMQ、Apache ActiveMQ Artemis、Emitter等,各具特色,例如Apache ActiveMQ和Apache ActiveMQ Artemis可以支持多种协议,Emitter使用go语言编写等。

MQTT客户端库主页提供了多种语言版本的MQTT实现,其中Eclipse Paho Go使用go语言编写,MQTT-C仅有不到2000行代码等。

参考

  1. MQTT.ORG主页
  2. MQTT协议英文版
  3. MQTT协议中文版
  4. MQTT相关软件和库
  5. MQTT入门篇
  6. MQTT进阶篇
  7. SSL/TLS 握手过程详解

相关文章

  • MQTT协议调研

    MQTT是基于二进制消息的发布/订阅编程模式的消息协议,最早由IBM提出,如今已经成物联网领域最成熟的协议之一。目...

  • MQTT协议总结

    MQTT Protocol MQTT协议特性 一句话总结:MQTT是一个简单,轻量的消息发布/订阅协议。 MQTT...

  • 物联网mqtt协议

    mqtt协议学习与使用 一.先简单介绍一下mqtt协议 mqtt协议是基于Tcp/ip 的一种通信协议,是建立在可...

  • MQTT协议简单实践

    #一、 实验目的 学习了解MQTT协议,并会简单的使用。 #二、实验内容 熟悉使用MQTT协议,并利用MQTT进行...

  • MQTT 协议 Keep Alive 详解

    MQTT 协议中的 Keep Alive 机制 为什么需要 Keep Alive MQTT 协议[https://...

  • 使用 MQTT 实现发布订阅功能 发送订阅控制Esp8266

    Connect 连接 MQTT 协议基于 TCP/IP 协议,MQTT Broker 和 Client 都有需要有...

  • 基于MQTT协议实现Broker

    写在前面: 前一篇文字<<基于MQTT协议谈谈物联网开发>>主要叙述了MQTT协议的编解码以及基于MQTT协议的一...

  • 可视化网关编程系列教程-----(8)MQTT设备接入与控制

    MQTT 协议介绍 MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于...

  • iOS MQTTClient

    什么是MQTT MQTT(消息队列遥测传输),基于发布/订阅的消息协议。MQTT工作在TCP/IP协议族上,是为硬...

  • MQTT协议的基础概念

    1、MQTT协议简介 MQTT 是什么 MQTT 的全称为 Message Queue Telemetry Tra...

网友评论

    本文标题:MQTT协议调研

    本文链接:https://www.haomeiwen.com/subject/lhxgnqtx.html