EMQ X 節點可以被其他類型的 MQTT 消息中間件橋接,實現跨平台的消息訂閱和發送。本文我們以一個配置實例來說明如何配置 Mosquitto 到 EMQ X 的橋接。
Mosquitto 是一個小型輕量的開源 MQTT Broker,由 C/C++ 語言編寫。Mosquitto 采用單核心單線程架構,支持部署在資源有限的嵌入式設備,接入少量 MQTT 設備終端,並實現了 MQTT 5.0 和 3.1.1版本協議。
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 的橋接需要在安裝后修改 mosquitto.conf
文件。對於每一個橋接,需要配置的基本內容有:
- 遠端的 EMQ X 服務器的地址和端口;
- MQTT 協議參數,如協議版本,keepalive, clean_session等(如不配置則使用默認值);
- EMQ X 需要的客戶端登錄信息;
- 需要橋接的消息的主題;
- 配置橋接主題映射(默認無映射)。
一個簡單的配置例
新建橋接
打開 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 本地前綴 遠端前綴
,它定義了橋接轉發和接收的規則。其中:
- 主題模式指定了需要橋接的主題,支持通配符;
- 方向可以是 in, out 或者 both
- QoS 為橋接的QoS級別, 如不指定則使用被轉發消息原QoS
- 本地和遠程前綴用於主題映射,在轉發和接收的消息主題上加上相應前綴,以便應用可以識別消息來源。
以下配置例添加了兩條橋接規則:
topic sensor/# out 1
topic control/# in 1
在配置完成后,需要重新啟動Mosquitto使橋接配置生效。
配置 EMQ X 服務器
在安裝 EMQ X 服務器后,為了使 Mosquitto 橋接可以接入,需要視情況決定是否配置相應的用戶認證和鑒權信息。或者在實驗階段為了簡化測試,可以使用允許匿名登錄和 acl_nomatch 跳過認證和鑒權。
測試配置
我們使用 mosquitto_sub
和 mosquitto_pub
工具來測試橋接的配置是否成功。
測試橋接的 out 方向
在'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
測試橋接的 in 方向
在 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