一个由 MQTT 网关与核心业务服务组成的桌宠后端原型,包含设备注册、指令下发、遥测上报与在线状态管理。
pet-core:Spring Boot 核心服务,提供 REST API 与内部接口mqtt-gateway:Vert.x MQTT 网关,负责设备接入与内部转发
- 设备注册与查询
- 指令下发与状态跟踪(含超时处理)
- MQTT 认证与 Topic 访问控制
- 遥测上报与最新状态维护
- 设备在线/离线通知
- 内部接口 Token 校验(可选)
- JDK 17(建议)
- Maven 3.x
- 启动核心服务:
mvn -pl pet-core spring-boot:run- 启动 MQTT 网关:
使用 IDE 运行 com.deskpet.gateway.GatewayApplication,或自行配置运行方式。
- 注册设备:
curl -X POST http://localhost:8080/api/devices \
-H "Content-Type: application/json" \
-d "{\"deviceId\":\"pet-001\",\"secret\":\"secret123\",\"model\":\"deskpet\",\"remark\":\"demo\"}"- 设备连接 MQTT:
- clientId:
deviceId - username:
deviceId - password:设备注册时的
secret - 默认 MQTT 端口:
1883
server.port:HTTP 端口,默认8080gateway.baseUrl:网关内部地址,默认http://localhost:8081internal.token:内部接口 Token,默认空(不校验)command.timeoutSec:指令超时秒数,默认10command.timeoutScanMs:超时扫描间隔,默认2000
mqtt.port:MQTT 端口,默认1883internal.port:网关内部 HTTP 端口,默认8081core.internalBaseUrl:核心内部地址,默认http://localhost:8080gateway.instanceId:网关实例 ID,默认gateway-1internal.token:内部接口 Token,默认空(不校验)
说明:网关默认读取 config.yaml,可用 -Dgateway.config=path 指定配置路径。
GET /api/devices:设备列表GET /api/devices/{deviceId}:设备详情POST /api/devices:注册设备POST /api/devices/{deviceId}/commands:下发指令GET /api/devices/{deviceId}/commands/{reqId}:指令详情
指令下发请求示例:
{
"type": "setEmotion",
"payload": {
"emotion": "happy"
}
}当 internal.token 非空时,调用需携带 X-Internal-Token。
GET /internal/auth?deviceId=...&secret=...POST /internal/telemetry/{deviceId}POST /internal/ack/{deviceId}POST /internal/gateway/deviceOnlinePOST /internal/gateway/deviceOffline
遥测上报示例:
{
"schemaVersion": 1,
"ts": 1710000000,
"firmwareVersion": "1.0.0",
"rssi": -55,
"battery": 0.82,
"lastAction": "idle",
"extra": {
"temp": 36.5
}
}指令回执示例:
{
"schemaVersion": 1,
"reqId": "uuid",
"ok": true,
"code": null,
"message": null,
"ts": 1710000000
}POST /internal/command/send
- 订阅:
pet/{deviceId}/cmd - 上报遥测:
pet/{deviceId}/telemetry - 上报指令回执:
pet/{deviceId}/cmd/ack
默认使用 PostgreSQL + Flyway 进行持久化(详见 doc/部署与运维.md)。
- 配置与部署:
doc/部署与运维.md - 测试与模拟:
doc/测试与模拟.md