在 Mosquitto 上建立到 EMQ X 的桥接

EMQ X 节点可以被其他类型的 MQTT 消息中间件桥接,实现跨平台的消息订阅和发送。在这个章节我们以一个配置例来说明如何配置 Mosquitto 到 EMQ X 的桥接。

场景描述

假设我们有一台 EMQ X 服务器'emqx1',和一台 Mosquitto 服务器,我们需要在 Mosquitto 上创建一条桥接,把所有"传感器(sensor)"主题消息转发至 'emqx1' 服务器,并从 EMQ X 订阅所有"控制(control)"主题。

EMQ X

节点节点名监听端口
emqx1emqx1@192.168.1.1001883

Mosquitto

地址监听端口
192.168.1.1011883

配置 Mosquitto 服务器

配置 Mosquitto 的桥接需要在安装后修改 mosquitto.conf 文件。对于每一个桥接,需要配置的基本内容有:

  • 远端的 EMQ X 服务器的地址和端口;
  • MQTT 协议参数,如协议版本,keepalive, clean_session等(如不配置则使用默认值);
  • EMQ X 需要的客户端登录信息;
  • 需要桥接的消息的主题;
  • 配置桥接主题映射(默认无映射)。

一个简单的配置例

新建桥接打开 mosquitto.conf 文件,增加一个 connection 以建立一个新的桥接,connection 关键字后的字符串同时也是远端节点上使用的client id:

  1. connection emqx1

配置桥接远端节点的地址和端口

  1. address 192.168.1.100:1883

配置协议版本Mosquitto桥接使用的 MQTT 协议版本默认为3.1,要使用3.1.1协议需要在配置中指定。

  1. bridge_protocol_version mqttv311

配置远端节点用户名

  1. remote_username user

配置远端节点密码

  1. remote_password passwd

指定需要桥接的主题桥接主题的配置格式为 topic 主题模式 方向 QoS 本地前缀 远端前缀,它定义了桥接转发和接收的规则。其中:

  • 主题模式指定了需要桥接的主题,支持通配符;
  • 方向可以是in, out 或者 both
  • QoS 为桥接的QoS级别, 如不指定则使用被转发消息原QoS
  • 本地和远程前缀用于主题映射,在转发和接收的消息主题上加上相应前缀,以便应用可以识别消息来源。以下配置例添加了两条桥接规则:
  1. topic sensor/# out 1
  2. topic control/# in 1

在配置完成后,需要重新启动Mosquitto使桥接配置生效。

配置 EMQ X 服务器

在安装 EMQ X 服务器后,为了使 Mosquitto 桥接可以接入,需要配置相应的用户认证和鉴权信息,具体请参阅 EMQ X 的认证鉴权文档。或者在实验阶段为了简化测试,可以使用允许匿名登录和acl_nomatch跳过认证和鉴权。

测试配置

我们使用 mosquitto_submosquitto_pub工具来测试桥接的配置是否成功。

测试桥接的 out 方向

在'emqx1'上订阅订阅'sensor/#'主题:

  1. $ mosquitto_sub -t "sensor/#" -p 1883 -d -q 1 -h 192.168.1.100
  2. Client mosqsub|19324-Zeus- sending CONNECT
  3. Client mosqsub|19324-Zeus- received CONNACK
  4. Client mosqsub|19324-Zeus- sending SUBSCRIBE (Mid: 1, Topic: sensor/#, QoS: 1)
  5. Client mosqsub|19324-Zeus- received SUBACK
  6. Subscribed (mid: 1): 1

在Mosquitto上发布消息:

  1. mosquitto_pub -t "sensor/1/temperature" -m "37.5" -d -h 192.168.1.101 -q 1
  2. Client mosqpub|19325-Zeus- sending CONNECT
  3. Client mosqpub|19325-Zeus- received CONNACK
  4. Client mosqpub|19325-Zeus- sending PUBLISH (d0, q1, r0, m1, 'sensor/1/temperature', ... (4 bytes))
  5. Client mosqpub|19325-Zeus- received PUBACK (Mid: 1)
  6. Client mosqpub|19325-Zeus- sending DISCONNECT

在'emqx1'上应能收到该消息:

  1. Client mosqsub|19324-Zeus- received PUBLISH (d0, q1, r0, m1, 'sensor/1/temperature', ... (4 bytes))
  2. Client mosqsub|19324-Zeus- sending PUBACK (Mid: 1)
  3. 37.5

测试桥接的 in 方向

在Mosquitto上订阅 'control/#'主题:

  1. $ mosquitto_sub -t "control/#" -p 1883 -d -q 1 -h 192.168.1.101
  2. Client mosqsub|19338-Zeus- sending CONNECT
  3. Client mosqsub|19338-Zeus- received CONNACK
  4. Client mosqsub|19338-Zeus- sending SUBSCRIBE (Mid: 1, Topic: control/#, QoS: 1)
  5. Client mosqsub|19338-Zeus- received SUBACK
  6. Subscribed (mid: 1): 1

在'emqx1'上发布消息:

  1. $ mosquitto_pub -t "control/1" -m "list_all" -d -h 192.168.1.100 -q 1
  2. Client mosqpub|19343-Zeus- sending CONNECT
  3. Client mosqpub|19343-Zeus- received CONNACK
  4. Client mosqpub|19343-Zeus- sending PUBLISH (d0, q1, r0, m1, 'control/1', ... (8 bytes))
  5. Client mosqpub|19343-Zeus- received PUBACK (Mid: 1)
  6. Client mosqpub|19343-Zeus- sending DISCONNECT

在Mosquitto上应能收到该消息:

  1. Client mosqsub|19338-Zeus- received PUBLISH (d0, q1, r0, m2, 'control/1', ... (8 bytes))
  2. Client mosqsub|19338-Zeus- sending PUBACK (Mid: 2)
  3. list_all