关于 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 都可以同时连接,相互还可以发消息呢。