mqtt服务器(mosquitto)测试环境的搭建 – Python成神之路
前言
销售拉了个小活,让我将采集的设备数据送到第三方搭建的mqtt服务器平台上。
找了个C# mqtt demo, 不确定是否将数据送到了第三方平台上。
因为他们是封装好的网页UI, 必须符合他们的格式才能显示出来。
查资料,看到用mosquitto搭建 mqtt服务端很容易。
搭好后,测试了一下(启动mqtt服务,订阅消息,上传消息),好使。
这样的话,我可以测试自己用C#写的插件,是否可以送数据到mosquitto搭建的mqtt server. 送到了就OK.
剩下的事,就是送出的数据符合第三方约定的格式即可。
试验
试验环境
下载mosquitto
https://mosquitto.org/download/
mosquitto-2.0.12-install-windows-x64.exe
安装
双击 mosquitto-2.0.12-install-windows-x64.exe 进行安装
安装后的默认位置 C:\Program Files\Mosquitto
安装后的目录文件列表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
Microsoft Windows <span class="token punctuation">[</span>版本 <span class="token number">10.0</span>.19043.1237<span class="token punctuation">]</span> <span class="token punctuation">(</span>c<span class="token punctuation">)</span> Microsoft Corporation。保留所有权利。 C:<span class="token punctuation">\</span>Users<span class="token punctuation">\</span>chenx<span class="token operator">></span>cd /d C:<span class="token punctuation">\</span>Program Files<span class="token punctuation">\</span>Mosquitto C:<span class="token punctuation">\</span>Program Files<span class="token punctuation">\</span>Mosquitto<span class="token operator">></span>dir 驱动器 C 中的卷是 os 卷的序列号是 <span class="token number">6645</span>-A63C C:<span class="token punctuation">\</span>Program Files<span class="token punctuation">\</span>Mosquitto 的目录 <span class="token number">2021</span>/09/27 <span class="token number">10</span>:24 <span class="token operator"><</span>DIR<span class="token operator">></span> <span class="token builtin class-name">.</span> <span class="token number">2021</span>/09/27 <span class="token number">10</span>:24 <span class="token operator"><</span>DIR<span class="token operator">></span> <span class="token punctuation">..</span> <span class="token number">2021</span>/09/01 04:42 <span class="token number">230</span> aclfile.example <span class="token number">2021</span>/09/01 04:42 <span class="token number">130,795</span> ChangeLog.txt <span class="token number">2021</span>/09/27 <span class="token number">10</span>:24 <span class="token operator"><</span>DIR<span class="token operator">></span> devel <span class="token number">2021</span>/09/01 04:42 <span class="token number">1,569</span> edl-v10 <span class="token number">2021</span>/09/01 04:42 <span class="token number">14,198</span> epl-v20 <span class="token number">2021</span>/03/26 04:34 <span class="token number">3,410</span>,432 libcrypto-1_1-x64.dll <span class="token number">2021</span>/03/26 04:34 <span class="token number">683,008</span> libssl-1_1-x64.dll <span class="token number">2021</span>/09/01 04:42 <span class="token number">39,904</span> mosquitto.conf <span class="token number">2021</span>/09/01 05:36 <span class="token number">87,040</span> mosquitto.dll <span class="token number">2021</span>/09/01 05:45 <span class="token number">381,952</span> mosquitto.exe <span class="token number">2021</span>/09/01 05:36 <span class="token number">18,432</span> mosquittopp.dll <span class="token number">2021</span>/09/01 05:36 <span class="token number">76,288</span> mosquitto_ctrl.exe <span class="token number">2021</span>/09/01 05:45 <span class="token number">120,320</span> mosquitto_dynamic_security.dll <span class="token number">2021</span>/09/01 05:36 <span class="token number">22,528</span> mosquitto_passwd.exe <span class="token number">2021</span>/09/01 05:45 <span class="token number">51,712</span> mosquitto_pub.exe <span class="token number">2021</span>/09/01 05:45 <span class="token number">79,872</span> mosquitto_rr.exe <span class="token number">2021</span>/09/01 05:45 <span class="token number">81,920</span> mosquitto_sub.exe <span class="token number">2021</span>/09/01 04:42 <span class="token number">355</span> pwfile.example <span class="token number">2021</span>/09/01 04:42 <span class="token number">939</span> README-letsencrypt.md <span class="token number">2021</span>/09/01 04:42 <span class="token number">2,020</span> README-windows.txt <span class="token number">2021</span>/09/01 04:42 <span class="token number">3,768</span> README.md <span class="token number">2021</span>/09/27 <span class="token number">10</span>:24 <span class="token number">67,945</span> Uninstall.exe <span class="token number">21</span> 个文件 <span class="token number">5,275</span>,227 字节 <span class="token number">3</span> 个目录 <span class="token number">283,800</span>,928,256 可用字节 C:<span class="token punctuation">\</span>Program Files<span class="token punctuation">\</span>Mosquitto<span class="token operator">></span> |
本地使用mosquitto
默认按照好的mosquitto只能在本地使用。
如果要在客户端计算机和远程mqtt服务器之间进行mqtt操作(订阅消息,上传消息),需要修改配置文件mosquitto.conf
在本地使用mosquitto,在安装目录中的README.md中有描述
本地启动mqtt服务
打开新的cmd
1 2 3 |
<span class="token builtin class-name">cd</span> /d C:<span class="token punctuation">\</span>Program Files<span class="token punctuation">\</span>Mosquitto mosquitto.exe |
从本地mqtt服务器订阅消息
打开新的cmd
1 2 3 |
<span class="token builtin class-name">cd</span> /d C:<span class="token punctuation">\</span>Program Files<span class="token punctuation">\</span>Mosquitto mosquitto_sub -t <span class="token string">'test/topic'</span> -v |
本地发送消息到本地mqtt服务器
这块文档上写的不对,会报错。原因是消息必须用”符号包裹,而不是用’符号包裹。
打开新的cmd
1 2 3 |
<span class="token builtin class-name">cd</span> /d C:<span class="token punctuation">\</span>Program Files<span class="token punctuation">\</span>Mosquitto mosquitto_pub -t <span class="token string">'test/topic'</span> -m <span class="token string">"hello world"</span> |
这里要注意的是发送消息时的主题,必须和订阅的主题一样才行. e.g. 都是 ‘test/topic’
效果 – 本地服务端
效果 – 订阅本地消息
效果-发送本地消息
mqtt服务器端口的问题
上述简易试验,用的mqtt端口都是默认的。
看mosquitto命令行帮助,可以看到 -p 是指定端口的选项。
1 2 |
-p <span class="token builtin class-name">:</span> network port to connect to. Defaults to <span class="token number">1883</span> <span class="token keyword">for</span> plain MQTT and <span class="token number">8883</span> <span class="token keyword">for</span> MQTT over TLS. |
只要命令行带上 -p 就可以指定端口
用带端口来测试一下
带端口启动本地mqtt服务
假设端口是9999
1 2 |
mosquitto.exe -p <span class="token number">9999</span> |
带端口订阅本地消息
1 2 |
mosquitto_sub -p <span class="token number">9999</span> -t <span class="token string">'test/topic'</span> -v |
1 2 |
mosquitto_pub -p <span class="token number">9999</span> -t <span class="token string">'test/topic'</span> -m <span class="token string">"test abc113"</span> |
发送消息带IP
发送消息的mqtt客户端和服务器一般都不是一台,所以看看怎么带IP发送消息。
1 2 |
mosquitto_pub --help |
1 2 3 |
-A <span class="token builtin class-name">:</span> <span class="token builtin class-name">bind</span> the outgoing socket to this host/ip address. Use to control <span class="token function">which</span> interface the client communicates over. |
试验一下带IP, 带端口发送消息
1 2 |
mosquitto_pub -h <span class="token number">127.0</span>.0.1 -p <span class="token number">9999</span> -t <span class="token string">'test/topic'</span> -m <span class="token string">"test abc114"</span> |
将服务装在远程计算机上,在本地发送mqtt消息
正常用的话,mqtt客户端和mqtt服务器都不在一台计算机上。
默认安装的mosquitto,是不支持从本地mqtt客户端访问远程mqtt客户端的。
假设远程装了mosquitto的计算机IP为192.168.1.8
现在远程计算机上安装mosquitto,这个步骤和本地相同。
从本地mqtt客户端访问远程mqtt服务器,需要认证,要配置用户名,口令。
用 mosquitto_passwd.exe 来配置mqtt登陆认证的存根文件,用户名是明文,口令是密文HASH, 防止有人登入mqtt服务器所在物理计算机,看到口令明文。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// 假设 生成的口令文件在mosquitto的安装目录中,叫做my_mosquitto_pwd_file.cfg // mosquitto_passwd.exe 带的参数 -H pwd的HASH方式 -c 生成或要操作的口令文件 再带上用户名就行 // 因为mosquitto安装后的目录要管理员权限,所以先用管理员全线启动cmd // 然后在认证文件中加一个新用户和新口令 mosquitto_passwd.exe -H sha512 -c my_mosquitto_pwd_file.cfg user1 // 上述命令行是要在my_mosquitto_pwd_file.cfg 中加入一个user1的用户,该命令回车后,输入2遍pwd就可以了。 C:<span class="token punctuation">\</span>Program Files<span class="token punctuation">\</span>Mosquitto<span class="token operator">></span>mosquitto_passwd.exe -H sha512 -c my_mosquitto_pwd_file.cfg user1 Password: Reenter password: C:<span class="token punctuation">\</span>Program Files<span class="token punctuation">\</span>Mosquitto<span class="token operator">></span> // 输入口令时,就输入自己确定的实际口令,我输入了2遍pwd1 |
看看口令文件my_mosquitto_pwd_file.cfg的内容
1 2 3 |
user1:<span class="token variable">$6</span><span class="token variable">$xDVrR</span>+1BrDbh/Uck<span class="token variable">$skhiqG88FPqOiC8b2GwJU0Xae5RDk9tcEQiFz</span>+RM5DUkvaOSwExcCwhTRjs9u5J3vqBCEbJXWTr7nIsO68SK5Q<span class="token operator">==</span> |
可以看到用户名是user1的明文,但是口令已经做了HASH. 比较安全。
再加入一个用户user2, 口令是pwd2
1 2 3 4 5 6 7 |
C:<span class="token punctuation">\</span>Program Files<span class="token punctuation">\</span>Mosquitto<span class="token operator">></span>mosquitto_passwd.exe -H sha512 -c my_mosquitto_pwd_file.cfg user2 Password: Reenter password: C:<span class="token punctuation">\</span>Program Files<span class="token punctuation">\</span>Mosquitto<span class="token operator">></span> |
看看口令文件my_mosquitto_pwd_file.cfg的内容
1 2 |
user2:<span class="token variable">$6</span><span class="token variable">$sYaJFfI0ggkPCXLb</span><span class="token variable">$IaeCU</span>/EFLil53dAq+Iiy6Sfv17QBxjqjqMbOCWzkwVEmGZm3/uHNkDrGzBL8JRmbNuh2PHm02kWf3dMREs7CGA<span class="token operator">==</span> |
可以看到user1没有了,看来mosquitto_passwd.exe支持一个用户名和口令。
修改配置文件mosquitto.conf
修改配置文件是为了从本地mqtt客户端访问远程mqtt服务器, 默认安装完的情况是mosquitto只能在本地测试用,没有实际用场。
配置文件的修改点如下:
mosquitto启动时,监听的是本地IP和PORT
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
listener <span class="token number">39999</span> <span class="token number">192.168</span>.1.8 |
打开日志
如果mqtt操作时报错,可以在日志中看到问题。如果没日志,就不知道报错是啥问题。
e.g. 端口没监听成功, 防火墙没放开端口,导致客户端根本没访问到mqtt服务端监听的端口,mqtt客户端访问时,认证失败…
还可以看到是哪个IP访问过mqtt服务器。
总是,打开mosquitto的运行日志,好处多多。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
log_dest <span class="token function">file</span> my_mosquitto.log |
看看日志记录的样子
1 2 3 4 5 6 7 8 9 10 |
<span class="token number">1632734887</span>: mosquitto version <span class="token number">2.0</span>.12 starting <span class="token number">1632734887</span>: Config loaded from mosquitto.conf. <span class="token number">1632734887</span>: Opening ipv4 listen socket on port <span class="token number">39999</span>. <span class="token number">1632734887</span>: mosquitto version <span class="token number">2.0</span>.12 running <span class="token number">1632734933</span>: New connection from <span class="token number">192.168</span>.1.22:13192 on port <span class="token number">39999</span>. <span class="token number">1632734933</span>: New client connected from <span class="token number">192.168</span>.1.22:13192 as auto-BF4C1561-22D9-2D92-23B9-9F622593B370 <span class="token punctuation">(</span>p2, c1, k60, u<span class="token string">'user1'</span><span class="token punctuation">)</span>. <span class="token number">1632735077</span>: New connection from <span class="token number">192.168</span>.1.22:7217 on port <span class="token number">39999</span>. <span class="token number">1632735077</span>: New client connected from <span class="token number">192.168</span>.1.22:7217 as auto-0E78C9E4-27D0-9F7B-8074-385E3F9320BC <span class="token punctuation">(</span>p2, c1, k60, u<span class="token string">'user1'</span><span class="token punctuation">)</span>. <span class="token number">1632735077</span>: Client auto-0E78C9E4-27D0-9F7B-8074-385E3F9320BC disconnected. |
打开日志记录级别
这块没细研究,就按照配置文件给出的推荐日志级别打开几个级别。如果还有报错看不到日志,可以详细看看这里的日志级别。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
log_type error log_type warning log_type notice log_type information |
不允许匿名登陆
匿名登陆只能用在本地mqtt测试。
如果远程访问,不允许匿名登陆,必须给出用户名和口令才能登陆
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
allow_anonymous <span class="token boolean">false</span> |
给出登陆认证的存根文件
因为远程登陆,必须带用户名和口令进行mqtt操作,所以必须给出存放用户名和口令的存根文件。
这个文件,就是上面用mosquitto_passwd.exe生成的认证文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
password_file my_pwd_file.cfg |
配置文件就修改这么多就够了
启动mosquitto服务
启动启动mosquitto服务的方法有2种,都使用的配置文件mosquitto.conf
- 安装mosquitto后,已经安装了mosquitto服务,在服务面板中可以看到。
也可以用命令行安装
1 2 |
mosquitto <span class="token function">install</span> |
安装服务后,就可以在服务面板中启动服务。如果启动失败,去看日志文件,可以看到失败原因。
- 直接用命令行启动(假设服务没启动)
因为安装后的目录需要管理员权限,先用管理员模式启动cmd
1 2 3 4 5 6 7 8 |
Microsoft Windows <span class="token punctuation">[</span>版本 <span class="token number">10.0</span>.19043.1237<span class="token punctuation">]</span> <span class="token punctuation">(</span>c<span class="token punctuation">)</span> Microsoft Corporation。保留所有权利。 C:<span class="token punctuation">\</span>WINDOWS<span class="token punctuation">\</span>system3<span class="token operator"><span class="token file-descriptor important">2</span>></span>cd /d C:<span class="token punctuation">\</span>Program Files<span class="token punctuation">\</span>Mosquitto C:<span class="token punctuation">\</span>Program Files<span class="token punctuation">\</span>Mosquitto<span class="token operator">></span>mosquitto.exe -c mosquitto.conf |
没有报错信息,mosquitto正在运行。
此时要检查防火墙,让mosquitto的所监听的端口的入站和出站规则都打开。
我做实验时,将其他规则都删了,添加了4条规则,将所有端口的入站/出站的TCP/UDP端口都放开了
从本地客户端访问一下这台刚配置好的远程mqtt服务器
先用错误的用户名/口令访问一下远程的mqtt服务器
1 2 3 4 |
C:<span class="token punctuation">\</span>Program Files<span class="token punctuation">\</span>Mosquitto<span class="token operator">></span>mosquitto_sub -h <span class="token number">192.168</span>.1.22 -p <span class="token number">39999</span> -u user1 -P pw d1 -t <span class="token string">'test/topic'</span> -v Connection error: Connection Refused: not authorised. |
去看下日志my_mosquitto.log。
1 2 3 4 5 6 7 |
<span class="token number">1632738749</span>: mosquitto version <span class="token number">2.0</span>.12 starting <span class="token number">1632738749</span>: Config loaded from mosquitto.conf. <span class="token number">1632738749</span>: Opening ipv4 listen socket on port <span class="token number">39999</span>. <span class="token number">1632738749</span>: mosquitto version <span class="token number">2.0</span>.12 running <span class="token number">1632739100</span>: New connection from <span class="token number">192.168</span>.1.8:49762 on port <span class="token number">39999</span>. <span class="token number">1632739100</span>: Client <span class="token operator"><</span>unknown<span class="token operator">></span> disconnected, not authorised. |
可以看到服务段启动的端口是39999.
有个客户端访问了服务器的mqtt端口,但是认证失败。
如果访问不存在的mqtt服务器,可以直接在mqtt客户端看到连接补上客户端。
1 2 3 4 |
C:<span class="token punctuation">\</span>Program Files<span class="token punctuation">\</span>Mosquitto<span class="token operator">></span>mosquitto_sub -h <span class="token number">192.168</span>.1.22 -p <span class="token number">39999</span> -u user2 -P pw d2 -t <span class="token string">'test/topic'</span> -v Error: 由于目标计算机积极拒绝,无法连接。 |
现在用正确的用户名口令,订阅服务器的信息。
如果不记得mqtt用户名和口令了,用mosquitto_passwd.exe再生成一次口令文件
1 2 |
mosquitto_passwd.exe -H sha512 -c my_mosquitto_pwd_file.cfg user1 |
要确认my_mosquitto_pwd_file.cfg中的password_file值和mosquitto_passwd.exe中产生的口令文件相同。
用正确的用户名口令,在客户端上订阅服务器的信息
1 2 3 |
C:<span class="token punctuation">\</span>Program Files<span class="token punctuation">\</span>Mosquitto<span class="token operator">></span>mosquitto_sub -h <span class="token number">192.168</span>.1.22 -p <span class="token number">39999</span> -u user1 -P pw d1 -t <span class="token string">'test/topic'</span> -v |
可以看到订阅操作没有报错,运行正常。
在客户端向服务端发送mqtt消息。
1 2 3 |
C:<span class="token punctuation">\</span>Program Files<span class="token punctuation">\</span>Mosquitto<span class="token operator">></span>mosquitto_pub -h <span class="token number">192.168</span>.1.22 -p <span class="token number">39999</span> -u user1 -P pw d1 -t <span class="token string">'test/topic'</span> -m <span class="token string">"hello mqtt"</span> |
在客户端可以看到发送消息成功,没有报错。
同时可以在客户端刚才在cmd中开的订阅窗口,得到了刚由另外一个cmd向服务器发送的消息。
收工
那这个试验就圆满完成。
剩下的事情:
- 写一个mqtt客户端工程,向自己搭建的远程mqtt服务器发送消息。如果发送到,就可以从订阅cmd窗口看到。
- 写正式工程,先发送实际数据到自己服务器,和第三方工程时讨论,看看送的数据是否合规。
- 将实际数据送到第三方服务器,看看数据是否能显示出来。
转载请注明:徐自远的乱七八糟小站 » mqtt服务器(mosquitto)测试环境的搭建