MQTT代理 — mosquitto 介绍及使用


mosquitto 是一个流行的 MQTT 代理程序,用于消息的发布和订阅。

在Linux系统中安装Mosquitto的基本步骤如下:

1. 安装 Mosquitto

对于基于Debian的系统(如Ubuntu),使用以下命令安装Mosquitto:

sudo apt-get update
sudo apt-get install mosquitto

对于基于RPM的系统(如Fedora或CentOS),使用以下命令安装:

sudo dnf install mosquitto  # Fedora
sudo yum install mosquitto    # CentOS

2. 配置 Mosquitto

Mosquitto的配置文件通常位于/etc/mosquitto/mosquitto.conf。你可以使用文本编辑器编辑此文件,例如使用nanovim

sudo nano /etc/mosquitto/mosquitto.conf

或者:

sudo vim /etc/mosquitto/mosquitto.conf

配置 Mosquitto

配置文件通常位于 /etc/mosquitto/mosquitto.conf。重要的配置项包括:

  • pid_file:进程ID文件路径。
  • persistence:是否启用消息持久化。
  • persistence_location:持久化文件存储位置。
  • log_dest:日志文件路径。
  • log_type:日志类型,如错误、警告、通知等。
  • allow_anonymous:是否允许匿名访问。
  • password_file:用户密码文件路径。
  • acl_file:访问控制列表文件路径。
  • listener:监听的端口和协议。

3. 启动 Mosquitto 服务

安装完成后,你可以启动Mosquitto服务:

sudo systemctl start mosquitto

使Mosquitto服务在系统启动时自动启动:

sudo systemctl enable mosquitto

4. 验证安装

检查Mosquitto服务的状态:

sudo systemctl status mosquitto

5. 配置防火墙(如果需要)

如果你的系统使用防火墙,确保允许Mosquitto使用的端口(默认是1883):

sudo ufw allow 1883

6. 使用 Mosquitto(发布及订阅消息)

Mosquitto 是一个 MQTT 代理服务器,支持通过命令行工具 mosquitto_pubmosquitto_sub 来发布和订阅消息。以下是使用这些工具进行消息发布和订阅的无密码和有密码两种方式:

  • 订阅主题:

    mosquitto_sub -v -t test/topic
    
  • 发布消息到主题:

    mosquitto_pub -t test/topic -m "Hello MQTT"
    

1.无密码方式

在没有设置密码保护的情况下,任何人都可以连接到代理服务器并发布或订阅消息。

  • 订阅消息

    mosquitto_sub -h <broker_ip> -t <topic>
    

    这里的 <broker_ip> 是 MQTT 代理服务器的 IP 地址,<topic> 是你想要订阅的主题。

  • 发布消息

    mosquitto_pub -h <broker_ip> -t <topic> -m <message>
    

    <message> 是你想要发布到指定主题的消息内容。

2.有密码方式

如果 Mosquitto 代理服务器配置了密码保护,你需要在命令中指定用户名和密码。

  • 订阅消息(带密码)

    mosquitto_sub -h <broker_ip> -t <topic> -u <username> -P <password>
    

    <username> 是你的用户名,<password> 是对应的密码。

  • 发布消息(带密码)

    mosquitto_pub -h <broker_ip> -t <topic> -m <message> -u <username> -P <password>
    

注意事项

  1. 配置文件:Mosquitto 的密码保护通常在配置文件(如 mosquitto.conf)中设置,包括密码文件的位置和访问控制列表(ACL)。

  2. 密码文件:使用 mosquitto_passwd 命令可以生成密码文件,然后将其指定在 Mosquitto 配置文件中。

  3. 安全性:使用密码可以提高 MQTT 通信的安全性,防止未授权访问。

  4. 连接状态:使用 mosquitto_sub 订阅时,可以通过添加 -v 参数来显示更详细的连接状态信息。

  5. 客户端ID:在某些情况下,可能需要为客户端指定一个唯一的ID,可以使用 -c--clientid 参数。

  6. 服务质量(QoS):MQTT 支持不同的服务质量级别,可以通过 -q 参数指定。

  7. TLS/SSL:如果 Mosquitto 配置了 TLS/SSL 加密,可能还需要指定证书文件和相关参数来建立安全连接。

  8. 端口:默认情况下,MQTT 使用1883端口。如果代理服务器配置了不同的端口,需要使用 -p 参数指定。

例子:

1.无密码方式

假设 MQTT 代理服务器运行在本地(127.0.0.1),并且没有设置密码保护。

  • 订阅消息sh mosquitto_sub -h 127.0.0.1 -t test/topic 这个命令订阅本地代理服务器上的 test/topic 主题。

  • 发布消息sh mosquitto_pub -h 127.0.0.1 -t test/topic -m "Hello, MQTT!" 这个命令向 test/topic 主题发布一条消息 “Hello, MQTT!”。

2.有密码方式

假设 MQTT 代理服务器同样运行在本地,但配置了密码保护。用户名为 user1,密码为 password123

  • 订阅消息(带密码)sh mosquitto_sub -h 127.0.0.1 -t test/topic -u user1 -P password123 这个命令使用用户名 user1 和密码 password123 订阅
    test/topic 主题。

  • 发布消息(带密码)sh mosquitto_pub -h 127.0.0.1 -t test/topic -m "Hello, MQTT with auth!" -u user1 -P password123
    这个命令使用同样的用户名和密码向 test/topic 发布一条消息 “Hello, MQTT with auth!”。

3.注意事项

  • 确保在实际使用中替换 <broker_ip><topic><message><username><password> 为实际的值。
  • 如果 MQTT 代理服务器配置了 TLS/SSL 加密,可能需要添加额外的参数,如 --cafile(指向CA证书的文件)、--cert(客户端证书文件)和 --key(客户端私钥文件)。
  • 如果代理服务器监听的不是默认的1883端口,需要使用 -p 参数指定端口,例如 -p 8883
  • 使用 mosquitto_sub 时,如果希望看到客户端接收到的消息,可以添加 -v 参数来增加输出的详细程度。

密码配置:

步骤 1: 创建密码文件

Mosquitto 使用密码文件来存储用户账号和密码。你可以使用 mosquitto_passwd 命令行工具来创建和编辑密码文件。

  1. 生成密码文件sh sudo mosquitto_passwd /etc/mosquitto/passwd username 这里的 /etc/mosquitto/passwd 是密码文件的路径,username
    是你想要创建的用户名。系统会提示你输入密码。

  2. 输入密码: 按照提示输入密码,然后再次输入确认。密码将被安全地存储在密码文件中。

步骤 2: 配置 Mosquitto 以使用密码文件

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

  1. 打开配置文件sh sudo nano /etc/mosquitto/mosquitto.conf 或者使用vim文本编辑器。

  2. 启用密码文件: 在配置文件中,添加或确保以下行存在: conf password_file /etc/mosquitto/passwd 这告诉 Mosquitto 使用你刚才创建的密码文件。

  3. 允许或拒绝匿名访问: 根据需要,你可以配置 Mosquitto 来禁止匿名访问: conf allow_anonymous false 设置为 false 将禁止没有认证的用户连接到 Mosquitto。

步骤 3: 配置 ACL(可选)

如果需要更细粒度的控制,你可以使用访问控制列表(ACL)来定义用户的权限。

  1. 创建 ACL 文件sh sudo nano /etc/mosquitto/aclfile 创建一个新文件或编辑现有文件。

  2. 定义 ACL 规则: 在 ACL 文件中,你可以定义用户的读写权限。例如: conf user username topic readwrite test/topic 这表示用户 username
    有权限读写 test/topic 主题。

  3. 在 mosquitto.conf 中引用 ACL 文件conf acl_file /etc/mosquitto/aclfile

步骤 4: 重启 Mosquitto 服务

保存配置文件并重启 Mosquitto 服务以应用更改。

sh sudo systemctl restart mosquitto

步骤 5: 使用账号密码连接

现在,当尝试连接到 Mosquitto 时,你需要使用 -u-P 参数指定用户名和密码。

  • 订阅sh mosquitto_sub -h localhost -t test/topic -u username -P password

  • 发布sh mosquitto_pub -h localhost -t test/topic -m "Message" -u username -P password

确保将 usernamepassword 替换为你在密码文件中设置的用户名和密码。

密码配置
# 默认安装的mosquitto未启用密码,如果正式使用最好是启用密码验证。

# 使用-c 参数会导致清空密码文件,重新插入用户
mosquitto_passwd -c pwfile.example 用户名
 
# 不使用-c 表示追加用户,不影响旧用户
mosquitto_passwd  pwfile.example 用户名

# 经过以上配置,在linux下默认会在/etc/mosquitto/目录下生成密码的配置文件 pwfile.example。
# 也可以指定要生成的pwfile文件路径,使用以下形式:
mosquitto_passwd /etc/mosquitto/pwfile.example 用户名

# 修改/etc/mosquitto目录下的mosquitto.conf文件,启用密码。

# 设置是否允许匿名连接,如果禁止匿名连接,则需要配置账号、密码连接
allow_anonymous true
 
# 密码文件路径,禁止匿名连接配置,允许匿名则不用配置
password_file /etc/mosquitto/pwfile.example
 
# mqtt 协议配置,分为ipv4和ipv6两种,当前可以只配置启用一种
listener 1883 0.0.0.0
socket_domain ipv4
protocol mqtt
 
# ipv6
listener 1883 ::
socket_domain ipv6
protocol mqtt
 
# webscoket 协议配置,如果有的话需要配置,分为ipv4和ipv6两种,当前可以只配置启用一种
listener 1884 0.0.0.0
protocol websockets
socket_domain ipv4
 
listener 1884 ::
protocol websockets
socket_domain ipv4
 
# 允许的最大连接数,-1表示没有限制
max_connections -1

# 最后,重启mosquitto服务,配置文件的修改才能生效。
sudo systemctl restart mosquitto


7. 注意事项

  • 配置文件备份:在修改配置文件之前,建议备份原始配置文件。
  • 配置文件语法:确保配置文件中没有语法错误,否则Mosquitto可能无法启动。
  • 权限问题:Mosquitto可能需要特定的文件系统权限来正常工作,特别是当使用持久化功能时。
  • 日志文件:查看/var/log/mosquitto/mosquitto.log文件以获取有关错误的信息。
  • 网络问题:确保网络配置正确,特别是如果你打算从外部网络访问Mosquitto。

通过遵循这些步骤,你应该能够在Linux系统上成功安装并运行Mosquitto。如果遇到任何问题,请检查日志文件或使用适当的命令行工具进行故障排除。

8.问题描述及解决

问题描述:

安装成功并启动后,发现外网并不能成功访问到,防火墙也放行了1883端口,但是仍然无法访问到1883端口,为什么会连不上Linux上的mosquitto服务器?

原因是Ubuntu上的mosquitto服务默认是 local only mode,当使用sudo service mosquitto start,再使用sudo service mosquitto status是查看不到当前服务器是运行在哪种模式,当使用mosquitto -v这个命令时可以查看当前服务器是运行在哪种模式。

还有个更简单的方法,排查此类问题。就是查看linux系统下开放了哪些端口,端口的使用情况。

使用netstat命令,如:

netstat -ntpl
netstat -ntl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       
tcp        0      0 0.0.0.0:199             0.0.0.0:*               LISTEN      
tcp        0      0 0.0.0.0:5355            0.0.0.0:*               LISTEN      
tcp        0      0 127.0.0.1:40590         0.0.0.0:*               LISTEN      
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      
tcp        0      0 0.0.0.0:8088            0.0.0.0:*               LISTEN      
tcp        0      0 0.0.0.0:8089            0.0.0.0:*               LISTEN      
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      
tcp        0      0 0.0.0.0:1883            0.0.0.0:*               LISTEN      
tcp        0      0 :::5355                 :::*                    LISTEN      
tcp        0      0 :::8080                 :::*                    LISTEN      
tcp        0      0 :::80                   :::*                    LISTEN      
tcp        0      0 :::22                   :::*                    LISTEN      
tcp        0      0 :::4059                 :::*                    LISTEN      
tcp        0      0 :::443                  :::*                    LISTEN      
tcp        0      0 :::1883                 :::*                    LISTEN      
tcp        0      0 :::3490                 :::*                    LISTEN   

在网络编程和系统管理中,IP地址扮演着至关重要的角色。
127.0.0.1 (IPv4 环回地址)

  • 定义:这是IPv4协议中的一个特殊地址,称为环回地址或本地回环地址。
  • 用途:用于测试网络软件或访问本机上的TCP/IP服务,如Web服务器、数据库等。
  • 行为:发送到这个地址的流量不会离开本地计算机,而是直接在系统内部路由。
  • 例子:在浏览器中输入http://127.0.0.1,如果本地运行着Web服务器,通常会看到本地服务器的页面。

0.0.0.0 (IPv4 通配符地址)

  • 定义:这不是一个有效的普通IP地址,而是一个特殊的地址,用作通配符。
  • 用途:当一个网络服务或应用程序绑定到0.0.0.0时,它表示该服务监听所有可用的IPv4网络接口。
  • 行为:接受任何IPv4地址的传入连接,使得服务可以从局域网、广域网等任何位置被访问。
  • 例子:一个Web服务器绑定到0.0.0.0,意味着它可以接受来自任何IP地址的访问请求。

IPv6 环回地址

  • 两种表示形式
    • ::1:这是标准的IPv6环回地址,与IPv4的127.0.0.1等价。
    • :::这不是环回地址,而是IPv6地址的通配符,类似于IPv4的0.0.0.0。它用于表示IPv6中的所有地址。
  • 用途::1用于IPv6网络中的本地主机通信,类似于IPv4中的127.0.0.1。
  • 行为:IPv6应用程序可以使用::1来访问本地主机上的服务。

区别和使用场景

  • 127.0.0.1::1 都是用来访问本机服务的,但前者用于IPv4,后者用于IPv6。
  • 0.0.0.0:: 都用作监听所有网络接口的通配符,但前者用于IPv4,后者用于IPv6。
  • 在配置服务时,如果希望服务只能从本机访问,可以绑定到127.0.0.1或::1。
  • 如果希望服务可以从任何网络接口访问,可以绑定到0.0.0.0(IPv4)或::(IPv6)。

注意事项

  • 使用环回地址可以确保流量不会进入或离开本地计算机,适合测试和开发。
  • 使用通配符地址时要谨慎,确保服务的安全性,避免不必要的公开。
  • 在IPv6环境中,应用程序可能需要同时支持IPv4和IPv6,这可能涉及到更复杂的网络配置和编程。

解决方法:

修改/etc/mosquitto目录下的mosquitto.conf文件,开放端口和允许访问的地址即可。

# 设置允许匿名连接,如果禁止匿名连接,则需要配置账号、密码连接
allow_anonymous true
 
# mqtt 协议配置,分为ipv4和ipv6两种,当前可以只配置启用一种
listener 1883 0.0.0.0
socket_domain ipv4
protocol mqtt

上述部分内容原文出处: 博客链接:https://blog.csdn.net/yyz_1987/article/details/131607972

在这里插入图片描述

  • 21
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: MQTT是一种轻量级的通讯协议,适用于物联网设备之间的通信。Mosquitto是一款开源的MQTT代理服务器,它提供了可靠稳定的MQTT消息传递服务。为了满足用户的需求,开发人员推出了一款名为MQTT测试工具的软件,它可以用来测试Mosquitto代理服务器的性能和功能。 MQTT测试工具可以支持多种MQTT协议,包括QoS0、QoS1和QoS2。此外,它还支持通过清除session或发送遗嘱消息来测试Mosquitto的断开连接机制。MQTT测试工具可以达到每秒数千条消息的处理速度,可帮助用户提高Mosquitto代理服务器的性能和功能。 通过使用MQTT测试工具可以实现较低的错误率和较高的消息交付率,从而提高设备之间的通信效率和数据传输的质量。此外,它还支持各种操作系统,如Windows、Linux和MacOS等。 总之,MQTT测试工具是一款非常实用的软件,适用于测试MQTT消息传递的各种参数和功能,帮助提高Mosquitto的性能和功能,让设备之间的通信更加高效。 ### 回答2: MQTTMosquitto)是一种轻量级的通信协议,用于基于订阅/发布模型的物联网设备之间的交互。针对MQTT协议,我们需要使用MQTT测试工具,这样我们才能测试MQTT的各种功能。 Mosquitto是一种流行的MQTT实现。这个工具是一个开源项目,它可以运行在多个平台上,从而使我们能够轻松地测试MQTT应用程序。Mosquitto提供了可用的CLI(命令行界面),为开发者们提供了良好的操作性。它还提供了一些基本测试,包括测试客户端的连接效果和性能。此外,它提供了一些高级测试,如消息订阅的特征、多连接质量、最大qos的处理和消息重传等。 Mosquitto支持基于TLS的安全通讯协议,自动重连功能,多SPS(会话)管理以及客户端订阅策略等等。Mosquitto是一个功能强大的MQTT测试工具,为MQTT开发人员提供了一个好的平台,能够测试他们的MQTT应用程序,并在需要时进行调整。 总之,MQTT测试工具Mosquitto是一款非常好的工具,它能够提高MQTT应用程序的可靠性和性能,同时为MQTT开发人员提供了一个好的平台,使他们能够更有效地测试和调整他们的应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Nerd Nirvana

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值