MQTT 实战-Mosquitto + MQTT.fx

作者:vkvi 来源:ITPOW(原创) 日期:2022-4-30

关于 MQTT,请参见:物联网协议-Modbus、MQTT、WebSocket、Socket

Mosquitto

Mosquitto 是一款软件,实现了 MQTT 中的 Broker(类似于服务端)。

下载:Mosquitto.zip

安装

根据 32 位还是 64 位进行安装。

创建密码文件

打开命令提示符,cd 到安装目录,输入:

mosquitto_passwd -c pwfile itpow

按提示输入密码。

可以发现多了一个 pwfile 的文件,文本打开发现有一个用户名,后面跟了密码。

应用密码文件、配置监听端口

在安装位置(比如:C:\Program Files\mosquitto),文本工具打开:mosquitto.conf

在 Default authentication and topic access control 那节添加:

#password_file
password_file C:\Program Files\mosquitto\pwfile

上述 # 是注释,我没有删除它。另外 password_file 只能用绝对路径,不能用相对路径。

在 Listeners 那节添加上 listener 1883,或者你指定的其他监听端口:

# listener port-number [ip address/host name/unix socket path]
listener 1883

发布和订阅权限

如果不指定发布和订阅权限,则登录用户都可以发布和订阅任何主题,下面介绍如何限定:

新建一个名为 aclfile 的文本文件(其他名字也可以)。

user itpow
topic hello/#

user itpow2
topic hello/#

然后再在 mosquitto.conf 添加:

acl_file C:\Program Files\mosquitto\aclfile

为了便于管理,建议搜索 acl_file,添加在其注释的后面。

重启服务,此时我们可以看到 itpow、itpow2 只能处理 hello 主题了。

说明:

  • user 是 pwfile 中对应的 user,不是 Client ID。

  • 用户名大小写敏感,itpow 不等于 Itpow。

  • 主题也是大小写敏感,hello 不等于 Hello。

  • hello/ 与 hello 不是同一主题。

  • 如果应用了 acl_file,而 acl_file 中没有某用户,也没指定 pattern,不代表该用户是全部权限,而是指该用户没权限。

  • 在 acl_file 中:没有指定用户的 topic 是针对匿名用户,而不是全部用户;pattern 才是针对全部用户。

  • topic 的完整语法是:topic [read|write|readwrite|deny] <topic>。

  • topic 中可用 # 代表 0-N 个节+ 代表 0-1 个节。注意指节,不是指字符数。

    • hello/# 与 hello、hello/、hello/123、hello/123/、hello/123/456……匹配。

    • hello/+ 只能与 hello/ 匹配,不能与 hello 匹配。

    • hello/+/ 可与 hello//、hello/123/ 匹配。

    • 即:# 可以忽略指定的 /,包括前面的;+ 不可以忽略指定的 /。

在利用本文下面的工具 MQTT.fx 测试 topic 时,即使没有权限发布、订阅某 topic,它也不会出现权限错误,毕竟这种物联网的东西,不可能像我们应用系统那样做得那么精细。

防火墙放行和启动

在防火墙中,针对上面开通的端口 1883 放行。

在服务(services.msc)中启动 Mosquitto Broker,如果启动失败,可能是我们配置文件有误。

MQTT.fx

用来发布和订阅消息的。

下载:mqttfx-1.7.1-windows-x64.exe.zip

安装后,一看就能看懂,配置上 IP 地址、端口,用户名、密码。

连接,OK。

更多资料

mosquitto_passwd

mosquitto_passwd [-c | -D] passwordfile username

mosquitto_passwd -b passwordfile username password

mosquitto_passwd -U passwordfile

  • -c 创建新的文件,如果存在会覆盖

  • -D 删除用户。

  • -b 批量创建,密码输在命令行中(不是隐藏式输入 2 次,故方便):如果文件存在,它是追加用户;如果用户存在,它是改密码。

  • -U 纯文本密码文件,转换成 Hash 了的。

注意上述参数的大小写。

相同用户、相同 ClientID 可以同时连接吗?

在 MQTT.fx 这个工具中不行,开两一窗口,相同用户登录后,前一窗口会断开。

但这是这个工具的限制,并不是 MQTT 的限制,咱们可以编程测试,相同用户、相同 ClientID 都可以同时连接,相互还可以发消息呢。


相关文章