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
。你可以使用文本编辑器编辑此文件,例如使用nano
或vim
:
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_pub
和 mosquitto_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>
注意事项
配置文件:Mosquitto 的密码保护通常在配置文件(如
mosquitto.conf
)中设置,包括密码文件的位置和访问控制列表(ACL)。密码文件:使用
mosquitto_passwd
命令可以生成密码文件,然后将其指定在 Mosquitto 配置文件中。安全性:使用密码可以提高 MQTT 通信的安全性,防止未授权访问。
连接状态:使用
mosquitto_sub
订阅时,可以通过添加-v
参数来显示更详细的连接状态信息。客户端ID:在某些情况下,可能需要为客户端指定一个唯一的ID,可以使用
-c
或--clientid
参数。服务质量(QoS):MQTT 支持不同的服务质量级别,可以通过
-q
参数指定。TLS/SSL:如果 Mosquitto 配置了 TLS/SSL 加密,可能还需要指定证书文件和相关参数来建立安全连接。
端口:默认情况下,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
命令行工具来创建和编辑密码文件。
生成密码文件:
sh sudo mosquitto_passwd /etc/mosquitto/passwd username
这里的/etc/mosquitto/passwd
是密码文件的路径,username
是你想要创建的用户名。系统会提示你输入密码。输入密码: 按照提示输入密码,然后再次输入确认。密码将被安全地存储在密码文件中。
步骤 2: 配置 Mosquitto 以使用密码文件
编辑 Mosquitto 的配置文件
mosquitto.conf
,通常位于/etc/mosquitto/
目录。
打开配置文件:
sh sudo nano /etc/mosquitto/mosquitto.conf
或者使用vim
文本编辑器。启用密码文件: 在配置文件中,添加或确保以下行存在:
conf password_file /etc/mosquitto/passwd
这告诉 Mosquitto 使用你刚才创建的密码文件。允许或拒绝匿名访问: 根据需要,你可以配置 Mosquitto 来禁止匿名访问:
conf allow_anonymous false
设置为false
将禁止没有认证的用户连接到 Mosquitto。步骤 3: 配置 ACL(可选)
如果需要更细粒度的控制,你可以使用访问控制列表(ACL)来定义用户的权限。
创建 ACL 文件:
sh sudo nano /etc/mosquitto/aclfile
创建一个新文件或编辑现有文件。定义 ACL 规则: 在 ACL 文件中,你可以定义用户的读写权限。例如:
conf user username topic readwrite test/topic
这表示用户username
有权限读写test/topic
主题。在 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
确保将
username
和password
替换为你在密码文件中设置的用户名和密码。
密码配置
# 默认安装的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