3、MQTT Broker搭建:Mosquitto安装与配置、EMQX简介、云平台MQTT服务(阿里云/华为云)
聊到物联网设备OTA,MQTT Broker是绕不开的核心角色。说白了,它就是整个消息系统的“邮局”。设备发消息,它负责转发;设备收指令,它也负责投递。没有它,设备之间就是孤岛。
我个人习惯把Broker分成三类:轻量级的Mosquitto、企业级的EMQX、以及云平台自带的MQTT服务。今天咱们就一个一个捋清楚。
3.1 Mosquitto:轻量级Broker的“老黄牛”
Mosquitto是我最早接触的MQTT Broker。它轻、快、稳,特别适合资源受限的嵌入式设备或者本地局域网场景。我在一个智能家居项目里用过它,跑在树莓派上,带几十个传感器节点,稳如老狗。
3.1.1 安装Mosquitto
安装其实很简单。Ubuntu/Debian系统下,一行命令搞定:
sudo apt-get update
sudo apt-get install mosquitto mosquitto-clients
安装完成后,Mosquitto会自动启动。你可以用 systemctl status mosquitto 检查状态。嗯,这里要注意:默认配置下,Mosquitto是允许匿名连接的,而且没有加密。这在生产环境里是绝对不行的。
3.1.2 基础配置
Mosquitto的配置文件在 /etc/mosquitto/mosquitto.conf。我个人习惯先备份原文件,再修改:
sudo cp /etc/mosquitto/mosquitto.conf /etc/mosquitto/mosquitto.conf.bak
sudo nano /etc/mosquitto/mosquitto.conf
下面是一个最简配置示例:
# 监听端口
listener 1883
# 允许匿名连接(测试用,生产环境请关闭)
allow_anonymous true
# 数据持久化
persistence true
persistence_location /var/lib/mosquitto/
# 日志
log_dest file /var/log/mosquitto/mosquitto.log
配置完重启服务:
sudo systemctl restart mosquitto
3.1.3 测试连接
用mosquitto自带的客户端工具测试:
# 订阅主题
mosquitto_sub -h localhost -t "test/topic"
# 另一个终端发布消息
mosquitto_pub -h localhost -t "test/topic" -m "Hello, OTA!"
如果订阅端收到了消息,说明Broker跑起来了。就是这么简单。
-v 参数(verbose模式),能看到更多细节。比如 mosquitto_sub -h localhost -t "#" -v 可以订阅所有主题。
3.2 EMQX:企业级Broker的“全能选手”
当设备量级从几十台变成几万台,Mosquitto就有点吃力了。这时候就该EMQX上场了。EMQX支持百万级并发连接,而且内置了规则引擎、数据桥接、集群等功能。说白了,它就是为大规模IoT场景设计的。
我记得有一次帮一个智慧城市项目做方案,设备量预估在50万左右。我们对比了Mosquitto和EMQX,最后选了EMQX。原因很简单:Mosquitto集群配置太复杂,而EMQX开箱即用,自带Web管理界面。
3.2.1 安装EMQX
EMQX的安装也很方便。以Ubuntu为例:
# 添加EMQX仓库
curl -s https://packages.emqx.io/emqx/emqx.repo | sudo tee /etc/yum.repos.d/emqx.repo
# 安装
sudo apt-get install emqx
# 启动
sudo systemctl start emqx
启动后,访问 http://localhost:18083 就能看到Web管理界面。默认用户名 admin,密码 public。嗯,记得第一时间改密码。
3.2.2 EMQX的核心优势
我列几个EMQX让我印象深刻的功能:
- 规则引擎:可以直接在Broker里做数据过滤、转换,甚至写入数据库。省去了写额外中间件的麻烦。
- 数据桥接:支持将MQTT消息直接转发到Kafka、InfluxDB、MySQL等。我在项目中用它把设备数据实时写入时序数据库,非常丝滑。
- 集群扩展:水平扩展能力很强。加节点就能线性提升性能,适合业务快速增长的情况。
📌 我的建议: 如果你的设备量超过1万台,或者需要高可用性,直接上EMQX。别在Mosquitto上折腾集群了,那是一条弯路。我走过,真的。
3.3 云平台MQTT服务:阿里云与华为云
自己搭Broker虽然灵活,但运维成本高。对于很多团队来说,直接用云平台的MQTT服务是更省心的选择。阿里云和华为云都提供了成熟的MQTT接入方案。
3.3.1 阿里云物联网平台
阿里云的MQTT服务集成在“物联网平台”里。它的特点是:
- 设备认证:支持一机一密、一型一密。安全性有保障。
- Topic管理:有严格的Topic权限控制。设备只能发布/订阅被授权的Topic。
- 规则引擎:可以将设备数据转发到阿里云的其他服务,比如表格存储、函数计算。
连接阿里云MQTT时,设备端需要三个关键信息:
| 参数 | 说明 |
|---|---|
| ProductKey | 产品唯一标识 |
| DeviceName | 设备名称 |
| DeviceSecret | 设备密钥 |
连接地址格式一般是:${ProductKey}.iot-as-mqtt.cn-shanghai.aliyuncs.com。端口1883(非加密)或8883(加密)。
/sys/${ProductKey}/${DeviceName}/... 或 /broadcast/${ProductKey}/... 这类预定义格式。自己随便写Topic是连不上的。我第一次用的时候就被这个坑过,排查了半天。
3.3.2 华为云IoT平台
华为云的MQTT服务叫“IoTDA”(IoT Device Access)。它的设计思路和阿里云类似,但有一些自己的特色:
- 设备影子:华为云提供了设备影子功能,可以缓存设备的最新状态。即使设备离线,应用也能读取到它的状态。
- 消息跟踪:可以在控制台追踪一条消息的完整生命周期。调试时非常有用。
- OTA升级:华为云内置了OTA升级服务,和MQTT无缝集成。这个我们在后面的章节会详细讲。
连接华为云时,设备端需要:
| 参数 | 说明 |
|---|---|
| 设备ID | 设备在平台上的唯一标识 |
| 密钥 | 设备认证密钥 |
| 接入地址 | 平台提供的MQTT接入点 |
华为云的接入地址格式是:${iotda-endpoint}.iotda.${region}.myhuaweicloud.com。端口也是1883或8883。
3.4 小结
这一章我们聊了三种MQTT Broker方案:
- Mosquitto:适合小规模、本地部署。轻量、简单、免费。
- EMQX:适合大规模、企业级场景。功能丰富、性能强悍。
- 云平台MQTT:适合不想自己运维的团队。省心、安全、但有一定成本。
你想想看,你的项目现在处于哪个阶段?是几十台设备的原型验证,还是几万台设备的生产部署?不同的阶段,适合不同的方案。我个人建议:原型阶段用Mosquitto,快速验证;量产阶段再迁移到EMQX或云平台。这样既灵活又稳妥。
下一章,我们会聊MQTT的Topic设计和权限管理。嗯,那才是真正考验架构能力的地方。