本项目通过Docker容器化技术,在树莓派CM0 NANO单板计算机上成功部署了EMQX物联网消息接入平台,并完成了完整的MQTT通信测试。本文将详细介绍从环境准备、软件安装到应用测试的全过程。
项目概述
本项目旨在将EMQX这一高性能的云原生MQTT消息服务器部署于树莓派CM0 NANO这一资源受限的边缘设备上,为物联网(IoT)应用的快速原型开发与测试提供本地化的消息总线支持。核心步骤包括:
- Docker环境搭建:网络加速、软件源配置、脚本安装与验证。
- EMQX服务部署:镜像拉取、容器启动、管理后台访问与用户配置。
- 通信功能测试:使用MQTTX客户端进行消息收发测试,并通过Python脚本实现设备芯片温度数据的实时上报。
硬件连接准备
根据连接方式不同,硬件需求有所区别:
- SSH远程登录:需准备5V/3A电源适配器及网线。
- 本地桌面操作:在上述基础上,还需增加HDMI显示器、USB键盘和鼠标。
Docker安装与配置
在树莓派CM0 NANO上安装Docker是部署的第一步。考虑到网络环境,可先进行网络优化,随后使用官方脚本安装。
网络加速(可选)
为加速后续的镜像拉取过程,可使用Dev-Sidecar等工具进行网络加速。安装命令如下:
wget "https://bgithub.xyz/docmirror/dev-sidecar/releases/download/v2.0.0.2/DevSidecar-2.0.0.2-linux-arm64.deb"
sudo dpkg -i DevSidecar-2.0.0.2-linux-arm64.deb
若安装过程中提示依赖缺失,可执行以下命令修复:
sudo apt update
sudo apt -f install
安装Docker
推荐使用Docker官方提供的一键安装脚本:
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
安装完成后,可使用 docker -v 命令验证安装是否成功。
提示:若脚本安装因网络问题失败,可考虑更换为国内软件源后,使用apt命令进行安装,具体步骤可参考相关文档。
EMQX部署流程
EMQX是一款开源的分布式MQTT消息服务器,专为物联网设计,支持海量连接与低延迟通信。完成Docker安装后,即可开始部署EMQX。
1. 拉取EMQX镜像
执行以下命令,从Docker Hub拉取最新的EMQX镜像:
sudo docker pull emqx/emqx:latest
注意:拉取及运行EMQX容器需要至少400MB的存储空间。
2. 启动EMQX容器
通过以下命令启动一个EMQX容器实例,并映射其必要的端口(如MQTT默认端口1883、Web管理后台端口18083等):
docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx:latest
3. 访问与管理
- 在浏览器中访问
http://<你的树莓派IP地址>:18083,例如 http://192.168.1.115:18083。
- 使用默认账号(
admin)和密码(public)登录。
- 首次登录会提示修改密码,修改后即可进入EMQX管理控制台。
- 在控制台“概览”页面,可以观察到EMQX运行时的内存占用约为310MB。
容器管理常用命令:
sudo docker stop emqx # 停止容器
sudo docker start emqx # 启动容器
sudo docker restart emqx # 重启容器
4. 创建访问用户
为保障安全,建议为MQTT客户端连接创建独立的用户凭证。
- 进入控制台 “访问控制” -> “客户端认证” 页面,选择“密码认证”,基于“内置数据库”创建一个认证方式。
- 进入 “用户管理” 页面,点击“新建用户”,自定义用户名和密码并保存。
至此,EMQX已在树莓派CM0 NANO上部署完毕。
通信测试
部署完成后,我们进行两个层次的测试:基础的MQTT消息测试和模拟真实设备的数据上报测试。
测试一:MQTT消息转发
使用MQTTX客户端软件进行测试:
- 打开MQTTX,新建一个连接,填写EMQX服务器的IP地址、端口(1883)以及上一步创建的用户名和密码。
- 连接成功后,订阅一个主题,例如
rpi/cm0/demo。
- 向同一主题发布一条JSON格式的消息,如
{"temp": 27.8, "humi": 42.6}。
- 可立即在订阅窗口中收到自己发布的消息,同时在EMQX管理后台的“监控”或“主题”页面可以看到消息流统计。
测试二:芯片温度数据上报
本测试模拟一个物联网设备,周期性地读取树莓派CM0的CPU温度并通过MQTT协议上报到EMQX服务器。
实现原理流程图
Python脚本代码
创建一个名为 mqtt_temp.py 的文件,并写入以下内容。请注意将 broker、username、password 替换为你的实际信息。以下代码展示了如何使用 Python 及 paho-mqtt 库实现MQTT客户端功能。
#!/usr/bin/env python3
import paho.mqtt.client as mqtt
import time, json, subprocess
broker = “localhost” # EMQX服务器地址,本地部署可写127.0.0.1或树莓派IP
port = 1883 # MQTT端口
topic = “rpi/cm0/temp” # 发布主题
username = “xxx” # 你在EMQX创建的用户名
password = “xxx” # 对应用户的密码
client = mqtt.Client(callback_api_version=mqtt.CallbackAPIVersion.VERSION2)
client.username_pw_set(username, password) # 设置认证信息
client.connect(broker, port, keepalive=60)
def get_cpu_temp():
raw = subprocess.check_output([“vcgencmd”, “measure_temp”]).decode()
return float(raw.split(“=”)[1].split(“‘”)[0])
while True:
temp = get_cpu_temp()
payload = json.dumps({“temp”: temp, “unit”: “℃”, “ts”: int(time.time())})
client.publish(topic, payload, qos=0)
print(payload)
time.sleep(2)
运行测试
- 在终端中运行脚本:
python3 mqtt_temp.py
- 脚本将开始每2秒读取一次CPU温度并发布到
rpi/cm0/temp 主题,同时在终端打印消息。
- 在MQTTX客户端中订阅
rpi/cm0/temp 主题,可以实时接收到由EMQX服务器转发的温度数据。
总结
本文详细记录了在树莓派CM0 NANO上通过Docker容器部署EMQX物联网消息中间件的全过程,并完成了从基础连接到模拟传感器数据上报的完整功能验证。该方案为在边缘计算设备上快速搭建轻量级物联网消息枢纽提供了可行的实践参考,适用于智能家居、工业数据采集等多种场景的原型开发与测试。