# gateway-proxy **Repository Path**: xmh3000/gateway-proxy ## Basic Information - **Project Name**: gateway-proxy - **Description**: mqtt 代理 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-06 - **Last Updated**: 2025-12-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Gateway Proxy Gateway Proxy 是一个 MQTT 协议代理服务,用于在客户端和 MQTT Broker 之间建立透明代理,可以对消息进行认证、过滤和转换处理。 ## 功能特性 - MQTT 协议代理:支持 MQTT 3.1.1 协议版本 - 消息拦截与处理:可在消息传递过程中进行认证、修改和过滤 - 数据转换:通过 JavaScript 脚本对消息内容进行转换 - 客户端认证:基于连接信息和证书进行客户端身份验证 - 日志记录:详细的操作日志便于问题排查和审计 ## 目录结构 ``` . ├── config # 配置文件目录 │ └── config.ini # 服务配置文件 ├── proxy # 核心代理模块 │ ├── mqtt # MQTT 代理实现 │ ├── session # 会话管理 │ ├── simple # 简单处理器实现 │ └── tls # TLS 相关功能 ├── scripts # 脚本文件目录 │ └── convert.js # 默认数据转换脚本 ├── utils # 工具类模块 │ ├── config # 配置工具 │ ├── errors # 错误处理 │ ├── javascript # JavaScript 引擎 │ ├── logger # 日志工具 │ └── safe # 安全相关工具 ├── main.go # 程序入口 └── go.mod # Go 模块定义 ``` ## 配置说明 默认配置文件位于 [config/config.ini](config/config.ini): ```ini [server] host = 0.0.0.0 # 监听地址 port = 1884 # 监听端口 [proxy] host = 0.0.0.0 # 后端 MQTT Broker 地址 port = 1883 # 后端 MQTT Broker 端口 ``` ## 工作原理 1. **启动监听**:服务在配置的端口(默认 1884)上监听客户端连接 2. **连接处理**: - 接受客户端连接 - 连接到后端 MQTT Broker - 建立双向数据流通道 3. **消息处理**: - CONNECT 消息:进行客户端认证 - PUBLISH 消息:进行发布权限检查和数据转换 - SUBSCRIBE 消息:进行订阅权限检查 4. **数据转发**:在权限检查通过后,将消息转发给目标 Broker ## 数据转换 服务使用 JavaScript 脚本对消息进行转换处理,默认脚本为 [scripts/convert.js](scripts/convert.js)。 示例脚本功能: - 解析 JSON 格式的输入数据 - 提取设备名称和图像标签数据 - 重新组织数据结构并返回 可以通过修改该脚本来实现自定义的数据转换逻辑。 ## 构建与运行 ### 环境要求 - Go 1.17 或更高版本 ### 构建步骤 ```bash # 克隆项目 git clone # 进入项目目录 cd gateway-proxy # 构建 go build -o gateway-proxy # 运行 ./gateway-proxy ``` ### Windows 平台 可以直接使用提供的 `build.bat` 文件进行构建。 ## 扩展开发 项目采用接口化设计,可以通过实现 [Handler](proxy/session/handler.go) 接口来自定义业务逻辑: ```go type Handler interface { // 客户端连接认证 AuthConnect(client *Client) error // 发布消息认证与处理 AuthPublish(client *Client, topic *string, payload *[]byte) error // 订阅主题认证 AuthSubscribe(client *Client, topics *[]string) error // 连接建立后的回调 Connect(client *Client) // 消息发布后的回调 Publish(client *Client, topic *string, payload *[]byte) // 主题订阅后的回调 Subscribe(client *Client, topics *[]string) // 取消订阅后的回调 Unsubscribe(client *Client, topics *[]string) // 客户端断开连接的回调 Disconnect(client *Client) } ``` ## 依赖组件 - [eclipse/paho.mqtt.golang](https://github.com/eclipse/paho.mqtt.golang) - MQTT 客户端库 - [dop251/goja](https://github.com/dop251/goja) - Go 实现的 JavaScript 解释器 - [uber-go/zap](https://github.com/uber-go/zap) - 高性能日志库 ## 使用场景 - 物联网平台数据预处理网关 - 多租户 MQTT 服务访问控制 - 设备协议适配与数据格式转换 - MQTT 消息路由与分发 ## 许可证 [MIT License](LICENSE)