毕设的一个重要环节是实现ESP32通过MQTT协议连接到服务器,为了测试方便,先自己安装一个虚拟机并搭建MQTT服务器来测试一下。
为了和买的阿里云服务器适配,这里安装的虚拟机也是只有命令行界面的Minimal版本。
首先要先去下载CentOS的镜像,这里推荐使用清华大学开源软件站,然后找到Linux发行版的下载链接:
下载CentOS7 Minimal版:
下载完毕后可以得到一个ISO镜像文件,接下来就是安装了,具体安装教程可以参考这篇博客,写得非常详细,完全可以作为参考,本文不再赘述。
配置完成后重启,然后再登录,就进入到系统的控制台
在开始使用虚拟机之前,还是不得不提一个点,如果是对Linux不熟悉,建议多建快照,这样有机会可以复原
安装好的CentOS7默认是没有配置网卡的,不信可以试试直接用yum
去安装软件:
这里会报错:could not retrieve mirrorlist http://......
或者是查看软件源中包含的软件数量:yum repolist
:
可以看到,这里软件数量都为0,这些都是因为此时没有配置网卡
我们需要修改的就是最后的那一项,把no改为yes即可。vi /etc/sysconfig/network-scripts/ifcfg-ens33
,然后按下i
进行插入,修改完成后,先按下ESC
退出插入状态,按下:wq
保存并退出。
最后需要重启一下网卡:service network restart
或者systemctl restart network
完成之后可以测试一下:
OK!正常了!接下来就可以愉快地安装软件玩耍了。
如果联网出现问题,检查一下虚拟机网卡模式是否设置为NAT模式
之所以用命令行而不是带界面(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。
到此,美化部分就差不多完成了。最终样式如下图所示,和上面对比一下,字体和颜色是不是好看很多了?
搞之前建议先建立快照
目前搭建MQTT服务器比较常用的是两个软件,一个是mosquitto
,还有一个是emqx
,后者比较适用于有图形界面的设备,可以直接图形化配置服务器,有兴趣的可以到它官网学习研究一下。下面主要展示的是基于mosquitto
搭建的MQTT服务器。
目前mosquitto
常用的主要有两个版本,1.6.x和2.0.x,两者其实差不多,都支持目前最新的MQTT v5协议。不过默认设置有点差别,2.0.x版本默认不监听1883端口,且默认需要客户端认证,也就是禁止匿名访问。不过这些设置都能手动修改,所以本质差别不大。
旧版的安装相对更简单(建议不想折腾的首选这个),直接使用yum安装即可:
yum install mosquitto
如果没有找到这个包,那就先安装epel软件源:
yum install epel-release.noarch
然后再执行上述命令。
安装完成后输入mosquitto --help
测试一下,不报错就说明安装成功了。
如果你和我一样喜欢尝试最新版,可以考虑在官网下载最新版安装,不过可惜的是,官网不提供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
如果编译失败,可能需要安装一些基础的组件,如gcc
,gcc-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
所以文件夹最好别删了。
安装完成之后,接下来可以试试在虚拟机内部进行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
简单一点测试的话,直接输入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
来查看指令:
一般用法:mosquitto_pub -t topic -m "message"
每次运行之后都会在sub所在的终端看到发送的消息,这就代表服务器运行以及消息订阅和发送没有问题。
一点小扩展:服务器运行起来之后怎么关闭呢?
千万别直接快捷键Ctrl + Z,这个指令并不等价于Windows中的Ctrl + C,并不是终止命令的,而是挂起命令的,正确的关闭命令进程要使用kill
指令:
ps aux | grep mosquitto
#查看进程然后关闭
kill -9 pid
参考链接
上述连接只是在本地连接而已,利用的地址为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。
每次新建一个连接时,如下图所示,除这些设置外其他可以保持默认。
如果连接成功,那恭喜你,服务器就配置好了。
从上面的启动服务的过程来看,实在是太麻烦了,服务器开启终端之后就会卡在那,虽然可以使用-d
参数使其运行在后台,但是每次开机都需要运行一遍,比较麻烦,所以推荐将其设置为开机启动。所谓开机自启,实际上就是把运行服务的命令和一些配置信息打包到一个文件当中并把这个文件放在系统的特定位置而已。前面推荐了两种安装方式,不同的安装方式设置开机启动略有不同。
使用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/lib
文件夹下也有mosquitto.service
这个文件,然后造成冲突。可以通过locate
命令查找,不过要记得updatedb
listener
指定了一个错误的地址,然后执行出错。(但实际执行mosquitto -c .....conf
却不会报错,不知道为啥。。。。)总之就是一点:遇到错误不要慌,先用status查看服务的状态,然后针对报错对应的解决。
服务开启之后理论上就可以正常连接到host为局域网IP、端口默认为1883的服务器了,因为这个端口默认监听且开启了匿名访问权限。
新版软件安装完成后还需要手动添加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文件会被复制到的位置。(解答了上面的疑问)
参考链接
mosquitto官网还提供了Windows平台下的安装包,如果想在Windows平台搭建MQTT服务器,也可以安装尝试一下,步骤和上面基本差不多。详细过程可以参考这个链接。