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可以发布和订阅所有的主题

用 docker 部署 mosquitto 并编译 mosquitto-auth-plug