基於MQTT的RPC協議

2021-09-27 09:20:33 字數 1631 閱讀 1249

rpc 是一種基於request/response 模式的分布式協議。而mqtt 是基於pub/sub模式的協議。是否能夠將這兩種協議相結合,實現rpc over mqtt ?我並沒有發現由比較知名的rpc over mqtt協議。於是,自己著手設計乙個極簡的rpc over mqtt 協議。

本文介紹modular-2 edge 中,使用mqtt 協議實現rpc 的方法。

在modular-2 edge 微服務架構中,提供了三種rpc 形式,它們分別是:

1 websocket rpc

2 mqtt rpc

3 html restfull rpc

mqtt 是基於topic 訂閱和發布的通訊方式。實現mqtt 協議的難點是設計乙個合適的topic 命名方式和語法。

對於乙個複雜系統,topic 命名更具有挑戰性。

在實現rpc over mqtt時,需要有乙個唯一的topic 來標識乙個rpc 呼叫和結構。它需要反映如下資訊

目標名稱

信源名稱

rpc方法 雖然在訊息體的json 描述中含有rpc 但是為了訂閱和發布的方便。在topic 中也需要包含了method 的名稱。

因此,我們設計的topic 格式為:

//其中

方法的名稱

通知為什麼要在topic 中包含目標和信源的名稱呢?

例項:

microservice1/gpio/register

數字io 寫(digitalout.write)

microservice1/gpio/digitaloutwrite

數字io翻轉(digitalout.flipflop)

microservice1/gpio/digitaloutflipflop

模擬量輸入

microservice1/vibration/analogread

modbus請求

microservice1/weather/modbusrequest

mqtt 的payload 採用了json 格式的rpc,例如

jsonrpc={

method:「microservice/digitalout.write";

mode:2;

params:{

value[1,0]

id:1

1 baseservice 訂閱

subscribe(「baseservice/#」)

當乙個websocket 的rpc 註冊時,要向mqtt broker 訂閱該rpc.例如:

subscribe(「microservice/+/digitalout.write);

subscribe(「」gpiomqtt/#」);

3 mqtt 命令出錯

訊息體是json 格式的出錯資訊。

在modular-2 微服務架構中,採用了最簡單的mqtt topic 設計,實現了rpc over mqtt 協議。並且和websocket rpc 相容。mqtt 的應用中,應該避免mqtt topic 的隨意性,將topic 減少到最簡單。是乙個好的方法。

MQTT協議 MQTT協議簡介

mqtt messagequeuing telemetry transport,訊息佇列遙測傳輸 是ibm開發的乙個即時通訊協議。mqtt是面向m2m和物聯網的連線協議,採用輕量級發布和訂閱訊息傳輸機制。它的設計思想是輕巧 開放 簡單 規範,因此易於實現。這些特點使得它對很多場景來說都是很好的選擇,...

MQTT協議 MQTT協議解析

協議就是通訊雙方的乙個約定,即,表示第1位傳輸的什麼 第2位傳輸的什麼 在mqtt協議中,乙個mqtt資料報由 固定頭 fixed header 可變頭 variable header 訊息體 payload 三部分構成。mqtt 資料報結構 固定頭存在於所有mqtt資料報中,其結構如下 bit76...

基於MQTT協議的安卓實現

最近在搞乙個專案用到訊息推送,在網上搜尋了一陣子後發現了ibm的兩個mqtt庫,分別為wmqtt.jar與mqttv3.jar。本文主要是對mqttva.jar庫的使用做以說明。一 用adt建立如下的工程 以上是我建立的工程,當然 有一部分也是來自網路,現在就還給網路,哈哈 二 安卓介面設計 可以設...