在这里插入图片描述

踏入密不透风的地铁门口,轻盈地穿行在薄雾弥漫的阳光中,一缕柔和的光芒轻抚双眼,略显痛楚。北漂的生活从四道桥地铁站启程,让我们鼓起勇气,加油前行吧!让我们认识下MQTT:

MQTT(Message Queuing Telemetry Transport)是一种轻量级的、基于发布/订阅模式的消息传输协议。
搭建一个MQTT服务器可以通过使用开源的MQTT服务器软件,例如 Eclipse Mosquitto。

MQTT 是一种基于标准的消息传递协议或规则集,用于机器对机器的通信。
智能传感器、可穿戴设备和其他物联网(IoT)设备通常必须通过带宽有限的资源受限网络传输和接收数据。
这些物联网设备使用 MQTT 进行数据传输,因为它易于实施,并且可以有效地传输物联网数据。MQTT 支持设备到云端和云端到设备之间的消息传递。

一、Linux环境下使用Mosquitto搭建MQTT服务器的基本步骤:

步骤一:安装Mosquitto

在终端中执行以下命令安装Mosquitto:

sudo apt-get update
sudo apt-get install mosquitto mosquitto-clients

步骤二:启动Mosquitto服务

安装完成后,Mosquitto服务会自动启动。你可以使用以下命令来检查服务状态:

sudo systemctl status mosquitto

步骤三:配置Mosquitto

默认情况下,Mosquitto会监听1883端口。你可以在配置文件中进行更改。配置文件通常位于 /etc/mosquitto/mosquitto.conf。你可以编辑该文件来修改监听端口等设置。

步骤四:测试Mosquitto服务器

使用Mosquitto提供的命令行工具进行测试。打开两个终端窗口,一个用于发布消息,另一个用于订阅消息。

在一个窗口中,执行以下命令订阅一个主题(Mosquitto CLI(也有客户端见下文)):

# 指定IP
mosquitto_sub -h localhost -t test
# 不指定IP
mosquitto_sub -t 'test/topic' -v

在另一个窗口中,执行以下命令发布消息:

# 指定ip
mosquitto_pub -h localhost -t test -m "Hello, MQTT!"
# 不指定IP
mosquitto_pub -t 'test/topic' -m 'hello world'

你应该能够在订阅窗口中看到发布的消息。

步骤五:对外提供服务

如果你想要使Mosquitto服务器对外提供服务,你需要确保相关端口已经在防火墙中开放,以及你的路由器或防火墙允许外部设备连接。
默认情况下,Mosquitto使用1883端口。

请注意,在将MQTT服务公开到互联网时,务必考虑安全性。你可以通过使用用户名和密码进行身份验证、使用TLS/SSL加密等方式来增加安全性。

二、设置账户密码

在 Mosquitto 中,你可以通过以下步骤设置用户名和密码来进行身份验证:

步骤一:创建密码文件

首先,你需要创建一个用于存储用户名和密码的文件。可以使用 mosquitto_passwd 命令来生成这个文件。例如:

sudo mosquitto_passwd -c /etc/mosquitto/passwd your_username

这将提示你输入密码并将其存储在指定的文件中(在上面的例子中是 /etc/mosquitto/passwd)。如果文件已经存在,可以省略 -c 选项。

步骤二:编辑 Mosquitto 配置文件

编辑 Mosquitto 的配置文件,通常位于 /etc/mosquitto/mosquitto.conf。

sudo nano /etc/mosquitto/mosquitto.conf

在配置文件中,添加以下行来指定使用密码文件:

password_file /etc/mosquitto/passwd

步骤三:重启 Mosquitto 服务

在保存了配置文件之后,重新启动 Mosquitto 服务以使更改生效。

sudo systemctl restart mosquitto

步骤四:测试

测试用户名和密码是否配置正确。你可以使用 mosquitto_pub 和 mosquitto_sub 命令行工具进行测试。

例如,发布消息的命令:

mosquitto_pub -h localhost -t test -m "Hello, MQTT!" -u your_username -P your_password

订阅消息的命令:

mosquitto_sub -h localhost -t test -u your_username -P your_password

确保将 your_username 替换为你设置的用户名,your_password 替换为相应的密码。

请注意,存储密码的文件应该保持安全,以免泄露用户凭证。

这样,你就成功设置了 Mosquitto 服务器的用户名和密码认证。在生产环境中,强烈建议使用TLS/SSL来保护通信,以及其他更高级的安全措施。

三、MQTT的客户端

客户端软件:MQTT Explorer,地址:https://github.com/thomasnordquist/MQTT-Explorer/releases

在 MQTT 协议中,客户端标识符(Client Identifier)是一个用于唯一标识 MQTT 客户端的字符串。
客户端标识符通常是客户端连接到 MQTT 服务器时提供的,并且必须是唯一的。

服务器日志: MQTT 服务器通常会记录连接和断开的日志信息,包括客户端标识符。查看服务器的日志文件可能是最简单的方法。
例如,在 Mosquitto 服务器上,你可以查看 /var/log/mosquitto/mosquitto.log 文件。

以下是有关 MQTT 客户端标识符的一些要点:

  • 唯一性: 每个连接到 MQTT 服务器的客户端都必须有一个唯一的客户端标识符。这是为了确保在 MQTT 会话中每个客户端都能被唯一标识。
  • 长度限制: 客户端标识符的长度在规范中没有特别的限制,但是通常应该保持在 1 到 23 个字符之间。超出这个范围可能导致一些 MQTT 服务器拒绝连接。
  • 空客户端标识符: 客户端也可以选择在连接时不提供客户端标识符,此时客户端将被视为匿名客户端。然而,这样的匿名客户端的持久性会受到限制,因为它们在重新连接时可能会得到新的客户端标识符。
  • 清理会话标志: 客户端标识符也与 “Clean Session” 标志相关。如果 “Clean Session” 标志被设置为 true,表示客户端请求一个无状态的会话,服务器会在客户端断开连接时丢弃该客户端的状态信息,包括订阅信息等。
  • 使用示例: 在 MQTT 连接时,客户端通常通过设置客户端标识符参数进行身份识别。例如,使用 Paho MQTT Python 客户端库,你可以这样设置:
import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
print(f"Connected with result code {rc}")
print(f"Client ID: {client._client_id}")

client = mqtt.Client(client_id="your_client_id")
client.on_connect = on_connect

client.connect("your_broker_address", 1883, 60)

client.loop_forever()

在上面的例子中,“my_unique_client_id” 是一个示例客户端标识符。

请注意,为了确保客户端标识符的唯一性,通常建议在使用时采用一些唯一性生成的策略,如加上时间戳或设备相关信息。
确保你的 MQTT 服务器和应用程序逻辑都能处理并期望唯一的客户端标识符。

四、MQTT使用场景

MQTT(Message Queuing Telemetry Transport)是一种轻量级的、开放标准的通信协议,适用于物联网(IoT)等场景。
下面是一些 MQTT 的使用案例,展示了它在不同领域中的应用:

物联网设备通信:

场景描述: 在物联网环境中,许多设备需要相互通信,共享数据。
解决方案: 使用 MQTT 协议实现设备之间的实时通信。设备可以发布传感器数据到特定的主题,其他设备可以订阅这些主题以获取实时数据。

智能家居:

场景描述: 在智能家居系统中,各种智能设备(如智能灯泡、温度传感器)需要协同工作。
解决方案: 使用 MQTT 实现设备之间的消息传递。例如,当温度传感器检测到温度变化时,它可以发布消息到主题,通知空调调整温度。

实时位置追踪:

场景描述: 在物流、车辆追踪等场景中,实时追踪设备的位置信息。
解决方案: 设备可以通过 MQTT 发布位置信息到特定主题,监控中心或其他设备可以订阅这些主题以获取实时位置数据。

远程传感器监测:

场景描述: 在农业、工业等领域,需要监测远程传感器的数据。
解决方案: 使用 MQTT 实现传感器数据的远程监测。传感器可以通过 MQTT 将数据发布到云端主题,用户或其他系统可以订阅这些主题以获取数据。

消息通知系统:

场景描述: 在应用中需要实现消息推送通知。
解决方案: 应用可以使用 MQTT 实现实时的消息通知。当有新消息时,应用服务器可以向特定主题发布消息,客户端可以订阅这些主题以获取实时通知。

工业自动化:

场景描述: 在工业控制系统中,需要实现设备之间的实时通信。
解决方案: 使用 MQTT 实现工业设备的实时状态监控和控制。设备可以发布状态信息到主题,控制中心可以订阅这些主题以实时监控和控制设备。

这些案例展示了 MQTT 在不同领域中的灵活应用。它的轻量级、发布/订阅模式、低带宽消耗等特性使得它成为物联网和实时通信领域的一种理想选择。

参考

  • https://aws.amazon.com/cn/what-is/mqtt/
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐