- #### 原创: DisSun ##########
- #### 时间: 2019.03.10 #######
关于 Mosquitto 配置的资料网上还是有几篇的, 但是看来看去, 基本上都是基于 Linux. 基于 Windows 的凤毛麟角, 看上去貌似配置的东西相差不大, 实操过程中真的烦透了, 配置就是不成功, 这次把自己实践过程中的东西记录一下, 分享出来.
一, 概念梳理
1,Mosquitto 是一款实现了消息推送协议 MQTT 3.1 的开源消息代理软件, 提供轻量级的, 支持可订阅 / 可发布的消息推送模式, 是设备与设备之间的短消息通信变得简单, 广泛应用于低功耗传感器, 手机(App 消息推送是场景之一), 嵌入式电脑, 微型控制器等移动设备.
2, 那什么是 MQTT, 他的英文全称 Message Queuing Telemetry Transport, 翻译过来就是 "消息队列遥测传输", 是 ISO 标准 (ISO/IEC PRF 20922) 下基于发布 / 订阅范式的消息协议. 它工作在 TCP/IP 协议族上, 是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布 / 订阅型消息协议.
目前支持 MQTT 的服务器中间件有 EMQTT,Mosquitto,Apollo. 本章讲的就是 Mosquitto.
3,MQTT 的协议内容有很多, 其中一个一定要知道, 就是 "消息发布服务质量", 只有三个值分别是:
QoS 0:"至多一次", 消息发布完全依赖底层 TCP/IP 网络. 会发生消息丢失或重复. 这一级别可用于如下情况, 环境传感器数据, 丢失一次读记录无所谓, 因为不久后还会有第二次发送.
QoS 1:"至少一次", 确保消息到达, 但消息重复可能会发生.
QoS 2:"只有一次", 确保消息到达一次. 这一级别可用于如下情况, 在计费系统中, 消息重复或丢失会导致不正确的结果.
二, 下载与安装
1,Mosquitto 存在很多版本, 如果想体验比较新版本可以上 GitHub, 但是比较麻烦的是需要自己去编译成 Windows 文件, 编译需要用到 cmake 软件, 我之前操作过没问题, 可以参照其他博主的文章:[https://blog.csdn.net/vwadev/article/details/50148265].
官方后面提供了比较稳定的 Windows 安装版本, 安装完成后可以直接使用, 并且自动添加成 Windows 服务, 非常方便, 下载路径: https://mosquitto.org/download
2, 安装完成. 如果需要使用, 直接启动服务即可.
3,Mosquitto 服务默认占用 1883 端口, 所以可不在配置文件中显式设置.
三, 关于配置文件的一些重要说明
1, 配置文件在安装目录下的 mosquitto.conf, 默认情况下不做任何修改, 就可以启动 mosquitto.
2, 配置说明中出现的地址例如:"/var/run/mosquitto","/var/log/messages", 都是相对路径, 相对于系统盘根目录. 这个地方很重要, 他可不是相对于安装目录的根目录. 例如 "/var/run/mosquitto" 表示的是 "c:\var\run\mosquitto", 我有一段时间一直没搞定, 就是这个目录原因, 很多人没有反馈这个问题, 因为都是在 Linux 用所以没啥问题.
3, 安装目录的完整路径中, 不能出现空格, 否则在命令行就无法通过. Mosquitto 默认安装路径是在 "C:\Program Files\mosquitto", 这里面的 "Program Files" 就存在空格, 导致很多问题, 这个也要特别注意. 所以后来我改为安装在 "C:\MosquittoTest"
四, 配置登录账号和密码
1, 如果想方便测试可以下载安装 MQTT 客户端(http://www.eclipse.org/paho/components/tool/), 我自己是用这个, 不过下面我们还是用原生的命令行操作:
2, 在配置文件 mosquitto.conf 中, 任意位置加入下面文本, 保存退出(我说的全新安装的情况下, 如果是维护已经使用很久的系统, 可在配置文件中找到对应的属性进行更改)
- # 设置不允许匿名登录
- allow_anonymous false
- # 设置账户密码文件位置为 C:\MosquittoTest\pwfile.example
- password_file /MosquittoTest/pwfile.example
3, 重启 mosquitto 服务配置文件的修改才能生效. 为了方便调试和操作, 我们后面的操作全部通过命令行模式进行.
4, 插入新用户名及密码, 输入密码时界面是不会显示的, 直接输入后回车就可以, 需要连续输入两次. 保证 pwfile.example 的路径和上面的配置一致. 下面打开 CMD 并进入 mosquitto 根目录输入:
- mosquitto_passwd -c /MosquittoTest/pwfile.example FirstUserName (使用 - c 参数会导致清空密码文件, 重新插入用户)
- mosquitto_passwd /MosquittoTest/pwfile.example SecondUserName (不使用 - c 表示追加用户, 不影响旧用户)
5, 创建成功后 pwfile.example 会出现刚刚添加的用户信息.
6, 启动 mosquitto 进行测试.
首先启动第一个 cmd 窗口启动服务: mosquitto.exe -c mosquitto.conf
然后启动第二个 cmd 窗口订阅'dissun/topic'主题(其中 dissun 是账号, 111111 是密码):mosquitto_sub -u dissun -P 111111 -t 'dissun/topic' -v
最后启动第三个 cmd 窗口发布订阅'腰疼不加班'信息: mosquitto_pub -u dissun -P 111111 -t 'dissun/topic' -m '腰疼不加班'
五, 配置日期信息
1, 配置日期前请先查看第三大点(关于配置文件的一些重要说明)
2, 在 mosquitto.conf 文件中插入:
- # 把日志信息输入到指定文件
- log_dest file /MosquittoTest/DisSunLog_1.log
- # 在控制台输出信息, 运行 win 服务无效
- log_dest stdout
- # 不记录
- #log_type none
- ######### 下面的 debug,error,warning..... 等等可以组合使用.
- # 记录网络通信包, 通信包大小(含心跳包), 但不显示内容
- log_type debug
- # 错误信息(没见过)
- log_type error
- # 警告信息(没见过)
- log_type warning
- # 设备的订阅信息, 发布信息及下线信息(端口, 设备名, 用户, 不包发布内容)
- log_type notice
- # 服务启动关闭信息, 版本号, 端口号, 配置文件信息
- log_type information
- # 所有设备订阅主题提醒
- log_type subscribe
- # 这个没有试出来干啥用的(没见过)
- #log_type unsubscribe
- #websockets 链接信息(没见过)
- #log_type websockets
- #websockets_log_level 0
3, 然后重启服务, 我们发一条信息来看看记录了什么.(参照第四节第 6 点进行发送信息操作得到下面运行界面)
4, 按 Ctrl+C 停止主服务, 如果不停止服务, 日志文件会被独占锁住无法打开. 找到这个日志
5, 日志解析
- ##########: 以下是 information 信息
- 1552112775: mosquitto version 1.5.8 starting
- 1552112775: Config loaded from mosquitto.conf.
- 1552112775: Opening ipv6 listen socket on port 1883.
- 1552112775: Opening ipv4 listen socket on port 1883.
- ##########: 以下是 subscribe 信息(伪造)
- 1552113940: mosqsub|11332-DisSunPad 0 'dissun/topic'
- 20-DisSunPad (c1, k60, u'dissun').
- ##########: 以下是 notice 信息, 订阅客户端上线 11332
- 1552112782: New connection from ::1 on port 1883.
- 1552112782: New client connected from ::1 as mosqsub|11332-DisSunPad (c1, k60, u'dissun').
- ##########: 以下是 debug 信息, 订阅客户端上线 11332
- 1552112782: No will message specified.
- 1552112782: Sending CONNACK to mosqsub|11332-DisSunPad (0, 0)
- 1552112782: Received SUBSCRIBE from mosqsub|11332-DisSunPad
- 1552112782: 'dissun/topic' (QoS 0)
- 1552112782: mosqsub|11332-DisSunPad 0 'dissun/topic'
- 1552112782: Sending SUBACK to mosqsub|11332-DisSunPad
- ##########: 以下是 notice 信息, 发布客户端上线 12284
- 1552112832: New connection from ::1 on port 1883.
- 1552112832: New client connected from ::1 as mosqpub|12284-DisSunPad (c1, k60, u'dissun').
- ##########: 以下是 debug 信息, 发布客户端上线 12284, 并发布 12 字节的信息, 然后离线.
- 1552112832: No will message specified.
- 1552112832: Sending CONNACK to mosqpub|12284-DisSunPad (0, 0)
- 1552112832: Received PUBLISH from mosqpub|12284-DisSunPad (d0, q0, r0, m0, ''dissun/topic'', ... (12 bytes))
- 1552112832: Sending PUBLISH to mosqsub|11332-DisSunPad (d0, q0, r0, m0, ''dissun/topic'', ... (12 bytes))
- 1552112832: Received DISCONNECT from mosqpub|12284-DisSunPad
- ##########: 以下是 notice 信息, 发布客户端离线 12284
- 1552112832: Client mosqpub|12284-DisSunPad disconnected.
- ##########: 以下是 debug 信息, 订阅客户端保持跟 mosquitto 的联系. PINGREQ 请求心跳包, PINGRESP 回应心跳包
- 1552112842: Received PINGREQ from mosqsub|11332-DisSunPad
- 1552112842: Sending PINGRESP to mosqsub|11332-DisSunPad
- 1552112902: Received PINGREQ from mosqsub|11332-DisSunPad
- 1552112902: Sending PINGRESP to mosqsub|11332-DisSunPad
- 1552112962: Received PINGREQ from mosqsub|11332-DisSunPad
- ##########: 以下是 information 信息 主服务中断
- 1552113191: mosquitto version 1.5.8 terminating
六, 如果要开启 webSockets, 它是支持的. 但是要显式的加入 mqtt 协议及端口
- #MQTT 协议
- port 1883
- protocol mqtt
- #websockets 协议
- listener 8000
- protocol websockets
- # 如果需要查看 websockets 日志还可以加入以下面, 上面有提过.
- log_type websockets
- websockets_log_level 0
七, 用户访问控制 acl_file, 看遍了所有的文章, 操作都不生效. 加了访问控制后所有的的用户, 都无法正常的收发信息, 所以等下次研究透了再追加. 感觉这玩意从 Linux 移至过来, 不是完全通用.
不过还是按照说明把操作写下来, 有看出问题的童鞋可以跟我反馈下.(注: 下面的内容操作没有通过, 请读者自行试验)
1, 在 mosquitto.cong 中间中加入
- # 加入访问控制列表文件 Acls
- acl_file /MosquittoTest/aclfile.example
2, 修改 aclfile.example 内容, 加入用户的权限
- # This affects access control for clients with no username.
- topic read $SYS/#
- # This only affects clients with username "roger".
- #user roger
- #topic foo/bar
- user dissun
- topic dissun/topic
- # This affects all clients.
- pattern write $SYS/broker/connection/%c/state
3,CMD 启动 mosquitto.
4, 按道理说设置就是这么多, 没那么复杂, 但是此时 dissun 用户订阅是成功的, 但是 dissun 用户发布失败, 服务 debug 日志显示 "denied". 我怀疑是 acl 文件加载失败, 所以换了绝对路径, 但是依然没有效果, 搞了一下午不成功放弃, 以后再搞.
来源: https://www.cnblogs.com/dissun/p/10505007.html