【毕业设计】ESP32通过MQTT协议连接服务器(一)

0 前言

  毕设的一个重要环节是实现ESP32通过MQTT协议连接到服务器,为了测试方便,先自己安装一个虚拟机并搭建MQTT服务器来测试一下。

1 虚拟机安装与配置

1.1 安装CentOS7 Minimal

  为了和买的阿里云服务器适配,这里安装的虚拟机也是只有命令行界面的Minimal版本。
  首先要先去下载CentOS的镜像,这里推荐使用清华大学开源软件站,然后找到Linux发行版的下载链接:

在这里插入图片描述

下载CentOS7 Minimal版:

在这里插入图片描述
下载完毕后可以得到一个ISO镜像文件,接下来就是安装了,具体安装教程可以参考这篇博客,写得非常详细,完全可以作为参考,本文不再赘述。

  配置完成后重启,然后再登录,就进入到系统的控制台

在这里插入图片描述

1.2 其他配置

1.2.1 网卡配置

在开始使用虚拟机之前,还是不得不提一个点,如果是对Linux不熟悉,建议多建快照,这样有机会可以复原

  安装好的CentOS7默认是没有配置网卡的,不信可以试试直接用yum去安装软件:

在这里插入图片描述

这里会报错:could not retrieve mirrorlist http://......
或者是查看软件源中包含的软件数量:yum repolist:

在这里插入图片描述

可以看到,这里软件数量都为0,这些都是因为此时没有配置网卡

  • 首先查看一下网卡配置: cat /etc/sysconfig/network-scripts/ifcfg-ens33
    在这里插入图片描述

  • 我们需要修改的就是最后的那一项,把no改为yes即可。vi /etc/sysconfig/network-scripts/ifcfg-ens33,然后按下i进行插入,修改完成后,先按下ESC退出插入状态,按下:wq保存并退出。

  • 最后需要重启一下网卡:service network restart或者systemctl restart network

完成之后可以测试一下:

在这里插入图片描述

OK!正常了!接下来就可以愉快地安装软件玩耍了。

如果联网出现问题,检查一下虚拟机网卡模式是否设置为NAT模式

1.2.2 界面美化

  之所以用命令行而不是带界面(X-system)的系统,主要还是为了学习Linux的“核心技术”,并不是某些人对原始界面的执着。考虑到原装的系统过于难看,而且字体也很小,于是决定略微美化一下。
  虽然可以将终端的字体变大变好看,但是简单在网上找了一下资料发现有点麻烦,而且能换的字体也不多。于是也不想搞了,索性咱们换一个终端
  这里的解决方案是使用XShell软件,通过SSH连接到虚拟机,反正虚拟机也只有终端,这样在操作的时候看的就是XShell的终端了,就可以通过设置XShell这个软件来间接达到美化的目的。

  首先需要查看一下虚拟机的IP地址:

ip addr #直接输入 "ip a" 也是可以的

在这里插入图片描述

注意到,这里有两个地址,分别是lo和ens33,其中lo就是回环地址,也就是127.0.0.1,而ens33就是我们刚刚配置的网卡了。

这里的brd指的应该是广播地址

  知道虚拟机IP后,接下来就是用XShell来连接虚拟机(前提是保证虚拟机是开机的,是否登录没有要求)。

在这里插入图片描述

在这里插入图片描述
这样终端至少比虚拟机中要好看得多,此外,在左侧会话栏中右键,点击属性,还可以修改界面的样式,如字体。建议使用NF字体,这样后面改变样式能够显示得更好。

  除了通过改变终端来改变显示样式外,还可以通过第三方的软件来修改终端的首行样式。这样将命令和输出区别开来,看起来更方便一点。这样使用的是oh-my-zsh!,它是建立在zsh软件基础上的一个框架,用于美化终端,因此在使用前需要先下载zsh软件并将其设置为默认终端:

yum install zsh

安装完成后可以发现配置文件中的shell增加了一项:
在这里插入图片描述
而当前使用的终端为bash:
在这里插入图片描述

改变默认终端:
在这里插入图片描述
这里可能需要重启一下终端才会生效。

参考链接


  安装好zsh后,接下来就是安装oh-my-zsh了,方法建议直接参考GitHub仓库

wget https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh
sh install.sh

这里可能会显示wget,git等找不到,问题不大,用yum安装即可。见到如下界面,就代表安装成功了,此时的样式为其默认的样式:

在这里插入图片描述
如果觉得不够好看,还可以改为其他的样式

vi .zshrc #在 /root 路径下

在这里插入图片描述

这里改为对应的主题即可。设置完成后重启终端即可。

如果要查看已安装了哪些主题,可以用ls查看oh-my-zsh下面的themes文件夹
在这里插入图片描述

如果要看这些样式具体长啥样,可以参考官方的screenshots

到此,美化部分就差不多完成了。最终样式如下图所示,和上面对比一下,字体和颜色是不是好看很多了?

在这里插入图片描述

2 下载mosquitto并搭建MQTT服务器

搞之前建议先建立快照

  目前搭建MQTT服务器比较常用的是两个软件,一个是mosquitto,还有一个是emqx,后者比较适用于有图形界面的设备,可以直接图形化配置服务器,有兴趣的可以到它官网学习研究一下。下面主要展示的是基于mosquitto搭建的MQTT服务器。

2.1 下载并安装

  目前mosquitto常用的主要有两个版本,1.6.x和2.0.x,两者其实差不多,都支持目前最新的MQTT v5协议。不过默认设置有点差别,2.0.x版本默认不监听1883端口,且默认需要客户端认证,也就是禁止匿名访问。不过这些设置都能手动修改,所以本质差别不大。

2.1.1 旧版1.6.x的安装

  旧版的安装相对更简单(建议不想折腾的首选这个),直接使用yum安装即可:

yum install mosquitto

如果没有找到这个包,那就先安装epel软件源

yum install epel-release.noarch

然后再执行上述命令。

安装完成后输入mosquitto --help测试一下,不报错就说明安装成功了。

2.1.2 新版2.0.x的安装

  如果你和我一样喜欢尝试最新版,可以考虑在官网下载最新版安装,不过可惜的是,官网不提供rpm包,只能自己编译安装。

  首先在官网:https://mosquitto.org/files/source/中找到最新版的gz压缩包。

在这里插入图片描述

别盲目划到最底下,最新的15在上面。这排序做的。。。。。

然后右键复制它的链接,在命令行中用wget下载

wget https://mosquitto.org/files/source/mosquitto-2.0.15.tar.gz

如果会提示不安全,则按照它的要求来,加上--no-check-certificate

再用tar解压:

tar -xf mosquitto-2.0.15.tar.gz

最后就是进入到目录中然后编译即可:

cd mosquitto-2.0.15
make
make install #或者直接 make; make install

如果编译失败,可能需要安装一些基础的组件,如gccgcc-c++, openssl-devel:

yum install gcc gcc-c++ openssl-devel

如果提示cjson/cJSON.h: No such file or directory,那就是缺少cjson这个包,不要慌,再安装一下就好了。

在这里插入图片描述

先到这个链接下载tar.gz包(或者和上面一样,用wget+压缩包链接的方式下载),然后解压并进入到目录下,编译安装:

make
make install #或者直接 make; make install

安装好之后再回到mosquitto文件夹下,继续编译安装。(最好先运行make clean清理一下之前的编译文件)

运行完毕后,可以直接在命令行中输入mosquitto --help测试一下:

在这里插入图片描述
能够正常显示帮助文档说明安装没有问题了。

简单扩展一下:这种编译的软件如果要卸载需要进入到安装包目录使用make uninstall,如果要清理之前编译的内容,使用make clean
所以文件夹最好别删了。

2.2 简单的连接测试

  安装完成之后,接下来可以试试在虚拟机内部进行sub/pub的测试了。首先来看看mosquitto命令有哪些参数:

在这里插入图片描述

  一般使用方式是mosquitto -c /etc/mosquitto/mosquitto.conf [-d] [-v]. 加上-v表示输出详情,这样可以看到日志输出;加上-d使服务器在后台运行,这样可以少开一个终端,但也无法获取服务器的运行状况。

  当服务器运行起来之后,就可以设置sub/pub了,为了体现效果,一般先设置sub部分:
  如果上面没加-d,则此时需要再开启一个终端,使用mosquitto_sub来执行sub操作,如果对这个指令不熟悉,可以使用man mosquitto_sub来获取帮助文档。

在这里插入图片描述

  一般的用法:mosquitto_sub [-h <hostname>] [-p <port>] [-u <user>] [-P <passwd>] [-t <topic>]

  简单一点测试的话,直接输入mosquitto_sub -t test

  不过如果是编译安装的可能会遇到一个问题:

在这里插入图片描述
提示找不到一个文件,但在系统中搜索又能找到软件安装时新建的同名文件,参考这个链接,发现这是Linux中安装软件常见的问题,也就是系统在执行程序时默认查找的库不包含软件安装时库文件放置的位置,我是用第二种方式,亲测有效,点个赞!

直接在命令行输入:

vi .bashrc
# 按下i在某行插入下面内容
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
# 刷新一下
source .bashrc

如果有按照上面配置方法配置了zsh,需要修改的就是.zshrc了:

vi .zshrc
# 按下i在某行插入下面内容
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
# 刷新一下
source .zshrc

参考链接

  设置好之后再运行mosquitto_pub,应该就没啥问题了。

  运行sub命令后,终端会卡在那,等待接收的消息,因此需要再开启一个终端,运行pub命令。
  mosquitto发布消息的指令是mosquitto_pub,和sub命令一样,如果不清楚使用方法,也可以用--help来查看指令:

在这里插入图片描述
可以发现它和sub指令的用法差不多。

  一般用法:mosquitto_pub -t topic -m "message"

  每次运行之后都会在sub所在的终端看到发送的消息,这就代表服务器运行以及消息订阅和发送没有问题。


一点小扩展:服务器运行起来之后怎么关闭呢?

  千万别直接快捷键Ctrl + Z,这个指令并不等价于Windows中的Ctrl + C,并不是终止命令的,而是挂起命令的,正确的关闭命令进程要使用kill指令:

ps aux | grep mosquitto

#查看进程然后关闭
kill -9 pid

参考链接

2.3 外部客户端连接测试

  上述连接只是在本地连接而已,利用的地址为127.0.0.1这个回环地址,而且在运行服务器时也会有提示:Starting in local only mode

在这里插入图片描述

但实际使用时肯定不是订阅和发布在一台计算机上面,因此需要简单配置一下,实现让外部也可以访问。

  首先编辑配置文件:

vi /etc/mosquitto/mosquitto.conf #编辑配置文件

按下/输入需要检索的内容,然后按n跳转到下一个检索关键词处,然后再按下i进行修改。主要是修改两个部分:

listener 1883 #设置默认监听的端口号
allow_anonymous true #设置允许匿名登录

修改完之后,按下ESC退出,再输入:wq保存退出。然后重新运行mosquitto,就能发现之前的“Starting in local only mode”提示消失了。

在这里插入图片描述

这里有一个Warning,说没有找到mosquitto这个用户,这是因为这个软件的默认用户为mosquitto,但系统中又没有这个用户,所以出现了这个警告,如果不在意的话也不会影响运行,想要解决也很简单,那就是在conf文件中找到user mosquitto这行,改为root即可(虽然它不推荐这样)。

  设置外服务器后还没完,还需要设置系统的防火墙开放端口,否则外部设备无法连接。方法也很简单:

firewall-cmd --add-port=1883/tcp #暂时开放端口,系统重启失效
firewall-cmd --add-port=1883/tcp --permanent #永久开放端口,系统重启仍然生效
firewall-cmd --list-port #查看暂时开放的端口
firewall-cmd --list-port --permanent #查看永久开放的端口

注意,这里的暂时开放和永久开放都要执行一遍,因为永久开放但是此时不会开放!得重启生效!

  此外,为了证明这个服务器可以被外界连接,这里建议在宿主机上(保证同一局域网)安装MQTT客户端软件进行测试,推荐使用MQTTX

  每次新建一个连接时,如下图所示,除这些设置外其他可以保持默认。

在这里插入图片描述

如果连接成功,那恭喜你,服务器就配置好了。

2.4 配置服务开机自启

  从上面的启动服务的过程来看,实在是太麻烦了,服务器开启终端之后就会卡在那,虽然可以使用-d参数使其运行在后台,但是每次开机都需要运行一遍,比较麻烦,所以推荐将其设置为开机启动。所谓开机自启,实际上就是把运行服务的命令和一些配置信息打包到一个文件当中并把这个文件放在系统的特定位置而已。前面推荐了两种安装方式,不同的安装方式设置开机启动略有不同。

2.4.1 旧版1.6.x的设置

  使用yum安装还有一个好处,那就是会自动添加系统服务,即在/etc/systemd/system路径下添加了一个名为mosquitto.service的文件:

在这里插入图片描述

因此,如果要设置这个服务开机自启的话,可以直接这样设置:

systemctl enable mosquitto.service 

在这里插入图片描述

这个其实就是把这个服务添加到multi-user.target.wants这个文件夹下,至于为什么是这个文件夹,请看后文分解。

  将服务添加到这个文件夹后,接下来就可以启动这个服务了:

systemctl start mosquitto.service

这一步很有可能会遇到很多问题,千万不要慌。一般来说大概有这几种类型:

  • 执行文件路径错误,通过systemctl status mosquitto.service查看服务状态,观察执行文件路径是否错误,比如/usr/local/sbin写成了usr/sbin,遇到这个问题需要先disable,删除multi-user文件夹下的service,再vi修改system下的service文件,再enable
  • 有多个service。可能存在一种情况就是在/lib文件夹下也有mosquitto.service这个文件,然后造成冲突。可以通过locate命令查找,不过要记得updatedb
  • conf文件错误。这种就是conf文件配置错误,比如指定listener指定了一个错误的地址,然后执行出错。(但实际执行mosquitto -c .....conf却不会报错,不知道为啥。。。。)

总之就是一点:遇到错误不要慌,先用status查看服务的状态,然后针对报错对应的解决。

  服务开启之后理论上就可以正常连接到host为局域网IP、端口默认为1883的服务器了,因为这个端口默认监听且开启了匿名访问权限。

2.4.1 新版2.0.x的设置

  新版软件安装完成后还需要手动添加mosquitto.service文件,因为/etc/systemd/system路径下没有,不能直接使用systemctl enable。不过好在源码包里面提供了这个文件,不用我们手写,先用locate找找:

updatedb; locate mosquitto.service #查找前要记得更新数据库

在这里插入图片描述

在这里找到了两个文件,选择下面的simple版复制到/etc/systemd/system文件夹下并改个名字(去掉末尾的.example):

cp /root/mosquitto-2.0.15/service/systemd/mosquitto.service.simple /etc/systemd/system/mosquitto.service

再改改复制过去的文件,怕出问题:

vi /etc/systemd/system/mosquitto.service

在这里插入图片描述

  这里的ExecStart表示这个服务对应的需要执行的命令。显然,这里路径不太对,可以用whereis查询一下可执行文件所在的位置:

在这里插入图片描述

将上面的路径修改好并保存。

还要确定那个conf文件是否真的存在,因为有可能文件名不同

在这里插入图片描述

另外还有这个设置用户和群组的命令,应该是表示正式运行前预执行的命令,改为自己的用户名和群组。

  全部修改完毕和系统中的实际匹配了,然后就是enable和start启动服务即可。

  注意看最后[Install]项,实际上就是对应执行enable之后service文件会被复制到的位置。(解答了上面的疑问)

参考链接

3 拓展:在Windows上安装

  mosquitto官网还提供了Windows平台下的安装包,如果想在Windows平台搭建MQTT服务器,也可以安装尝试一下,步骤和上面基本差不多。详细过程可以参考这个链接

猜你喜欢

转载自blog.csdn.net/ZHOU_YONG915/article/details/129891023