• 【树莓派不吃灰】搭建emqx MQTT Broker


    在这里插入图片描述

    • ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件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)等。
    • 相关的命令还包括chkconfigntsysv等,chkconfig用于查看、设置服务的运行级别,ntsysv用于直观方便的设置各个服务是否自动启动。
    • service命令本身是一个shell脚本,它在/etc/init.d/目录查找指定的服务脚本,然后调用该服务脚本来完成任务。

    service xxx start来启动某个进程,那么它背后究竟执行了什么?
    其实service的绝对路径为/sbin/service ,打开这个文件cat /sbin/service,我们会发现其实它就是一个很普通的shell脚本。

    在这里插入图片描述
    在这里插入图片描述
    其实这个脚本service主要作了如下两点:

    • 1.初始化执行环境变量PATHTERM
      PATH=/sbin:/usr/sbin:/bin:/usr/bin
      TERM,为显示外设的值,一般为xterm
    • 2.调用/etc/init.d/文件夹下的相应脚本,脚本的参数为service命令第二个及之后的参数。
    这个命令在service执行到后面最终调用的是:
    env -i PATH="$PATH" TERM="$TERM" "${SERVICEDIR}/${SERVICE}" ${OPTIONS}
    
    • 1
    • 2

    以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
    以全屏幕文本界面设置服务开机时是否自动启动。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    树莓派官方推荐系统没有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 服务管理有两种方式servicesystemctl。而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版本,可以参考官方文档。

    https://www.emqx.io/docs/zh/v4.4/

    3. 总结

    这次花费半小时去搭建 emqx MQTT Broker,配置起来即可运行起来。上面还有很多命令还有去实验,可以尝试在树莓派上去输入使用。

  • 相关阅读:
    第6章:6.1 文本格式化 (MATLAB入门课程)
    6.CF431E Chemistry Experiment 权值线段树+二分
    使用python库自动为pdf增加目录
    SW利用点光源来校核
    css 设置border边框颜色渐变效果
    Python项目——项目优化(Elasticsearch)(一)
    Redis学习笔记18:基于spring data redis及lua脚本的分布式锁
    在 MongoDB 的 CRUD 操作中使用日期
    SpringBoot整合Thymeleaf
    python使用unittest进行单元测试
  • 原文地址:https://blog.csdn.net/weixin_44614230/article/details/127589423