Skip to content

MQTT theme converter, a conversion done within the broker

Notifications You must be signed in to change notification settings

ThingsPanel/mqtt-converter

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

MQTT Broker 主题转换器

此项目包括一个简化版的 MQTT broker,专注于 MQTT 主题和消息的转换,不包括消息持久化、遗嘱消息或其他附加功能。它是为了在 broker 内部进行主题和消息的转换,以便设备和 IoT 平台之间能够以不同的主题结构进行通信。

背景

MQTT (消息队列遥测传输) 是一个轻量级的、开源的、基于发布-订阅的消息传递协议的 ISO 标准 (ISO 20922)。它基于 TCP/IP 协议运行,设计用于远程连接,其中需要“小代码占用”或网络带宽受限。

不同的 IoT 平台和设备可能使用不同的主题结构,这导致了它们之间的通信存在问题。为了解决这个问题,我们可以使用 IoT平台外部主题转换器,转换主题和消息。

IoT平台外部转换器可能的优点

  1. 灵活性:可以灵活地选择或更换转换器,不受平台的限制。
  2. 性能:主题和消息转换是一个计算密集型的操作,尤其在需要处理大量消息的高负载场景下。在SaaS云IoT平台上,即使不是所有设备都需要转换,平台仍需对每条收到的消息进行检查以判断是否需要进行转换。这会给每条消息带来额外的处理负担,进而影响平台的响应时间和总体吞吐量。将转换功能放在外部可以分担平台的处理负担,从而提高其性能。这种做法是特别重要的,因为即使只有一小部分的消息需要转换,对每条消息的判断也可能导致显著的延迟,尤其是在高负载情况下。
  3. 易于升级和维护:可以单独升级和维护转换器,而不影响平台的其他部分。
  4. 扩展性:可以根据需要选择不同的转换器,或者开发定制的转换器,以满足特定的需求。
  5. 减轻平台复杂性:将转换功能放在外部,可以降低平台的复杂性。
  6. 适应性: 如果云 IoT 平台的主题转换范围有限,外部转换器可以更灵活地适应这种限制,并提供更广泛的转换选项。
  7. 易于集成: 可以更容易地集成到现有的系统或服务中,因为它是独立的,并且可以与其他服务一起工作。
  8. 兼容性: 可以与多个平台或服务同时工作,而不是仅限于一个特定的平台。
  9. 可定制性: 外部转换器可以根据特定的业务需求或逻辑来定制,而不受平台本身的限制。

一些IoT平台外部转换器存在的缺点

处理主题常见的方式一般是使用一个中间broker,转换器的实现主要在两个broker之间的mqtt客户端上,比如使用Node-RED做主题转换或是其他类似的规则引擎,这些转换器可能会有以下缺点:

  1. 部署复杂性: 需要部署和管理额外的 broker和转换器本身,这增加了部署和管理的复杂性。
  2. 网络延迟: 消息需要在设备、转换器、额外的 broker 和平台之间传输,这可能会增加网络延迟。
  3. 维护成本: 需要维护额外的 broker 和转换器或者规则引擎,这可能会增加维护成本。
  4. 在线状态感知: 额外的 broker 可能无法感知设备的在线或离线状态,或者可能需要额外的工作来实现这个功能。

IoT平台外部外部转换器(broker内置转换)实现

根据上述背景,这里是通过实现一个简单版的broker,仅专注于 MQTT 主题和消息的转换,转换在broker内部实现,可以弥补仅使用mqtt客户端实现的转换器的一些缺陷。

实现的部分细节

  • 根据 MQTT 3.1.1 规范的具体细节,实现连接、保持连接、断开连接、订阅、发布等。
  • 当设备订阅时,通过 broker 内部的 MQTT 客户端根据主题转换规则订阅 IoT 平台主题。
  • 当设备发布消息时,根据规则转换主题和消息内容,并通过 broker 内部的 MQTT 客户端发送到 IoT 平台。
  • 当 IoT 平台发布消息时,根据主题规则找到设备的订阅主题,并将转换后的消息返回给设备。
  • 可以使IoT感知在线和离线状态。
  • 对于相同类型的设备,只需要一组规则。

安装

  • 克隆仓库
git clone https://github.com/ThingsPanel/mqtt-converter.git
  • 改变目录
cd mqtt-converter
  • 构建项目
go build
  • 运行应用程序
go run .

提供一个 config.yaml 文件,主题转换规则格式如下:

# 发布主题重写,from设备发布消息的主题,to为发布消息到平台的主题
pub_topic_rewriting:
  - from: "/sys/+/+/thing/event/consumption/post"
    to: "device/attributes"

  - from: "device/+/event"
    to: "device/event"

# 订阅主题重写,from为设备订阅的主题,to为订阅平台的主题
sub_topic_rewriting:
  - from: "/+/+/user/get"
    to: "device/attributes/{username}"

  - from: "device/sub/+/event"
    to: "device/event/{username}"

报文转换

报文转换部分请参考payload_hook.go里示例,主要是通过switch来定位yaml里转换规则配置的from,编写转换脚本实现

版本

v1.0:此版本为最基础版,可能存在一些问题

About

MQTT theme converter, a conversion done within the broker

Topics

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages