# MqttBroker
**Repository Path**: FasterEdge/MqttBroker
## Basic Information
- **Project Name**: MqttBroker
- **Description**: MqttBroker封装板
- **Primary Language**: Go
- **License**: Apache-2.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-08-31
- **Last Updated**: 2026-09-10
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
MqttBroker
基于 FasterEdge MqttBrokerCore 的轻量级 MQTT 服务
### 一、项目简介
- 基于 **[FasterEdge MqttBrokerCore](https://github.com/FasterEdge/MqttBrokerCore)** 构建的 MQTT 代理服务,通过 HTTP 接口与内置 **WebUI** 轻松控制底层 Broker 的生命周期。
- 统一使用一个管理端口 `11883`,同时提供:
- **REST API**:`/startup`、`/heartbeat`、`/shutdown`。
- **Web 管理面板**:在浏览器中启动 / 停止 Broker,并实时查看运行状态与日志。
- MQTT 通信端口默认 `1883`,可通过 `/startup?port=...` 动态指定。
- 底层能力全部来自 `MqttBrokerCore`:支持 **MQTT 3.1.1 / 5.0**、**QoS 0/1/2**、遗嘱消息、保留消息、主题通配符(`+`、`#`)。
- 全部静态资源通过 `go:embed` 嵌入二进制,单文件即可部署,无需额外静态目录。
### 二、主要特性
| 特性 | 说明 |
|------|------|
| HTTP 控制 | 通过 REST 接口启停 Broker,方便与脚本、监控、告警系统集成 |
| 内置 WebUI | 免安装,浏览器网页即可启停服务、查看日志,适合快速试用 |
| 动态端口 | 启动时用 `port` 参数指定监听端口,灵活适应不同环境 |
| 内存持久化 | 默认 `MemoryPersistence`,开箱即用、无外部依赖 |
| 单文件部署 | `go build` 后只需一个可执行文件即可运行 |
| 容器化 | 提供 `Dockerfile`,支持多阶段构建与非 root 运行 |
### 三、快速启动
> **环境要求**:`go.mod` 声明 `toolchain go1.25.13`(已修复标准库 CVE)。Go 1.21+ 会自动下载并使用该工具链;如需手动指定可用 `GOTOOLCHAIN=go1.25.13 go build`。构建始终禁用 CGO(`CGO_ENABLED=0`)。
```bash
go mod tidy
go build ./...
# 启动管理服务(默认监听 11883)
./com.tyza66.SimpleMqttBrokerApi
# 或直接运行源码
go run main.go
```
启动后浏览器访问 `http://127.0.0.1:11883/` 即可打开 Web 管理面板。
**使用 Docker 运行:**
```bash
docker build -t fasteredge/mqtt-broker .
# 启动容器,映射管理端口(11883)与 MQTT 端口(1883)
docker run -d -p 11883:11883 -p 1883:1883 fasteredge/mqtt-broker
```
**Docker 环境变量:**
| 环境变量 | 默认值 | 说明 |
|----------|--------|------|
| `MANAGE_PORT` | `11883` | 管理接口 / WebUI 端口 |
| `MQTT_PORT` | `1883` | 未指定 `port` 参数时 MQTT 监听的默认端口 |
> 在容器内访问 `http://127.0.0.1:11883/health` 可用于健康检查(Broker 运行中返回 200)。
### 四、REST API
| 接口 | 方法 | 说明 |
|------|------|------|
| `/startup?port=1883` | GET | 启动 MQTT Broker,监听指定端口(缺省 `1883`)。重复启动返回 `already running`。 |
| `/heartbeat` | GET | 返回 JSON,包含版本、运行状态、日志缓存、时间戳与 Broker 端口。日志在每次读取后被清空。 |
| `/shutdown` | GET | 优雅关闭正在运行的 Broker。 |
**`/heartbeat` 返回示例:**
```json
{
"Version": "1.0.20260829",
"State": "running",
"Timestamp": "2026-08-28 13:20:00",
"Logs": [
"MQTT Broker service started on port 1883"
],
"BrokerPort": "1883"
}
```
### 五、用法示例
```bash
# 启动 MQTT Broker(监听 1883)
curl "http://127.0.0.1:11883/startup?port=1883"
# 查看状态与日志
curl "http://127.0.0.1:11883/heartbeat"
# 停止 Broker
curl "http://127.0.0.1:11883/shutdown"
```
### 六、目录结构
```
MqttBroker/
├─ main.go # 入口:HTTP 接口 + 嵌入式 WebUI(支持 MANAGE_PORT / MQTT_PORT)
├─ ui/
│ └─ index.html # Web 管理面板(go:embed 内嵌)
├─ go.mod # 依赖 FasterEdge MqttBrokerCore 模块
├─ Dockerfile # 多阶段容器构建 + HEALTHCHECK
├─ .dockerignore
├─ Logo.png
└─ README.md
```
### 七、内部实现
- **内核**:`hrotti.NewHrotti(100, &hrotti.MemoryPersistence{})` 创建基于内存持久化的 Broker 实例。
- **日志**:自定义 `LogInterceptor` 接管 `hrotti.INFO/DEBUG/ERROR` 输出,缓存最近 200 条日志供 `/heartbeat` 查询,并同步打印到标准输出。
- **WebUI**:通过 `go:embed` 把 `ui/` 静态资源嵌入二进制,根路径 `/` 由 `http.FileServer` 服务,与管理接口共用一个端口。
- **线程安全**:`started` 标志与日志缓存由 `sync.Mutex` 保护,避免并发读写竞态。
### 八、已内置的改进(来自 MqttBrokerCore)
- 报文解析长度限制与内存上限,防止 OOM 和协议错误。
- 断线 / 慢客户端下的非阻塞发送,避免服务死锁。
- 空 `ClientIdentifier` 且 `CleanSession=0` 时按规范拒绝连接。
- 消息 ID 耗尽时的安全处理。
---
> 本项目使用的 MQTT 内核来自内部公开库 **[github.com/FasterEdge/MqttBrokerCore](https://github.com/FasterEdge/MqttBrokerCore)**,其上游为开源的 [alsm/hrotti](https://github.com/alsm/hrotti) 项目,特此致谢。