MQTT 代表消息队列遥测传输,它是一种功能强大的消息传输协议,主要用于机器对机器 (M2M) 和物联网 (IoT) 通信上下文。 MQTT 在这些情况下是首选,因为它易于实施,并且非常适合资源有限的设备。
在本文中,我们将开发一个使用 MQTT 协议的 Android 移动应用程序。
MQTT vs HTTP
MQTT 的竞争对手是旧的、但金子般的 HTTP 协议。
但是,为什么要为您的项目选择 MQTT 协议呢?
下面是一个简短的比较表,以更好地阐明主要方面:
综上所述,MQTT 相比 HTTP 更简单、更小、更安全。
MQTT 简而言之
MQTT 是一种发布-订阅客户端-服务器消息传输协议。
让我们明确一下发布-订阅和客户端-服务器架构的含义。
发布订阅
在发布/订阅架构中,发送者(发布者)不直接将消息传输给特定的接收者(订阅者),而是将发布的消息分类为“类别”(称为主题),而不知道可能有哪些订阅者。
发布者和订阅者从不直接相互联系。它们之间的连接由称为代理的第三个组件处理。
现实生活中发布/订阅模式的一个实际例子可能是报纸:记者(出版商)在报纸(经纪人)上写了几篇文章,但他们不知道有多少读者(订阅者)会阅读那篇文章。
客户端服务器
在客户端-服务器架构中,客户端连接到服务器以使用服务。
在 MQTT 上下文中,MQTT 客户端是通过网络连接到 MQTT 代理的设备。 MQTT 代理(服务器)提供的服务是发布和/或订阅一个或多个主题的可能性。在 MQTT 中,客户端可以是发布者和订阅者或两者兼而有之。
连接
在开始主题上的消息交换之前,客户端需要通过向代理发送 CONNECT 消息来启动通信。
通过此消息,客户端将自己呈现给提供以下主要信息的代理:
-
ClientID
ClientID 是代理用来标识客户端并存储有关它的信息(称为会话)的唯一 ID。
空的 ClientID 意味着“匿名”连接:因此,代理不会记住有关客户端的任何信息。
-
CleanSession
如果 CleanSession 设置为 false 并且代理存储了该客户端的信息,则代理使用现有会话并将先前排队的消息传递给客户端。
相反,如果该标志设置为 true,则意味着丢弃该客户端的所有现有会话和消息(如果 ClientId 为空,则为必需)。
-
KeepAlive
此间隔以秒为单位表示,定义了代理和客户端可以在不发送消息的情况下保持联系的最长时间。 客户端需要在 KeepAlive 期间定期向代理发送 PING 消息以保持连接处于活动状态。
-
Username and Password(可选)
客户端可以发送用户名和密码以提高通信安全性。
-
WillMessage (可选)
客户端可以以 MQTT 消息和主题的形式指定其最后的遗嘱消息。当客户端“严重”断开连接时,代理将代表客户端发送此消息。
主题
如前所述,MQTT 代理使用主题来决定哪个订阅者接收哪个消息。
客户端在使用主题之前不会创建主题。服务器接受每个有效主题而无需任何初始化。
主题是具有以下特征的字符串:
- 长度至少为 1 个字符
- 区分大小写
- 由一个或多个以“/”分隔的级别组成
假设您的房子周围散布着温度传感器。这些传感器使用 MQTT 与恒温器通信,恒温器使用此信息来调节家庭供暖系统。
每个传感器(发布者)通过发布特定的 MQTT 主题来传达其温度,恒温器(订阅者)通过检查这些主题来监控温度;下面是主题结构的示例:
发布
订阅
退订
Android 开发MQTT
示例/简单的 MQTT Android 应用程序
连接到 MQTT 代理
向代理发布主题
从代理订阅主题
断开连接
源代码
详情参阅 - 亚图跨际