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是允许匿名连接的,而且没有加密。这在生产环境里是绝对不行的。

⚠️ 警告: 生产环境务必关闭匿名登录,并启用TLS加密。我曾经见过一个客户,直接把Mosquitto裸奔在公网上,结果被黑客用来挖矿,CPU飙到100%。

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(加密)。

⚠️ 注意: 阿里云的MQTT服务对Topic格式有严格要求。设备端必须使用 /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。

💡 我的经验: 选择云平台时,别只看MQTT功能。要看它和自家生态的整合程度。比如你已经在用阿里云的OSS做固件存储,那阿里云IoT平台就是最自然的选择。反之,如果你用华为云的OBS和FunctionGraph,那华为云IoTDA会更顺手。说白了,选平台就是选生态。

3.4 小结

这一章我们聊了三种MQTT Broker方案:

  • Mosquitto:适合小规模、本地部署。轻量、简单、免费。
  • EMQX:适合大规模、企业级场景。功能丰富、性能强悍。
  • 云平台MQTT:适合不想自己运维的团队。省心、安全、但有一定成本。

你想想看,你的项目现在处于哪个阶段?是几十台设备的原型验证,还是几万台设备的生产部署?不同的阶段,适合不同的方案。我个人建议:原型阶段用Mosquitto,快速验证;量产阶段再迁移到EMQX或云平台。这样既灵活又稳妥。

下一章,我们会聊MQTT的Topic设计和权限管理。嗯,那才是真正考验架构能力的地方。