eclipse-mosquitto MQTT发布/订阅测试
使用docker创建mosquitto服务
这里我使用的是Dockerfile + docker-compose 拉起一个容器
Dockerfile
FROM eclipse-mosquitto
EXPOSE 1883 9001
mosquitto.conf 配置文件
# 设置不允许任何人访问,连接时需要用户名和密码
allow_anonymous false #false表示不允许匿名连接
password_file /mosquitto/passwd #用户名及密码配置文件
acl_file /mosquitto/acl #配置用户对topic的读写权限
persistence true
# 将数据持久化及日志保存到指定目录
persistence_location /mosquitto/data/
log_dest file /mosquitto/log/mosquitto.log
# 默认端口是 1883
port 1883
# 以下两行表示可以通过9001端口以websocket的方式连接mosquitto服务
listener 9001
protocol websockets
passwd文件
admin:$6$F6wFChyMts4WY7Xh$mTNroyvh4CGs0qLfisuQGZwvGRizRdRXZqgF2l/5J9X/Lp/K0ZniLbUOEk5yT/nZNu45zdY4JfXvrJB7djc4Bw==
subreader:$6$3AFNzcXFSwNByauv$3DBKMWchklzDT1KYK1O1hbbYzKMJPVCuv5Ed1dwIdAkicu4UljRu30TW0fFEbC/nLO4dfPrDSN1VWGY/iyOfVQ==
passwd文件的创建及用户添加方法,下面介绍
acl文件
user admin
topic #
user subreader
topic read topic/#
docker-compose.yml中关于mosquitto的配置
mosquitto:
build:
docker/mosquitto
volumes:
- ./docker/mosquitto/data:/mosquitto/data/
- ./docker/mosquitto/log:/mosquitto/log/
- ./docker/mosquitto/mosquitto.conf:/mosquitto/config/mosquitto.conf
- ./docker/mosquitto/passwd:/mosquitto/passwd
- ./docker/mosquitto/acl:/mosquitto/acl
ports:
- "1883:1883"
- "9001:9001"
container_name: mosquitto
command: mosquitto -c /mosquitto/config/mosquitto.conf
mqtt服务的测试,可以下载工具:MQTTBox
创建用户密码文件及添加用户
docker启动后,进入到容器
docker exec -it mosquitto sh
进入容器后,输入下面的命令
mosquitto_passwd -c /mosquitto/passwd admin
注意,如果passwd文件不存在时,才使用上面的命令。如果passwd文件已存在,则去掉-c参数。(即上面的命令表示,创建passwd并添加新用户,在已有文件中添加用户,执行下面的命令)
mosquitto_passwd /mosquitto/passwd admin
执行以上添加用户的命令后,命令行中提示输入新用户的密码,密码要求输两次进行确认。
密码确认完成后,即可到/mosquitto目录下查看文件,如代码所示。
设置用户的发布/订阅权限
#用户信息
user pub
#用户可访问的topic,这里为可读可写
topic mytopic/news
#订阅用户可访问权限
user sub
#这里为只读
topic read mytopic/news
#用通配符表示多个topic
user sub_user
#topic可用通配符表示以topic/打头的所有topic都可读
topic read topic/#
关于通配符的使用,有两个通配符可用,#和+,具体用法举例说明
test/jh/# 可匹配 test/jh/a/b/c ,test/jh/a/b ,test/jh/a.test/jh
test/jh/+可匹配 test/jh/a ,test/jh/b ,但是不能匹配 test/jh/a/b
另外,若password_file中配置了用户A,但是acl中未配置用户A对应的主题权限,则用户A可以发布和订阅所有的主题