EMQ X 节点能够被其余类型的 MQTT 消息中间件桥接,实现跨平台的消息订阅和发送。本文咱们以一个配置实例来讲明如何配置 Mosquitto 到 EMQ X 的桥接。服务器
Mosquitto 是一个小型轻量的开源 MQTT Broker,由 C/C++ 语言编写。Mosquitto 采用单核心单线程架构,支持部署在资源有限的嵌入式设备,接入少许 MQTT 设备终端,并实现了 MQTT 5.0 和 3.1.1版本协议。session
EMQ X 与 Mosquitto 均完整支持了 MQTT 协议特性,但 EMQ X 支持更多通讯协议以及私有协议接入。应用层的功能拓展方面,Mosquitto 缺少开箱即用的如认证鉴权、规则引擎、数据持久化与高性能消息桥接(EMQ X 企业版)等业务相关功能; 监控运维与可视化管理方面, EMQ X 有完整的现有功能和拓展方案支持;基础功能上 Mosquitto 集群功能羸弱,官方和第三方实现的集群方案均难以支撑物联网大规模海量链接的性能需求。架构
所以 Mosquitto 不适合用来作规模化服务的 MQTT Broker,但因为其足够轻量精简,能够运行在任何低功率单片机包括嵌入式传感器、手机设备、嵌入式微处理器上,在物联网边缘消息接入上是较好的技术选型,结合桥接功能可以实现消息的本地处理并透传至云端。运维
假设咱们有一台 EMQ X 服务器 'emqx1',和一台 Mosquitto 服务器,咱们须要在 Mosquitto 上建立一条桥接,把全部 "传感器(sensor)" 主题消息转发至 'emqx1' 服务器,并从 EMQ X 订阅全部"控制(control)"主题。工具
EMQ X性能
节点 | 节点名 | 监听端口 |
---|---|---|
emqx1 | emqx1@192.168.1.100 | 1883 |
Mosquitto测试
地址 | 监听端口 |
---|---|
192.168.1.101 | 1883 |
配置 Mosquitto 的桥接须要在安装后修改 mosquitto.conf
文件。对于每个桥接,须要配置的基本内容有:ui
新建桥接spa
打开 mosquitto.conf
文件,增长一个 connection
以创建一个新的桥接,connection
关键字后的字符串同时也是远端节点上使用的client id:线程
connection emqx1
配置桥接远端节点的地址和端口
address 192.168.1.100:1883
配置协议版本
Mosquitto桥接使用的 MQTT 协议版本默认为3.1,要使用3.1.1协议须要在配置中指定。
bridge_protocol_version mqttv311
配置远端节点用户名
remote_username user
配置远端节点密码
remote_password passwd
指定须要桥接的主题 桥接主题的配置格式为 topic 主题模式 方向 QoS 本地前缀 远端前缀
,它定义了桥接转发和接收的规则。其中:
如下配置例添加了两条桥接规则:
topic sensor/# out 1 topic control/# in 1
在配置完成后,须要从新启动Mosquitto使桥接配置生效。
在安装 EMQ X 服务器后,为了使 Mosquitto 桥接能够接入,须要视状况决定是否配置相应的用户认证和鉴权信息。或者在实验阶段为了简化测试,可使用容许匿名登陆和 acl_nomatch 跳过认证和鉴权。
咱们使用 mosquitto_sub
和 mosquitto_pub
工具来测试桥接的配置是否成功。
在'emqx1'上订阅订阅'sensor/#'主题,该主题将接收到 Mosquitto 上报的数据:
$ mosquitto_sub -t "sensor/#" -p 1883 -d -q 1 -h 192.168.1.100 Client mosqsub|19324-Zeus- sending CONNECT Client mosqsub|19324-Zeus- received CONNACK Client mosqsub|19324-Zeus- sending SUBSCRIBE (Mid: 1, Topic: sensor/#, QoS: 1) Client mosqsub|19324-Zeus- received SUBACK Subscribed (mid: 1): 1
在Mosquitto上发布消息:
mosquitto_pub -t "sensor/1/temperature" -m "37.5" -d -h 192.168.1.101 -q 1 Client mosqpub|19325-Zeus- sending CONNECT Client mosqpub|19325-Zeus- received CONNACK Client mosqpub|19325-Zeus- sending PUBLISH (d0, q1, r0, m1, 'sensor/1/temperature', ... (4 bytes)) Client mosqpub|19325-Zeus- received PUBACK (Mid: 1) Client mosqpub|19325-Zeus- sending DISCONNECT
在'emqx1'上应能收到该消息:
Client mosqsub|19324-Zeus- received PUBLISH (d0, q1, r0, m1, 'sensor/1/temperature', ... (4 bytes)) Client mosqsub|19324-Zeus- sending PUBACK (Mid: 1) 37.5
在 Mosquitto上订阅 'control/#' 主题,该主题将接收到 EMQ X 上发布的消息:
$ mosquitto_sub -t "control/#" -p 1883 -d -q 1 -h 192.168.1.101 Client mosqsub|19338-Zeus- sending CONNECT Client mosqsub|19338-Zeus- received CONNACK Client mosqsub|19338-Zeus- sending SUBSCRIBE (Mid: 1, Topic: control/#, QoS: 1) Client mosqsub|19338-Zeus- received SUBACK Subscribed (mid: 1): 1
在 'emqx1'上发布消息,消息将在 'emqx1' 上传递,同时桥接到 Mosquitto 本地:
$ mosquitto_pub -t "control/1" -m "list_all" -d -h 192.168.1.100 -q 1 Client mosqpub|19343-Zeus- sending CONNECT Client mosqpub|19343-Zeus- received CONNACK Client mosqpub|19343-Zeus- sending PUBLISH (d0, q1, r0, m1, 'control/1', ... (8 bytes)) Client mosqpub|19343-Zeus- received PUBACK (Mid: 1) Client mosqpub|19343-Zeus- sending DISCONNECT
在Mosquitto上应能收到该消息:
Client mosqsub|19338-Zeus- received PUBLISH (d0, q1, r0, m2, 'control/1', ... (8 bytes)) Client mosqsub|19338-Zeus- sending PUBACK (Mid: 2) list_all