文章目录
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
或者是查看软件源中包含的软件数目:yum repolist:
可以看见,这里软件数目都为0,这些都是由于此时没有配置网卡
完成以后可以测试一下:
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包,只能自己编译安装。
首先在官网:中找到最新版的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
如果编译失败,可能须要安装一些基础的组件linux 删除文件夹,如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清除一下之前的编译文件)
运行完毕后linux搭建服务器用哪个版本比较好,可以直接在命令行中输入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 ] [-p
] [-u ] [-P
] [-t ]
简单一点测试的话,直接输入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的文件:
因此linux搭建服务器用哪个版本比较好,如果要设置这个服务开机自启的话,可以直接这样设置:
systemctl enable mosquitto.service
这个似乎就是把这个服务添加到multi-user.target.wants这个文件夹下,至于为何是这个文件夹,请看后文分解。
将服务添加到这个文件夹后,接下来就可以启动这个服务了:
systemctl start mosquitto.service
这一步很有可能会碰到好多问题,千万不要慌。一般来说大约有这几种类型:
总之就是一点:遇到错误不要慌,先用status查看服务的状态,然后针对报错对应的解决。
服务开启以后理论上就可以正常联接到host为局域网IP、端口默认为1883的服务器了linux基础教程,因为这个端口默认窃听且开启了匿名访问权限。
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服务器,也可以安装尝试一下,步骤和前面基本差不多。详细过程可以参考这个链接。