目录
- ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️
- ❤️ 本篇创建记录 2022-10-29 ❤️
- ❤️ 本篇更新记录 2022-10-29 ❤️
- 🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言 📝
- 🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请留言轰炸哦!及时修正!感谢支持!
- 🔥 Arduino ESP8266教程累计帮助过超过1W+同学入门学习硬件网络编程,入选过选修课程,刊登过无线电杂志🔥
1. 前言
之前我们在个人电脑部署过emqx,那么树莓派理论上只要资源允许也可以部署一套。
当然,由于系统差异,我们需要找到适用于树莓派系统的镜像文件(deb文件
)。
而一般在学习物联网中,emqx是提及最多的开源免费mqtt服务器,部署简单。
2. 搭建emqx MQTT Broker
这里介绍一条有用的命令,用于查看树莓派系统信息:
cat /etc/os-release
言归正传,搭建emqx分为几个步骤:
- 下载 deb文件
- 安装软件
- 启动软件,也可以设置开机自启动
2.1 下载 deb文件
我们去到github下载对应的软件版本,目前博主找到多个适用于树莓派3B。尽量装新不装旧。
这里以 V4.4.3版本为例子:
获取到文件下载地址:
https://github.com/emqx/emqx/releases/download/v4.4.3/emqx-edge-4.4.3-otp24.1.5-3-raspbian10-arm.deb
在树莓派终端输入命令下载该文件:
sudo wget https://github.com/emqx/emqx/releases/download/v4.4.3/emqx-edge-4.4.3-otp24.1.5-3-raspbian10-arm.deb
2.2 安装软件
我们需要使用dpkg命令来安装包。输入命令:
sudo dpkg -i deb文件名
额外知识点:
1、使用dpkg命令进行安装:sudo dpkg -i deb文件名
2、根据经验,通常情况下会报依赖关系的错误,我们可以使用以下的命令修复安装:sudo apt-get install -f
3、如果要卸载安装的应用我们通过“sudo dpkg -l”查看已经安装的软件,并找到自己的安装的软件名。
4、最后使用"sudo dpkg -r 软件名"进行卸载
注意这个版本是自动启动了,有一些版本需要进行第三步。
2.3 启动软件
2.3.1 Service命令原理
在讲启动软件之前,我们先来了解一个叫做service的命令。
- service命令用于对系统服务进行管理,比如启动(
start
)、停止(stop
)、重启(restart
)、查看状态(status
)等。- 相关的命令还包括
chkconfig
、ntsysv
等,chkconfig用于查看、设置服务的运行级别,ntsysv用于直观方便的设置各个服务是否自动启动。- service命令本身是一个shell脚本,它在/etc/init.d/目录查找指定的服务脚本,然后调用该服务脚本来完成任务。
service xxx start来启动某个进程,那么它背后究竟执行了什么?
其实service的绝对路径为/sbin/service ,打开这个文件cat /sbin/service
,我们会发现其实它就是一个很普通的shell脚本。
其实这个脚本service主要作了如下两点:
- 1.初始化执行环境变量
PATH
和TERM
PATH=/sbin:/usr/sbin:/bin:/usr/bin
TERM,为显示外设的值,一般为xterm - 2.调用
/etc/init.d/
文件夹下的相应脚本,脚本的参数为service命令第二个及之后的参数。
这个命令在service执行到后面最终调用的是:
env -i PATH="$PATH" TERM="$TERM" "${SERVICEDIR}/${SERVICE}" ${OPTIONS}
以service emqx start为例,相当于执行了如下命令
/etc/init.d/emqx start
2.3.2 Service命令常用方式
格式:service <service>
打印指定服务<service>的命令行使用帮助。
格式:service <service> start
启动指定的系统服务<service>
格式:service <service> stop
停止指定的系统服务<service>
格式:service <service> restart
重新启动指定的系统服务<service>,即先停止(stop),然后再启动(start)。
格式:chkconfig --list
查看系统服务列表,以及每个服务的运行级别。
格式:chkconfig <service> on
设置指定服务<service>开机时自动启动。
格式:chkconfig <service> off
设置指定服务<service>开机时不自动启动。
格式:ntsysv
以全屏幕文本界面设置服务开机时是否自动启动。
树莓派官方推荐系统没有chkconfig
命令,可以通过命令安装:
sudo apt-get install chkconfig
2.3.3 启动emqx
输入命令:
sudo service emqx start
浏览器输入 http://<树莓派IP地址>:18083/,进入web的控制后台
2.4 设置开机自启动
在设置自启动之前,先来了解另外一个命令 systemctl
这里有一些参考资料:
2.4.1 systemd和systemctl
Linux 服务管理有两种方式service
和systemctl
。而systemd是Linux系统最新的初始化系统(init),作用是提高系统的启动速度,尽可能启动较少的进程,尽可能更多进程并发启动,systemd对应的进程管理命令就是systemctl
。值得一提的是,systemctl命令兼容了service。
Systemctl是systemd用于管理系统和管理服务的工具。许多现代Linux发行版,如Ubuntu、Debian、Fedora、Linux Mint、OpenSuSE、Redhat都采用systemd作为默认的init系统
。
- Linux系统启动的时候,第一个创建的进程(即pid是1的进程)叫
init
. 它会负责启动后续其他的进程,包括各类系统服务。从进程树上可以看出,init是所有其他进程的祖先
。- 早年的Linux里的init进程是System V init.
chkconfig
命令是用来查询或更新run level相关的信息的。比如一些旧版的书上会说init 3启动单用户命令行界面。- Ubuntu的开发者发明了upstart, 用来取代System V init. 在使用了upstart的系统中,service start/stop是常用的启动和停止系统服务的命令。
- 近年来越来越多的发行版开始采用systemd作为初始进程。它用systemctl来管理服务。有些使用systemd的系统为了兼容默认upstart的脚本,会创建一些别名或者脚本来让service命令也可以执行systemctl的操作。
service和chkconfig都是比较老的服务管理工具
2.4.2 systemd的配置文件目录
-
/lib/systemd/system/
:每个服务最主要的启动脚本的配置放在这,有点类似以前的/etc/init.d
。
-
/run/systemd/system/
:系统执行过程中所产生的服务脚本所在目录,这些脚本的优先级要比/lib/systemd/system/
高 -
/etc/systemd/system/
:管理员根据主机系统的需求所创建的执行脚本所在目录,执行优先级比/run/systemd/system/
高
从上面的功能及优先级次序,我们可以知道:
- /etc/systemd/system/目录下的相关配置,
决定系统了会不会执行某些服务,所以该目录下面一般放着一大堆链接文件
(等会我们找一下emqx的执行文件)。- 而
/lib/systemd/system/
下,则放着实际执行的systemd启动脚本配置文件。因此如果你想要修改某个服务启动的设置,应该去/lib/systemd/system/下面修改。/etc/systemd/system/
仅是链接到正确的执行脚本配置文件而已。所以想要看执行脚本设置,大多数就得要到/lib/systemd/system/
去查阅。
2.4.3 systemd常用命令
使用systemctl,可以启动、停止、重新加载、重启服务、列出服务单元、检查服务状态、启用/禁用服务、管理运行级别和电源管理。
-
使用systemctl命令
start
/stop
/restart
/reload
/disable
/enable
服务。 -
使用systemctl启动服务时,命令格式:
systemctl start [service-name]
。 -
要停止服务,请使用
systemctl stop [service-name]
。 -
要重新启动服务,请使用
systemctl restart [service-name]
。 -
要重新加载服务的配置而不重新启动它,请使用
systemctl reload [service-name]
。 -
为了查看服务是否正在运行,我们可以使用
systemctl status [service-name]
来查看。 -
要开机自启用服务,请使用
systemctl enable [service-name]
。 -
同样,disable时取消开机时启用服务,请使用
systemctl disable [service-name]
。 -
可以使用is-enabled选项检查开机是否启动该服务,请使用
systemctl is-enabled [service-name]
。 -
要列出所有激活的单元,使用list-units选项。
systemctl list-units
-
要列出所有活动的服务,请运行:
systemctl list-units -t service
-
使用systemctl重启、关机系统。
systemctl poweroff
(关机)
systemctl reboot
(重启)
systemctl hibernate
(系统休眠)
2.4.4 配置起来
输入命令:
- sudo systemctl enable emqx
这里会创建一个symlink。
Created symlink /etc/systemd/system/multi-user.target.wants/emqx.service → /lib/systemd/system/emqx.service.
这是最关键的一行代码。看到 /etc/systemd/system/multi-user.target.wants/emqx.service
链接,链接到 /lib/systemd/system/emqx.service
文件。这时候关联 2.4.2 小节再看。
这下子就慢慢通达了。
我们试试禁止自启动看看。
sudo systemctl disable emqx
再一次设置自启动。
输入命令:
- sudo systemctl enable emqx
重新启动系统看看。
输入命令:
- sudo reboot
成功运行!!!!念头通达!
另外,我们这里安装的是 4.4版本,可以参考官方文档。
3. 总结
这次花费半小时去搭建 emqx MQTT Broker,配置起来即可运行起来。上面还有很多命令还有去实验,可以尝试在树莓派上去输入使用。