http://localhost:8045application/json{ "code": 0, "message": "ok", "data": {} }POST /api/event
请求体:
{
"code": "busy",
"timestamp": "2026-06-27T14:30:00Z"
}
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| code | string | 是 | 状态码 |
| timestamp | string | 否 | 时间戳 |
响应示例:
{
"code": 0,
"message": "ok"
}
状态码说明:
| code | 说明 |
|---|---|
| idle | 空闲 |
| busy | 工作中 |
| reasoning | 思考中 |
| using_tool | 使用工具中 |
| tool_done | 工具执行完成 |
| permission | 等待权限 |
| error | 错误 |
| init | 初始化 |
GET /api/health
响应示例:
{
"code": 0,
"message": "ok"
}
GET /api/mqtt
响应示例:
{
"code": 0,
"message": "ok",
"data": [
{
"id": 1,
"broker": "tcp://127.0.0.1:1883",
"client_id": "opencode-monitor",
"username": "user",
"password": "pass",
"topic": "opencode/status",
"enabled": true
}
]
}
POST /api/mqtt
请求体:
{
"broker": "tcp://127.0.0.1:1883",
"client_id": "opencode-monitor",
"username": "user",
"password": "pass",
"topic": "opencode/status",
"enabled": true
}
| 字段 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
| broker | string | 是 | - | MQTT Broker 地址 |
| client_id | string | 否 | opencode-monitor | 客户端 ID |
| username | string | 否 | - | MQTT 用户名 |
| password | string | 否 | - | MQTT 密码 |
| topic | string | 否 | opencode/status | 推送主题 |
| enabled | boolean | 否 | true | 是否启用 |
响应示例:
{
"code": 0,
"message": "创建成功",
"data": {
"id": 1,
"broker": "tcp://127.0.0.1:1883",
"client_id": "opencode-monitor",
"username": "user",
"password": "pass",
"topic": "opencode/status",
"enabled": true
}
}
GET /api/mqtt/:id
路径参数: | 参数 | 类型 | 说明 | |------|------|------| | id | integer | 配置 ID |
响应示例:
{
"code": 0,
"message": "ok",
"data": {
"id": 1,
"broker": "tcp://127.0.0.1:1883",
"client_id": "opencode-monitor",
"username": "user",
"password": "pass",
"topic": "opencode/status",
"enabled": true
}
}
PUT /api/mqtt/:id
路径参数: | 参数 | 类型 | 说明 | |------|------|------| | id | integer | 配置 ID |
请求体:
{
"broker": "tcp://192.168.1.100:1883",
"client_id": "my-monitor",
"username": "user",
"password": "pass",
"topic": "my/topic",
"enabled": false
}
响应示例:
{
"code": 0,
"message": "更新成功",
"data": {
"id": 1,
"broker": "tcp://192.168.1.100:1883",
"client_id": "my-monitor",
"username": "user",
"password": "pass",
"topic": "my/topic",
"enabled": false
}
}
DELETE /api/mqtt/:id
路径参数: | 参数 | 类型 | 说明 | |------|------|------| | id | integer | 配置 ID |
响应示例:
{
"code": 0,
"message": "删除成功"
}
GET /api/ble
响应示例:
{
"code": 0,
"message": "ok",
"data": [
{
"id": 1,
"device_name": "AI-Light",
"service_uuid": "b8b7e001-7a6b-4f4f-9a8b-11c0ffee0001",
"char_uuid": "b8b7e002-7a6b-4f4f-9a8b-11c0ffee0001",
"enabled": true
}
]
}
POST /api/ble
请求体:
{
"device_name": "AI-Light",
"service_uuid": "b8b7e001-7a6b-4f4f-9a8b-11c0ffee0001",
"char_uuid": "b8b7e002-7a6b-4f4f-9a8b-11c0ffee0001",
"enabled": true
}
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| device_name | string | 是 | BLE 设备名称 |
| service_uuid | string | 是 | BLE 服务 UUID |
| char_uuid | string | 是 | BLE 特征 UUID |
| enabled | boolean | 否 | 是否启用 (默认 true) |
响应示例:
{
"code": 0,
"message": "创建成功",
"data": {
"id": 1,
"device_name": "AI-Light",
"service_uuid": "b8b7e001-7a6b-4f4f-9a8b-11c0ffee0001",
"char_uuid": "b8b7e002-7a6b-4f4f-9a8b-11c0ffee0001",
"enabled": true
}
}
GET /api/ble/:id
路径参数: | 参数 | 类型 | 说明 | |------|------|------| | id | integer | 配置 ID |
PUT /api/ble/:id
路径参数: | 参数 | 类型 | 说明 | |------|------|------| | id | integer | 配置 ID |
请求体:
{
"device_name": "MyLight",
"service_uuid": "xxx",
"char_uuid": "yyy",
"enabled": false
}
DELETE /api/ble/:id
路径参数: | 参数 | 类型 | 说明 | |------|------|------| | id | integer | 配置 ID |
所有错误响应格式:
{
"code": -1,
"message": "错误信息"
}
# 启动 API 服务
./ai-status-light serve --addr :8045
# 启用 HTTPS (自签名证书)
./ai-status-light serve --addr :8045 --tls
| 选项 | 默认值 | 说明 |
|---|---|---|
--addr |
:8080 |
监听地址 |
--db |
./data/config.db |
数据库路径 |
--tls |
false |
启用 HTTPS (使用自签名证书) |
--tls-cert |
./data/tls/cert.pem |
TLS 证书文件路径 |
--tls-key |
./data/tls/key.pem |
TLS 私钥文件路径 |
--log-file |
./logs |
日志文件路径 |
--log-level |
info |
日志级别:debug、info、warn、error |
| 选项 | 默认值 | 说明 |
|---|---|---|
--db |
./data/config.db |
数据库路径 |
./ai-status-light version
显示版本信息。
以下选项适用于 serve 和 config 子命令:
| 选项 | 默认值 | 说明 |
|---|---|---|
--log-file |
./logs |
日志文件路径。默认 ./logs/monitor.log,按天自动轮转,同时输出到控制台和文件 |
--log-level |
info |
日志级别:debug、info、warn、error |
# 默认日志到 ./logs/monitor.log
./ai-status-light serve --addr :8045
# 指定日志路径
./ai-status-light serve --log-file /var/log/ai-status-light.log
# 开启 debug 日志
./ai-status-light serve --log-level debug
日志按天自动轮转,跨天后旧文件自动重命名:
logs/
├── monitor.log # 当天日志
├── monitor.log.2026-06-03 # 历史日志
└── monitor.log.2026-06-02 # 历史日志
API 已启用 CORS,支持跨域请求。
配置启用后,收到事件时会自动推送到配置的 topic。消息格式为 JSON:
{
"code": "busy",
"timestamp": "2026-06-27T14:30:00Z"
}
| code | 说明 |
|---|---|
| idle | 空闲 |
| busy | 工作中 |
| reasoning | 思考中 |
| using_tool | 使用工具中 |
| tool_done | 工具执行完成 |
| permission | 等待权限 |
| error | 错误 |
| init | 初始化 |
配置 BLE 后,监控到状态变化时会自动通过蓝牙发送到设备。BLE 中继已嵌入 Go 二进制,无需额外文件或 Python 环境。
# 一键构建
scripts/build.sh --ble # Linux/macOS
scripts\build.bat --ble # Windows
| API 状态码 | 蓝牙模式 | 说明 |
|---|---|---|
| idle | idle | 空闲 |
| busy | busy | 工作中 |
| reasoning | thinking | 思考中 |
| using_tool | ai | 使用工具 |
| tool_done | success | 工具完成 |
| permission | alarm | 等待权限 |
| error | error | 错误 |
| init | init | 初始化 |
pip install -r scripts/requirements.txt
如果使用预编译二进制则不需要安装。
GET /api/device/config
响应示例:
{
"code": 0,
"message": "ok",
"data": [
{
"id": 1,
"device_name": "AI-Light",
"config_topic": "agent/status/config",
"wifi_ssid": "MyWiFi",
"mqtt_broker": "192.168.1.100",
"mqtt_port": 1883,
"mqtt_client": "AI-Light",
"mqtt_topic": "agent/status",
"pin_red": 4,
"pin_green": 3,
"pin_yellow": 2,
"enabled": true
}
]
}
POST /api/device/config
请求体:
{
"device_name": "AI-Light",
"config_topic": "agent/status/config",
"wifi_ssid": "MyWiFi",
"wifi_pass": "MyPassword",
"mqtt_broker": "192.168.1.100",
"mqtt_port": 1883,
"mqtt_user": "user",
"mqtt_pass": "pass",
"mqtt_client": "AI-Light",
"mqtt_topic": "agent/status",
"mqtt_status": "agentLight/status",
"pin_red": 4,
"pin_green": 3,
"pin_yellow": 2,
"enabled": true
}
| 字段 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
| device_name | string | 是 | - | 设备名称 |
| config_topic | string | 否 | agent/status/config | 配置 topic |
| wifi_ssid | string | 否 | - | WiFi SSID |
| wifi_pass | string | 否 | - | WiFi 密码 |
| mqtt_broker | string | 否 | - | MQTT Broker 地址 |
| mqtt_port | integer | 否 | 1883 | MQTT 端口 |
| mqtt_user | string | 否 | - | MQTT 用户名 |
| mqtt_pass | string | 否 | - | MQTT 密码 |
| mqtt_client | string | 否 | - | MQTT 客户端 ID |
| mqtt_topic | string | 否 | - | MQTT 状态 topic |
| mqtt_status | string | 否 | - | MQTT 状态上报 topic |
| pin_red | integer | 否 | 4 | 红灯引脚 |
| pin_green | integer | 否 | 3 | 绿灯引脚 |
| pin_yellow | integer | 否 | 2 | 黄灯引脚 |
| enabled | boolean | 否 | true | 是否启用 |
GET /api/device/config/:id
PUT /api/device/config/:id
DELETE /api/device/config/:id
POST /api/device/config/push
通过 MQTT 向设备下发配置,设备会自动保存到 NVS 并重启。
请求体:
{
"id": 1,
"reset": false
}
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| id | integer | 是 | 设备配置 ID |
| reset | boolean | 否 | 是否恢复出厂设置 (默认 false) |
响应示例:
{
"code": 0,
"message": "配置已推送"
}
说明:
reset: true 可恢复设备出厂设置启动服务后,可以通过 SSE (Server-Sent Events) 接收实时状态更新。
GET /api/events
connected - 连接成功status - 状态更新SSE 推送的消息格式为 JSON:
{
"code": "busy",
"timestamp": "2026-06-27T14:30:00Z"
}
const eventSource = new EventSource('/api/events');
eventSource.addEventListener('connected', (e) => {
console.log('已连接');
});
eventSource.addEventListener('status', (e) => {
const data = JSON.parse(e.data);
console.log('状态更新:', data);
});
eventSource.onerror = () => {
console.log('连接断开,自动重连中...');
};
curl -N http://localhost:8045/api/events