物联网场景中常见的方案MQTT+WebSocket

物联网场景中常见的方案MQTT+WebSocket

01

MQTT 与 WebSocket 的融合是物联网(IoT)领域的主流通信方案,核心逻辑是让 MQTT 协议运行在 WebSocket 传输层之上(即 MQTT over WebSocket)。

这种组合既保留了 MQTT 轻量级、低带宽、适配设备端通信的核心优势,又借助 WebSocket 对浏览器/网页端的天然友好性,同时解决了多数网络环境下仅放行 HTTP/WebSocket 端口的网络穿透问题。

本文将从融合原理、部署实现、多端接入、场景价值四个维度,拆解这套方案的落地方法:

02

核心原理:协议分层与分工

MQTT 是基于 TCP/IP 栈的应用层协议,专为设备通信设计;WebSocket 是 HTTP 之上的双向长连接协议,主打浏览器与服务端的实时通信。

二者结合的本质可概括为:
WebSocket 负责打通端到端的网络传输通道MQTT 负责定义设备间通信的业务规则

简单来说,WebSocket 解决“数据怎么传”的问题,MQTT 解决“数据传什么、怎么约定”的问题。

03

部署实现:基于 EMQX 的服务端配置

EMQX 是开源高性能 MQTT 消息服务器(Broker),原生支持 MQTT over WebSocket,是物联网场景的首选落地工具。

以下是服务端的核心配置步骤:

3.1 核心参数配置

EMQX 默认开启 WebSocket 监听,无需额外开启,关键配置项可参考如下(修改 emqx.conf 配置文件):

# 非加密 WebSocket(ws://)监听器配置
listeners.ws.default {
  bind = "0.0.0.0:8083"  # 绑定所有网卡的8083端口,对应MQTT TCP的1883端口
  max_connections = 1024000  # 最大并发连接数,适配大规模设备接入
}

# 加密 WebSocket(wss://)监听器配置
listeners.wss.default {
  bind = "0.0.0.0:8084"  # 加密连接绑定8084端口,对应MQTT TCP的8883端口
  ssl_options {
    certfile = "/etc/emqx/certs/emqx.pem"  # SSL证书文件路径
    keyfile = "/etc/emqx/certs/emqx.key"   # SSL私钥文件路径
  }
}

3.2 启动与验证

  1. 1. 启动 EMQX 服务;
  2. 2. 访问 EMQX 控制台(默认地址:http://localhost:18083);
  3. 3. 在控制台中查看 WebSocket 监听器状态,确认端口正常监听。

04

多端客户端接入实践

根据终端类型(网页前端、嵌入式设备、后端服务)的不同,接入方式略有差异,但核心是使用支持 MQTT over WebSocket 的客户端库。

4.1 网页前端接入(浏览器端)

浏览器无原生 MQTT 支持,但可通过 WebSocket 连接 EMQX 的 8083 端口,借助 mqtt.js 库实现 MQTT 通信:

步骤1:安装依赖
# 安装mqtt.js客户端库
npm install mqtt --save

步骤2:核心代码实现(附详细注解)

import mqtt from 'mqtt';

// 建立MQTT over WebSocket连接
const client = mqtt.connect('ws://localhost:8083/mqtt', {
  clientId: 'web-client-123',  // 客户端唯一标识,需自定义避免重复
  username: 'admin',           // EMQX默认用户名
  password: 'public',          // EMQX默认密码
  keepalive: 60,               // 心跳间隔(秒),保持连接活跃
});

// 连接成功回调
client.on('connect', () => {
  console.log('WebSocket + MQTT 连接成功');

  // 订阅设备状态主题:监听空调状态
  client.subscribe('device/aircon/status', (err) => {
    if (!err) console.log('订阅device/aircon/status主题成功');
  });

  // 发布控制指令:向空调发送调温指令(26℃)
  client.publish('device/aircon/control', JSON.stringify({ temp: 26 }));
});

// 接收消息回调:处理订阅主题的消息
client.on('message', (topic, payload) => {
  console.log(`收到主题 ${topic} 的消息:${payload.toString()}`);
});
关键注意点

WebSocket 连接地址的路径必须是 /mqtt(EMQX 等主流 Broker 的统一约定),缺少该路径会导致连接失败。

4.2 嵌入式设备接入(如ESP32/Linux设备)

嵌入式设备可通过 C/Python 等语言的 MQTT 客户端库(如 emqx-mqtt-cpaho-mqtt),基于 WebSocket 连接 Broker。

以下是 C 语言(emqx-mqtt-c)的核心示例(附注解):

#include "emqx_mqtt_c.h"

int main() {
  // 初始化MQTT客户端对象
  mqtt_client_t client;
  mqtt_client_init(&client);

  // 配置连接参数
  mqtt_client_set_port(&client, 8083);          // 指定WebSocket端口
  mqtt_client_set_protocol(&client, MQTT_PROTOCOL_WS); // 协议类型:WebSocket
  mqtt_client_set_host(&client, "localhost");   // Broker地址
  mqtt_client_set_client_id(&client, "device-aircon-456"); // 设备唯一标识

  // 建立连接
  if (mqtt_client_connect(&client) == 0) {
    printf("设备通过WebSocket连接MQTT Broker成功\n");

    // 发布设备状态:上报当前温度26℃
    mqtt_client_publish(&client, "device/aircon/status", "{\"temp\":26}", 0, 0);
  }
  return 0;
}

4.3 后端服务接入(以Python为例)

后端服务可通过 paho-mqtt 库,基于 WebSocket 协议连接 Broker,实现设备管理、消息转发等能力:

import paho.mqtt.client as mqtt

# 连接成功回调函数
def on_connect(client, userdata, flags, rc):
  # rc=0表示连接成功,非0为异常码
  print(f"WebSocket + MQTT 连接成功,状态码:{rc}")
  # 订阅所有设备主题(通配符#表示匹配所有子主题)
  client.subscribe("device/#")

# 接收消息回调函数
def on_message(client, userdata, msg):
  # 打印收到的主题和消息内容
  print(f"收到主题 {msg.topic} 的消息:{msg.payload.decode()}")

# 创建客户端实例,指定transport为websockets
client = mqtt.Client(client_id="server-client-789", transport="websockets")
# 绑定回调函数
client.on_connect = on_connect
client.on_message = on_message
# 设置认证信息
client.username_pw_set("admin", "public")
# 连接Broker(地址+端口+心跳超时时间)
client.connect("localhost", 8083, 60)

# 持续监听消息(阻塞式,保持服务运行)
client.loop_forever()

05

架构优势与适用场景

当设备规模增长时,基于 EMQX 的 MQTT+WebSocket 架构可平滑扩展,避免单点瓶颈,核心优势体现在以下场景:

5.1 网页端控制智能设备

浏览器无需安装插件,通过 WebSocket 直接与 MQTT Broker 通信,实时性可达毫秒级,适配智能家居、远程工控等场景的“网页端-设备”双向交互。

5.2 跨网络设备通信

WebSocket 常用的 80/443 端口可穿透多数防火墙/网关,解决传统 MQTT(1883/8883 端口)在公网环境下被屏蔽的问题,适配跨地域、跨运营商的设备通信。

5.3 混合终端统一接入

嵌入式设备(TCP/MQTT)、网页端(WebSocket/MQTT)、后端服务可接入同一套 EMQX 集群,实现“设备-网页-服务”的全链路消息互通,降低架构复杂度。

总结

MQTT+WebSocket 是物联网领域“协议复用+场景适配”的经典方案:

借助 EMQX 等成熟的 MQTT Broker,可快速落地这套方案,既保留 MQTT 面向设备的轻量特性,又利用 WebSocket 适配网页端的通信需求,同时支持从中小规模设备到百万级集群的平滑扩展,是物联网远程控制、设备监控场景的首选方案。

来自:夏壹分享

原创:夏壹

其他参考文章:MQTT原理及案例

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
相关推荐
评论 抢沙发

请登录后发表评论

    暂无评论内容