mqtt服务器(mosquitto)测试环境的搭建

树莓派Python课程 徐 自远 1095℃

mqtt服务器(mosquitto)测试环境的搭建 – Python成神之路



前言

销售拉了个小活,让我将采集的设备数据送到第三方搭建的mqtt服务器平台上。

找了个C# mqtt demo, 不确定是否将数据送到了第三方平台上。
因为他们是封装好的网页UI, 必须符合他们的格式才能显示出来。

查资料,看到用mosquitto搭建 mqtt服务端很容易。
搭好后,测试了一下(启动mqtt服务,订阅消息,上传消息),好使。

这样的话,我可以测试自己用C#写的插件,是否可以送数据到mosquitto搭建的mqtt server. 送到了就OK.

剩下的事,就是送出的数据符合第三方约定的格式即可。

试验

试验环境

win10x64专业版最新

下载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

安装后的目录文件列表

本地使用mosquitto

默认按照好的mosquitto只能在本地使用。
如果要在客户端计算机和远程mqtt服务器之间进行mqtt操作(订阅消息,上传消息),需要修改配置文件mosquitto.conf

在本地使用mosquitto,在安装目录中的README.md中有描述

本地启动mqtt服务

打开新的cmd

从本地mqtt服务器订阅消息

打开新的cmd

本地发送消息到本地mqtt服务器

这块文档上写的不对,会报错。原因是消息必须用”符号包裹,而不是用’符号包裹。
打开新的cmd

这里要注意的是发送消息时的主题,必须和订阅的主题一样才行. e.g. 都是 ‘test/topic’

效果 – 本地服务端

效果 – 订阅本地消息

效果-发送本地消息

mqtt服务器端口的问题

上述简易试验,用的mqtt端口都是默认的。
看mosquitto命令行帮助,可以看到 -p 是指定端口的选项。

只要命令行带上 -p 就可以指定端口
用带端口来测试一下

带端口启动本地mqtt服务

假设端口是9999

带端口订阅本地消息


带端口发送mqtt消息到服务器


可以看到在订阅消息的cmd窗口,已经看到推送过来的消息

发送消息带IP

发送消息的mqtt客户端和服务器一般都不是一台,所以看看怎么带IP发送消息。

试验一下带IP, 带端口发送消息

将服务装在远程计算机上,在本地发送mqtt消息

正常用的话,mqtt客户端和mqtt服务器都不在一台计算机上。
默认安装的mosquitto,是不支持从本地mqtt客户端访问远程mqtt客户端的。

假设远程装了mosquitto的计算机IP为192.168.1.8

现在远程计算机上安装mosquitto,这个步骤和本地相同。

从本地mqtt客户端访问远程mqtt服务器,需要认证,要配置用户名,口令。
用 mosquitto_passwd.exe 来配置mqtt登陆认证的存根文件,用户名是明文,口令是密文HASH, 防止有人登入mqtt服务器所在物理计算机,看到口令明文。

看看口令文件my_mosquitto_pwd_file.cfg的内容

可以看到用户名是user1的明文,但是口令已经做了HASH. 比较安全。
再加入一个用户user2, 口令是pwd2

看看口令文件my_mosquitto_pwd_file.cfg的内容

可以看到user1没有了,看来mosquitto_passwd.exe支持一个用户名和口令。

修改配置文件mosquitto.conf

修改配置文件是为了从本地mqtt客户端访问远程mqtt服务器, 默认安装完的情况是mosquitto只能在本地测试用,没有实际用场。

配置文件的修改点如下:

mosquitto启动时,监听的是本地IP和PORT

打开日志

如果mqtt操作时报错,可以在日志中看到问题。如果没日志,就不知道报错是啥问题。
e.g. 端口没监听成功, 防火墙没放开端口,导致客户端根本没访问到mqtt服务端监听的端口,mqtt客户端访问时,认证失败…
还可以看到是哪个IP访问过mqtt服务器。
总是,打开mosquitto的运行日志,好处多多。

看看日志记录的样子

打开日志记录级别

这块没细研究,就按照配置文件给出的推荐日志级别打开几个级别。如果还有报错看不到日志,可以详细看看这里的日志级别。

不允许匿名登陆

匿名登陆只能用在本地mqtt测试。
如果远程访问,不允许匿名登陆,必须给出用户名和口令才能登陆

给出登陆认证的存根文件

因为远程登陆,必须带用户名和口令进行mqtt操作,所以必须给出存放用户名和口令的存根文件。
这个文件,就是上面用mosquitto_passwd.exe生成的认证文件。

配置文件就修改这么多就够了

启动mosquitto服务

启动启动mosquitto服务的方法有2种,都使用的配置文件mosquitto.conf

  • 安装mosquitto后,已经安装了mosquitto服务,在服务面板中可以看到。
    也可以用命令行安装

安装服务后,就可以在服务面板中启动服务。如果启动失败,去看日志文件,可以看到失败原因。

  • 直接用命令行启动(假设服务没启动)
    因为安装后的目录需要管理员权限,先用管理员模式启动cmd

没有报错信息,mosquitto正在运行。

此时要检查防火墙,让mosquitto的所监听的端口的入站和出站规则都打开。
我做实验时,将其他规则都删了,添加了4条规则,将所有端口的入站/出站的TCP/UDP端口都放开了

从本地客户端访问一下这台刚配置好的远程mqtt服务器

先用错误的用户名/口令访问一下远程的mqtt服务器

去看下日志my_mosquitto.log。

可以看到服务段启动的端口是39999.
有个客户端访问了服务器的mqtt端口,但是认证失败。

如果访问不存在的mqtt服务器,可以直接在mqtt客户端看到连接补上客户端。

现在用正确的用户名口令,订阅服务器的信息。
如果不记得mqtt用户名和口令了,用mosquitto_passwd.exe再生成一次口令文件

要确认my_mosquitto_pwd_file.cfg中的password_file值和mosquitto_passwd.exe中产生的口令文件相同。

用正确的用户名口令,在客户端上订阅服务器的信息

可以看到订阅操作没有报错,运行正常。

在客户端向服务端发送mqtt消息。

在客户端可以看到发送消息成功,没有报错。
同时可以在客户端刚才在cmd中开的订阅窗口,得到了刚由另外一个cmd向服务器发送的消息。

收工

那这个试验就圆满完成。
剩下的事情:

  • 写一个mqtt客户端工程,向自己搭建的远程mqtt服务器发送消息。如果发送到,就可以从订阅cmd窗口看到。
  • 写正式工程,先发送实际数据到自己服务器,和第三方工程时讨论,看看送的数据是否合规。
  • 将实际数据送到第三方服务器,看看数据是否能显示出来。

 

转载请注明:徐自远的乱七八糟小站 » mqtt服务器(mosquitto)测试环境的搭建

喜欢 (4)

苏ICP备18041234号-1 bei_an 苏公网安备 32021402001397号