{"id":21043545,"url":"https://github.com/thingspanel/mqtt-converter","last_synced_at":"2026-05-20T07:39:08.957Z","repository":{"id":191545981,"uuid":"684850941","full_name":"ThingsPanel/mqtt-converter","owner":"ThingsPanel","description":"MQTT theme converter, a conversion done within the broker","archived":false,"fork":false,"pushed_at":"2023-09-05T09:23:13.000Z","size":27,"stargazers_count":0,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-05-29T09:06:21.037Z","etag":null,"topics":["broker","go","mqtt","mqtt-broker","theme-converter"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ThingsPanel.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-08-30T01:33:13.000Z","updated_at":"2023-08-30T03:25:21.000Z","dependencies_parsed_at":"2025-01-20T17:24:00.293Z","dependency_job_id":"c560a1bd-ae78-43c0-9c5d-30e420951320","html_url":"https://github.com/ThingsPanel/mqtt-converter","commit_stats":null,"previous_names":["thingspanel/mqtt-converter"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ThingsPanel/mqtt-converter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ThingsPanel%2Fmqtt-converter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ThingsPanel%2Fmqtt-converter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ThingsPanel%2Fmqtt-converter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ThingsPanel%2Fmqtt-converter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ThingsPanel","download_url":"https://codeload.github.com/ThingsPanel/mqtt-converter/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ThingsPanel%2Fmqtt-converter/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265068910,"owners_count":23706558,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["broker","go","mqtt","mqtt-broker","theme-converter"],"created_at":"2024-11-19T14:13:12.454Z","updated_at":"2026-05-20T07:39:03.907Z","avatar_url":"https://github.com/ThingsPanel.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# MQTT Broker 主题转换器\n此项目包括一个简化版的 MQTT broker，专注于 MQTT 主题和消息的转换，不包括消息持久化、遗嘱消息或其他附加功能。它是为了在 broker 内部进行主题和消息的转换，以便设备和 IoT 平台之间能够以不同的主题结构进行通信。\n\n## 背景\nMQTT (消息队列遥测传输) 是一个轻量级的、开源的、基于发布-订阅的消息传递协议的 ISO 标准 (ISO 20922)。它基于 TCP/IP 协议运行，设计用于远程连接，其中需要“小代码占用”或网络带宽受限。\n\n不同的 IoT 平台和设备可能使用不同的主题结构，这导致了它们之间的通信存在问题。为了解决这个问题，我们可以使用 IoT平台外部主题转换器，转换主题和消息。\n\n### IoT平台外部转换器可能的优点\n1. **灵活性**：可以灵活地选择或更换转换器，不受平台的限制。\n2. **性能**：主题和消息转换是一个计算密集型的操作，尤其在需要处理大量消息的高负载场景下。在SaaS云IoT平台上，即使不是所有设备都需要转换，平台仍需对每条收到的消息进行检查以判断是否需要进行转换。这会给每条消息带来额外的处理负担，进而影响平台的响应时间和总体吞吐量。将转换功能放在外部可以分担平台的处理负担，从而提高其性能。这种做法是特别重要的，因为即使只有一小部分的消息需要转换，对每条消息的判断也可能导致显著的延迟，尤其是在高负载情况下。\n3. **易于升级和维护**：可以单独升级和维护转换器，而不影响平台的其他部分。\n4. **扩展性**：可以根据需要选择不同的转换器，或者开发定制的转换器，以满足特定的需求。\n5. **减轻平台复杂性**：将转换功能放在外部，可以降低平台的复杂性。\n6. **适应性**: 如果云 IoT 平台的主题转换范围有限，外部转换器可以更灵活地适应这种限制，并提供更广泛的转换选项。\n7. **易于集成**: 可以更容易地集成到现有的系统或服务中，因为它是独立的，并且可以与其他服务一起工作。\n8. **兼容性**: 可以与多个平台或服务同时工作，而不是仅限于一个特定的平台。\n9. **可定制性**: 外部转换器可以根据特定的业务需求或逻辑来定制，而不受平台本身的限制。\n### 一些IoT平台外部转换器存在的缺点\n处理主题常见的方式一般是使用一个中间broker，转换器的实现主要在两个broker之间的mqtt客户端上，比如使用Node-RED做主题转换或是其他类似的规则引擎，这些转换器可能会有以下缺点：\n1. **部署复杂性**: 需要部署和管理额外的 broker和转换器本身，这增加了部署和管理的复杂性。\n2. **网络延迟**: 消息需要在设备、转换器、额外的 broker 和平台之间传输，这可能会增加网络延迟。\n3. **维护成本**: 需要维护额外的 broker 和转换器或者规则引擎，这可能会增加维护成本。\n4. **在线状态感知**: 额外的 broker 可能无法感知设备的在线或离线状态，或者可能需要额外的工作来实现这个功能。\n## IoT平台外部外部转换器（broker内置转换）实现\n根据上述背景，这里是通过实现一个简单版的broker，仅专注于 MQTT 主题和消息的转换，转换在broker内部实现，可以弥补仅使用mqtt客户端实现的转换器的一些缺陷。\n\n### 实现的部分细节\n- 根据 MQTT 3.1.1 规范的具体细节，实现连接、保持连接、断开连接、订阅、发布等。\n- 当设备订阅时，通过 broker 内部的 MQTT 客户端根据主题转换规则订阅 IoT 平台主题。\n- 当设备发布消息时，根据规则转换主题和消息内容，并通过 broker 内部的 MQTT 客户端发送到 IoT 平台。\n- 当 IoT 平台发布消息时，根据主题规则找到设备的订阅主题，并将转换后的消息返回给设备。\n- 可以使IoT感知在线和离线状态。\n- 对于相同类型的设备，只需要一组规则。\n## 安装\n- 克隆仓库\n```bash\ngit clone https://github.com/ThingsPanel/mqtt-converter.git\n```\n- 改变目录\n```bash\ncd mqtt-converter\n```\n- 构建项目\n```go\ngo build\n```\n- 运行应用程序\n```bash\ngo run .\n```\n### 提供一个 config.yaml 文件，主题转换规则格式如下：\n\n```yaml\n# 发布主题重写，from设备发布消息的主题，to为发布消息到平台的主题\npub_topic_rewriting:\n  - from: \"/sys/+/+/thing/event/consumption/post\"\n    to: \"device/attributes\"\n\n  - from: \"device/+/event\"\n    to: \"device/event\"\n\n# 订阅主题重写,from为设备订阅的主题，to为订阅平台的主题\nsub_topic_rewriting:\n  - from: \"/+/+/user/get\"\n    to: \"device/attributes/{username}\"\n\n  - from: \"device/sub/+/event\"\n    to: \"device/event/{username}\"\n\n```\n### 报文转换\n报文转换部分请参考payload_hook.go里示例，主要是通过switch来定位yaml里转换规则配置的from，编写转换脚本实现\n\n## 版本\nv1.0：此版本为最基础版，可能存在一些问题","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthingspanel%2Fmqtt-converter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthingspanel%2Fmqtt-converter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthingspanel%2Fmqtt-converter/lists"}