MQTT 消息插件

桥接 的概念是 EMQ X 支持将自身某类主题的消息通过某种方式转发到另一个 MQTT Broker。

桥接集群 的不同在于:桥接不会复制主题树与路由表,只根据桥接规则转发 MQTT 消息。

目前 MQTT 消息插件支持的桥接方式有:

  • RPC 桥接:RPC 桥接只能在 EMQ X Broker 间使用,且不支持订阅远程节点的主题去同步数据
  • MQTT 桥接:MQTT 桥接同时支持转发和通过订阅主题来实现数据同步两种方式

在 EMQ X 中,通过修改 etc/plugins/emqx_bridge_mqtt.conf 来配置 bridge。EMQ X 根据不同的 name 来区分不同的 bridge。例如:

  1. ## 桥接地址: 使用节点名(nodename@host)则用于 RPC 桥接,使用 host:port 用于 MQTT 连接
  2. bridge.mqtt.aws.address = 127.0.0.1:1883

该项配置声明了一个名为 aws 的 bridge 并指定以 MQTT 的方式桥接到 127.0.0.1:1883 这台 MQTT 服务器

在需要创建多个 bridge 时,可以先复制其全部的配置项,在通过使用不同的 name 来标示(比如 bridge.mqtt.$name.address 其中 $name 指代的为 bridge 的名称)

配置 MQTT 消息桥接插件

etc/plugins/emqx_bridge_mqtt.conf

  1. ## 桥接地址: 使用节点名(nodename@host)则用于 RPC 桥接,使用 host:port 用于 MQTT 连接
  2. bridge.mqtt.aws.address = 192.168.1.2:1883
  3. ## 桥接的协议版本
  4. ## 枚举值: mqttv3 | mqttv4 | mqttv5
  5. bridge.mqtt.aws.proto_ver = mqttv4
  6. ## 客户端的 client_id
  7. bridge.mqtt.aws.client_id = bridge_emq
  8. ## 客户端的 clean_start 字段
  9. ## 注: 有些 MQTT Broker 需要将 clean_start 值设成 `true`
  10. bridge.mqtt.aws.clean_start = true
  11. ## 客户端的 username 字段
  12. bridge.mqtt.aws.username = user
  13. ## 客户端的 password 字段
  14. bridge.mqtt.aws.password = passwd
  15. ## 客户端是否使用 ssl 来连接远程服务器
  16. bridge.mqtt.aws.ssl = off
  17. ## 客户端 SSL 连接的 CA 证书 (PEM格式)
  18. bridge.mqtt.aws.cacertfile = etc/certs/cacert.pem
  19. ## 客户端 SSL 连接的 SSL 证书
  20. bridge.mqtt.aws.certfile = etc/certs/client-cert.pem
  21. ## 客户端 SSL 连接的密钥文件
  22. bridge.mqtt.aws.keyfile = etc/certs/client-key.pem
  23. ## SSL 加密方式
  24. bridge.mqtt.aws.ciphers = ECDHE-ECDSA-AES256-GCM-SHA384,ECDHE-RSA-AES256-GCM-SHA384
  25. ## TLS PSK 的加密套件
  26. ## 注意 'listener.ssl.external.ciphers' 和 'listener.ssl.external.psk_ciphers' 不能同时配置
  27. ##
  28. ## See 'https://tools.ietf.org/html/rfc4279#section-2'.
  29. ## bridge.mqtt.aws.psk_ciphers = PSK-AES128-CBC-SHA,PSK-AES256-CBC-SHA,PSK-3DES-EDE-CBC-SHA,PSK-RC4-SHA
  30. ## 客户端的心跳间隔
  31. bridge.mqtt.aws.keepalive = 60s
  32. ## 支持的 TLS 版本
  33. bridge.mqtt.aws.tls_versions = tlsv1.2,tlsv1.1,tlsv1
  34. ## 需要被转发的消息的主题
  35. bridge.mqtt.aws.forwards = sensor1/#,sensor2/#
  36. ## 挂载点(mountpoint)
  37. bridge.mqtt.aws.mountpoint = bridge/emqx2/${node}/
  38. ## 订阅对端的主题
  39. bridge.mqtt.aws.subscription.1.topic = cmd/topic1
  40. ## 订阅对端主题的 QoS
  41. bridge.mqtt.aws.subscription.1.qos = 1
  42. ## 桥接的重连间隔
  43. ## 默认: 30秒
  44. bridge.mqtt.aws.reconnect_interval = 30s
  45. ## QoS1/QoS2 消息的重传间隔
  46. bridge.mqtt.aws.retry_interval = 20s
  47. ## Inflight 大小.
  48. bridge.mqtt.aws.max_inflight_batches = 32
  49. ## emqx_bridge 内部用于 batch 的消息数量
  50. bridge.mqtt.aws.queue.batch_count_limit = 32
  51. ## emqx_bridge 内部用于 batch 的消息字节数
  52. bridge.mqtt.aws.queue.batch_bytes_limit = 1000MB
  53. ## 放置 replayq 队列的路径,如果没有在配置中指定该项,那么 replayq
  54. ## 将会以 `mem-only` 的模式运行,消息不会缓存到磁盘上。
  55. bridge.mqtt.aws.queue.replayq_dir = data/emqx_aws_bridge/
  56. ## Replayq 数据段大小
  57. bridge.mqtt.aws.queue.replayq_seg_bytes = 10MB