Mosquitto 上創建到 EMQ X 的橋接

EMQ X 節點能夠被其餘類型的 MQTT 消息中間件橋接,實現跨平臺的消息訂閱和發送。本文咱們以一個配置實例來講明如何配置 Mosquitto 到 EMQ X 的橋接。git

Mosquitto 是一個小型輕量的開源 MQTT Broker,由 C/C++ 語言編寫。Mosquitto 採用單核心單線程架構,支持部署在資源有限的嵌入式設備,接入少許 MQTT 設備終端,並實現了 MQTT 5.0 和 3.1.1版本協議。github

EMQ X 與 Mosquitto 均完整支持了 MQTT 協議特性,但 EMQ X 支持更多通訊協議以及私有協議接入。應用層的功能拓展方面,Mosquitto 缺少開箱即用的如認證鑑權、規則引擎、數據持久化與高性能消息橋接(EMQ X 企業版)等業務相關功能; 監控運維與可視化管理方面, EMQ X 有完整的現有功能和拓展方案支持;基礎功能上 Mosquitto 集羣功能羸弱,官方和第三方實現的集羣方案均難以支撐物聯網大規模海量鏈接的性能需求。服務器

所以 Mosquitto 並不適合用來作規模化服務的 MQTT Broker,但因爲其足夠輕量精簡,能夠運行在任何低功率單片機包括嵌入式傳感器、手機設備、嵌入式微處理器上,是物聯網邊緣消息接入較好的技術選型,結合其橋接功能能夠實現消息的本地處理與雲端透傳。session

場景描述

假設咱們有一個 EMQ X 服務器集羣 emqx1,和一臺 Mosquitto 服務器,咱們須要在 Mosquitto 上建立一條橋接,把全部 傳感器(sensor) 主題消息轉發至 emqx1 集羣,並從 EMQ X 訂閱全部控制(control)主題。架構

EMQ X運維

集羣 集羣地址 監聽端口
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:ui

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_submosquitto_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

更多信息請訪問咱們的官網 emqx.io,或關注咱們的開源項目 github.com/emqx/emqx ,詳細文檔請訪問 官方文檔

相關文章
相關標籤/搜索