2026-07-24 15:14:18 +08:00
|
|
|
|
# Chongming-Zenoh
|
2026-07-21 16:12:13 +08:00
|
|
|
|
|
2026-07-24 16:33:23 +08:00
|
|
|
|
基于 **FastAPI + Zenoh + MQTT + Vue 3** 的**配置驱动微服务网关平台**。
|
2026-07-24 15:14:18 +08:00
|
|
|
|
|
2026-08-14 16:03:49 +08:00
|
|
|
|
通过 TOML 配置文件定义 RPC 端点,自动生成 Pydantic 模型与 FastAPI 路由,同时暴露 **HTTP** 和 **MQTT** 双通道。底层基于 Zenoh 分布式消息协议实现 RPC 通信,Worker 插件可独立开发、按副本数水平扩展。
|
2026-07-24 15:14:18 +08:00
|
|
|
|
|
|
|
|
|
|
---
|
2026-07-21 16:12:13 +08:00
|
|
|
|
|
|
|
|
|
|
## 核心特性
|
|
|
|
|
|
|
2026-08-12 10:18:34 +08:00
|
|
|
|
| 特性 | 说明 |
|
|
|
|
|
|
| --------------------- | -------------------------------------------------------------------- |
|
|
|
|
|
|
| **FastAPI + Uvicorn** | 高性能异步 Web 框架,自动生成 OpenAPI 文档 |
|
|
|
|
|
|
| **Zenoh 服务发现** | 基于 liveliness 的 Worker 注册与 RPC 调用,负载均衡 + 超时重试 |
|
|
|
|
|
|
| **MQTT 集成** | 内嵌 amqtt Broker,MQTT ↔ Worker 双向桥接 |
|
2026-08-14 16:03:49 +08:00
|
|
|
|
| **动态路由生成** | 扫描 `config/workers/*/*.toml` 自动注册 HTTP 路由 |
|
2026-08-12 10:18:34 +08:00
|
|
|
|
| **Worker 框架** | `@rpc_method` 装饰器 + `Plugin` 基类统一生命周期 + Pydantic 模型绑定 |
|
2026-08-14 16:03:49 +08:00
|
|
|
|
| **启动契约校验** | TOML 路由 ↔ `@rpc_method` ↔ 生成模型三方一致性校验,fail fast |
|
2026-08-12 10:18:34 +08:00
|
|
|
|
| **自动化模型生成** | `gen_models` 根据 TOML 配置生成请求/响应模型 |
|
|
|
|
|
|
| **插件脚手架** | `gen_plugin` 一键生成风格统一的 Worker 插件骨架 |
|
|
|
|
|
|
| **JWT 鉴权** | Rust 实现,路由级 `auth_required` 控制 |
|
|
|
|
|
|
| **Argon2id 密码哈希** | Rust 实现的高性能密码安全方案 |
|
|
|
|
|
|
| **异步 SQLite** | aiosqlite + SQLModel,多进程并发安全 |
|
|
|
|
|
|
| **本地文件存储** | 内置文件上传/下载端点 |
|
|
|
|
|
|
| **流媒体代理** | ffmpeg + MediaMTX RTSP 流转发 |
|
|
|
|
|
|
| **构建打包** | PyInstaller / Nuitka 一键打包为独立可执行文件 |
|
|
|
|
|
|
| **Vue 3 前端** | Element Plus UI、Pinia 状态管理、类型安全的 API 客户端 |
|
2026-07-24 15:14:18 +08:00
|
|
|
|
|
|
|
|
|
|
---
|
2026-07-21 16:12:13 +08:00
|
|
|
|
|
|
|
|
|
|
## 项目结构
|
|
|
|
|
|
|
|
|
|
|
|
```text
|
2026-07-24 15:14:18 +08:00
|
|
|
|
chongming-zenoh/
|
2026-08-05 18:18:48 +08:00
|
|
|
|
├── config.toml # 应用主配置
|
|
|
|
|
|
├── pyproject.toml # 项目依赖与脚本入口
|
2026-07-24 15:14:18 +08:00
|
|
|
|
├── config/ # 配置文件目录
|
|
|
|
|
|
│ ├── zenoh_config.json5 # Zenoh 会话配置
|
2026-07-24 16:33:23 +08:00
|
|
|
|
│ └── workers/ # Worker 路由定义(TOML)
|
2026-08-14 16:03:49 +08:00
|
|
|
|
│ ├── config.toml # 旧式全局插件注册(仅作兜底兼容)
|
|
|
|
|
|
│ ├── auth/ # 鉴权插件(config.toml = 插件注册 + 运行时配置)
|
2026-07-24 16:33:23 +08:00
|
|
|
|
│ ├── doubao/ # 豆包视觉理解插件
|
2026-08-05 18:18:48 +08:00
|
|
|
|
│ ├── aibox_sophon_adapter/ # AI Box 设备心跳监控插件
|
|
|
|
|
|
│ └── example/ # 示例插件(四则运算 / MQTT 端点)
|
2026-07-21 16:12:13 +08:00
|
|
|
|
├── src/
|
2026-07-24 15:14:18 +08:00
|
|
|
|
│ ├── chongming/ # 核心应用
|
|
|
|
|
|
│ │ ├── app/
|
2026-08-14 16:03:49 +08:00
|
|
|
|
│ │ │ ├── core/ # WorkerManager, RouteGenerator, MQTTBridge, contracts(契约校验), auth
|
2026-08-05 18:18:48 +08:00
|
|
|
|
│ │ │ └── routes/ # 内置路由(文件上传等)
|
2026-08-12 10:18:34 +08:00
|
|
|
|
│ │ └── scripts/ # build, gen_models, gen_plugin
|
2026-07-24 15:14:18 +08:00
|
|
|
|
│ ├── chongming-web/ # Vue 3 前端
|
2026-07-24 16:33:23 +08:00
|
|
|
|
│ │ └── src/
|
|
|
|
|
|
│ │ ├── api/generated/ # 自动生成 API 客户端
|
|
|
|
|
|
│ │ ├── views/ # 页面组件
|
|
|
|
|
|
│ │ └── router/ # Vue Router 配置
|
2026-07-24 15:14:18 +08:00
|
|
|
|
│ └── plugins/ # Worker 插件源码
|
2026-07-24 16:33:23 +08:00
|
|
|
|
│ ├── auth/ # JWT 鉴权
|
2026-08-05 18:18:48 +08:00
|
|
|
|
│ ├── doubao/ # 豆包 AI(支持 AICC 安全通道)
|
|
|
|
|
|
│ ├── aibox_sophon_adapter/ # 设备心跳 + 告警
|
|
|
|
|
|
│ └── example/ # 演示示例
|
|
|
|
|
|
├── utils/ # 独立工具包
|
|
|
|
|
|
│ ├── bytedance/ # 字节跳动安全通信 SDK
|
|
|
|
|
|
│ ├── config/ # TOML 配置加载
|
|
|
|
|
|
│ ├── database/ # 异步 SQLite 封装
|
|
|
|
|
|
│ ├── jwt/ # Rust JWT 编解码
|
|
|
|
|
|
│ ├── password/ # Rust Argon2id 哈希
|
|
|
|
|
|
│ ├── request/ # Zenoh RPC 客户端
|
|
|
|
|
|
│ ├── stream_manager/ # ffmpeg RTSP 流管理
|
|
|
|
|
|
│ └── worker/ # Worker 框架核心
|
|
|
|
|
|
├── data/
|
|
|
|
|
|
│ ├── storage/chongming/ # SQLite 数据库文件
|
|
|
|
|
|
│ └── uploads/ # 文件上传目录
|
2026-07-24 15:14:18 +08:00
|
|
|
|
├── logs/ # 日志目录
|
2026-08-05 18:18:48 +08:00
|
|
|
|
├── resources/ # 模块银行打包资源
|
|
|
|
|
|
├── test_mqtt_e2e.py # MQTT 端到端测试
|
|
|
|
|
|
├── publisher.py / subscriber.py # MQTT 收发示例
|
|
|
|
|
|
└── README.md
|
2026-07-21 16:12:13 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-07-24 15:14:18 +08:00
|
|
|
|
---
|
|
|
|
|
|
|
2026-07-21 16:12:13 +08:00
|
|
|
|
## 快速开始
|
|
|
|
|
|
|
2026-07-24 15:14:18 +08:00
|
|
|
|
### 环境要求
|
|
|
|
|
|
|
|
|
|
|
|
- Python >= 3.12
|
|
|
|
|
|
- Rust 工具链(用于编译 `jwt` / `password` 扩展)
|
2026-07-24 16:33:23 +08:00
|
|
|
|
- Node.js >= 22(前端开发)
|
2026-07-24 15:14:18 +08:00
|
|
|
|
- [uv](https://docs.astral.sh/uv/) 包管理器
|
2026-08-05 18:18:48 +08:00
|
|
|
|
- ffmpeg(可选,stream_manager 需要)
|
2026-07-24 15:14:18 +08:00
|
|
|
|
|
|
|
|
|
|
### 安装与启动
|
2026-07-21 16:12:13 +08:00
|
|
|
|
|
|
|
|
|
|
```bash
|
2026-08-05 18:18:48 +08:00
|
|
|
|
# 同步依赖(自动编译 Rust 扩展 + 安装 Python 包)
|
|
|
|
|
|
uv sync
|
|
|
|
|
|
|
|
|
|
|
|
# 启动服务(开发模式,热重载)
|
|
|
|
|
|
uv run serve
|
2026-07-21 16:12:13 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
服务启动后:
|
2026-07-24 16:33:23 +08:00
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
| 通道 | 地址 | 说明 |
|
|
|
|
|
|
| ------- | ---------------------------- | ---------------- |
|
|
|
|
|
|
| HTTP | `http://localhost:8000` | REST API |
|
|
|
|
|
|
| Swagger | `http://localhost:8000/docs` | OpenAPI 交互文档 |
|
|
|
|
|
|
| MQTT | `mqtt://localhost:1883` | 内嵌 Broker |
|
2026-07-24 15:14:18 +08:00
|
|
|
|
|
|
|
|
|
|
### 前端开发
|
2026-07-21 16:12:13 +08:00
|
|
|
|
|
|
|
|
|
|
```bash
|
2026-07-24 15:14:18 +08:00
|
|
|
|
cd src/chongming-web
|
2026-08-05 18:18:48 +08:00
|
|
|
|
npm install
|
|
|
|
|
|
npm run dev # http://localhost:5173
|
2026-07-24 15:14:18 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 架构与数据流
|
|
|
|
|
|
|
|
|
|
|
|
```mermaid
|
2026-07-24 16:33:23 +08:00
|
|
|
|
graph TB
|
2026-08-05 18:18:48 +08:00
|
|
|
|
HTTP[HTTP 客户端] -->|REST API| FastAPI[FastAPI 路由<br/>TOML 自动生成]
|
|
|
|
|
|
MQTT[MQTT 客户端] -->|chongming/+/+| Bridge[MQTT Bridge<br/>纯客户端模式]
|
2026-07-24 16:33:23 +08:00
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
FastAPI --> WM[WorkerManager<br/>随机负载均衡 + 超时重试]
|
2026-07-24 16:33:23 +08:00
|
|
|
|
Bridge --> WM
|
|
|
|
|
|
|
|
|
|
|
|
WM -->|Zenoh Query| W1[Worker 副本 1]
|
2026-08-05 18:18:48 +08:00
|
|
|
|
WM -->|Zenoh Query| W2[Worker 副本 2]
|
|
|
|
|
|
WM -->|Zenoh Query| W3[Worker 副本 N]
|
2026-07-24 16:33:23 +08:00
|
|
|
|
|
|
|
|
|
|
W1 & W2 & W3 -->|插件业务逻辑| DB[(SQLite)]
|
|
|
|
|
|
W1 & W2 & W3 -->|AI 调用| AI[豆包 API]
|
2026-07-24 15:14:18 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
**启动流程**:
|
2026-07-24 15:14:18 +08:00
|
|
|
|
|
|
|
|
|
|
```
|
2026-07-24 16:33:23 +08:00
|
|
|
|
uv run serve → FastAPI lifespan:
|
2026-08-05 18:18:48 +08:00
|
|
|
|
1. setup_storage() — 本地文件系统存储
|
|
|
|
|
|
2. setup_zenoh() — Zenoh peer 会话
|
|
|
|
|
|
3. setup_worker_manager() — WorkerManager + 定期 liveliness 刷新
|
|
|
|
|
|
4. load_workers() — 动态 import 插件 → 启动 Worker 协程
|
|
|
|
|
|
5. register_routes() — 扫描 config/workers/ 生成 HTTP 路由
|
|
|
|
|
|
6. setup_mqtt() — 内嵌 Broker(子进程)+ MQTT Bridge
|
2026-07-24 16:33:23 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
## 端点类型与路由注册
|
2026-07-24 16:33:23 +08:00
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
### 端点类型
|
2026-07-24 16:33:23 +08:00
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
TOML 文件中的节类型决定端点暴露方式:
|
2026-07-24 16:33:23 +08:00
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
| 节类型 | HTTP 路由 | OpenAPI 文档 | MQTT | 请求模型命名 |
|
|
|
|
|
|
| -------- | --------- | ------------ | ---- | ------------------------------------- |
|
|
|
|
|
|
| `[GET]` | ✅ | ✅ | ✅ | `XxxGetRequest / XxxGetResponse` |
|
|
|
|
|
|
| `[POST]` | ✅ | ✅ | ✅ | `XxxPostRequest / XxxPostResponse` |
|
|
|
|
|
|
| `[MQTT]` | ❌ | ❌ | ✅ | `XxxMqttRequest`(无 response_model) |
|
2026-07-24 16:33:23 +08:00
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
### 两种路由注册方式
|
2026-07-24 16:33:23 +08:00
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
#### 方式一:TOML 动态路由(标准 JSON 端点)
|
|
|
|
|
|
|
|
|
|
|
|
通过 `config/workers/<插件>/*.toml` 定义端点,自动生成 FastAPI 路由。适用于参数和响应可被 Pydantic 模型描述的标准接口。
|
2026-07-24 16:33:23 +08:00
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
```toml
|
|
|
|
|
|
# config/workers/example/add.toml
|
|
|
|
|
|
[GET]
|
|
|
|
|
|
summary = "加法运算"
|
|
|
|
|
|
params = ["a: float", "b: float"]
|
|
|
|
|
|
|
|
|
|
|
|
[GET.response_model]
|
|
|
|
|
|
result = { type = "float", required = true }
|
2026-07-24 16:33:23 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
#### 方式二:插件自定义路由(特殊端点)
|
2026-07-24 16:33:23 +08:00
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
当端点无法用 TOML 描述时(如 `multipart/form-data` 上传),插件暴露 `APIRouter` 实例,网关自动发现并注册。
|
2026-07-24 16:33:23 +08:00
|
|
|
|
|
|
|
|
|
|
```python
|
2026-08-05 18:18:48 +08:00
|
|
|
|
# src/plugins/<name>/routes.py
|
|
|
|
|
|
from fastapi import APIRouter, UploadFile, File
|
2026-07-24 16:33:23 +08:00
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
router = APIRouter(prefix="/<prefix>", tags=["<worker_type>"])
|
2026-07-24 16:33:23 +08:00
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
@router.post("/upload")
|
|
|
|
|
|
async def upload(file: UploadFile = File(...)):
|
|
|
|
|
|
...
|
2026-07-21 16:12:13 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
> **约定**:插件 `__init__.py` 中导入 `router` 实例(`from .routes import router`),网关通过 `getattr(module, "router", None)` 自动发现。
|
|
|
|
|
|
|
2026-07-24 15:14:18 +08:00
|
|
|
|
---
|
|
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
## MQTT 协议
|
2026-07-24 15:14:18 +08:00
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
### Topic 约定
|
2026-07-24 16:33:23 +08:00
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
| 方向 | Topic | 说明 |
|
|
|
|
|
|
| ---- | -------------------------------- | ------------------------------ |
|
|
|
|
|
|
| 请求 | `chongming/<type>/<op>` | MQTT → Worker |
|
|
|
|
|
|
| 响应 | `chongming/<type>/<op>/response` | Worker → MQTT(`None` 时跳过) |
|
2026-07-24 16:33:23 +08:00
|
|
|
|
|
2026-08-07 09:39:29 +08:00
|
|
|
|
### 自定义订阅主题
|
|
|
|
|
|
|
|
|
|
|
|
除内置的 `chongming/<type>/<op>` 接口外,可将外部 MQTT 主题桥接到任意 Worker。**推荐在插件自己的配置** `config/workers/<type>/config.toml` 中通过 `[[workers.mqtt_topics]]` 声明(目标 worker 即该插件本身):
|
|
|
|
|
|
|
|
|
|
|
|
```toml
|
|
|
|
|
|
# config/workers/aibox_sophon_adapter/config.toml
|
|
|
|
|
|
[[workers.mqtt_topics]]
|
2026-08-14 16:03:49 +08:00
|
|
|
|
topic = "box/aibox_sophon/board_ping" # 支持 +(单级)/ #(多级,须在末尾)通配符
|
2026-08-07 09:39:29 +08:00
|
|
|
|
subject = "aibox_sophon_adapter.board_ping" # 可选,{1} {2}... 对应通配符捕获值
|
|
|
|
|
|
response_topic = "/board_ping/response" # 可选,响应主题;默认 "<实际主题>/response"
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
- `subject` 缺省为 `<插件类型>.<topic 最后一段>`;`response_topic` 缺省为 `<实际匹配主题>/response`。
|
|
|
|
|
|
- 网关发现插件时自动收集所有 `[[workers.mqtt_topics]]`,MQTT Bridge 一并订阅并路由。
|
|
|
|
|
|
- 多条自定义主题按配置顺序匹配,先匹配者优先;内置 `chongming/...` 接口最后兜底。
|
|
|
|
|
|
- 全局 `[<env>.mqtt].custom_topics` 仍可作为通用兜底(不依赖具体插件时使用,可选)。
|
|
|
|
|
|
|
2026-08-14 16:03:49 +08:00
|
|
|
|
### 请求负载格式(信封协议)
|
|
|
|
|
|
|
|
|
|
|
|
MQTT 请求负载为信封结构,控制字段与业务数据分离:
|
|
|
|
|
|
|
|
|
|
|
|
```json
|
|
|
|
|
|
{
|
|
|
|
|
|
"meta": {
|
|
|
|
|
|
"method": "GET", // 可选,默认 GET;MQTT 专用端点需显式 "MQTT"
|
|
|
|
|
|
"timeout": 30, // 可选,RPC 超时(秒),默认 30
|
|
|
|
|
|
"cacheable": false // 可选,是否允许结果缓存,默认 false
|
|
|
|
|
|
},
|
|
|
|
|
|
"data": { "a": 3, "b": 5 } // 业务参数,传给 Worker
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
- 非信封格式的负载会被网关丢弃并告警(严格协议,设备侧请按此格式发布)。
|
|
|
|
|
|
- HTTP 通道由网关自动组装信封(注入 method / user_info),无需调用方关心。
|
|
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
### 快速测试
|
2026-07-24 16:33:23 +08:00
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
```bash
|
|
|
|
|
|
# 终端 1:启动服务
|
|
|
|
|
|
uv run serve
|
2026-07-24 16:33:23 +08:00
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
# 终端 2:端到端测试
|
|
|
|
|
|
python test_mqtt_e2e.py
|
2026-07-24 16:33:23 +08:00
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
# 手动测试
|
|
|
|
|
|
python subscriber.py # 监听所有响应
|
|
|
|
|
|
python publisher.py example add '{"a":3,"b":5}' # 调用 add
|
2026-07-24 16:33:23 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
---
|
2026-07-28 14:13:43 +08:00
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
## 开发指南
|
2026-07-28 14:13:43 +08:00
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
### 添加新 Worker 插件
|
2026-07-28 14:13:43 +08:00
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
```text
|
2026-08-14 16:03:49 +08:00
|
|
|
|
1. 创建 src/plugins/<name>/ — __init__.py(Plugin 子类), global_var.py, router/, models/
|
|
|
|
|
|
2. 创建 config/workers/<name>/config.toml,在 [workers] 节注册插件
|
|
|
|
|
|
(type / module / factory / cleanup / count + [workers.config] 运行时配置)
|
2026-08-05 18:18:48 +08:00
|
|
|
|
3. 创建 config/workers/<name>/*.toml 端点定义
|
|
|
|
|
|
4. 运行 uv run python -m chongming.scripts.gen_models 生成模型
|
|
|
|
|
|
5. 实现 router/<op>.py,引用 models/pydantic.py 中的模型
|
|
|
|
|
|
6. 更新 router/__init__.py 导入
|
|
|
|
|
|
```
|
2026-07-28 14:13:43 +08:00
|
|
|
|
|
2026-08-14 16:03:49 +08:00
|
|
|
|
> 推荐用脚手架一步生成骨架:`uv run gen_plugin <name> [operation ...]`。
|
|
|
|
|
|
> 启动时网关会做**契约校验**:TOML 路由缺少对应 `@rpc_method` 将导致启动失败,
|
|
|
|
|
|
> 模型缺失/孤儿等不一致以警告日志提示。
|
|
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
### 为现有插件添加新端点
|
2026-07-28 14:13:43 +08:00
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
```text
|
|
|
|
|
|
1. 创建 config/workers/<name>/<op>.toml
|
|
|
|
|
|
2. 运行 uv run python -m chongming.scripts.gen_models
|
|
|
|
|
|
3. 创建 router/<op>.py → 引用生成的模型
|
|
|
|
|
|
4. 更新 router/__init__.py
|
|
|
|
|
|
5. 重启服务
|
2026-07-28 14:13:43 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
### 常用命令
|
2026-07-28 14:13:43 +08:00
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
```bash
|
|
|
|
|
|
uv run serve # 启动开发服务
|
2026-08-12 10:18:34 +08:00
|
|
|
|
uv run gen_plugin <name> # 生成统一风格插件骨架
|
2026-08-05 18:18:48 +08:00
|
|
|
|
uv run python -m chongming.scripts.gen_models # 生成 Pydantic 模型
|
|
|
|
|
|
uv run python -m chongming.scripts.build # 构建打包(PyInstaller/Nuitka)
|
|
|
|
|
|
uv pip install -e utils/<name> # 安装/更新工具包
|
|
|
|
|
|
```
|
2026-07-28 14:13:43 +08:00
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
---
|
2026-07-28 14:13:43 +08:00
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
## 插件列表
|
2026-07-28 14:13:43 +08:00
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
| 插件 | 路径 | 功能 |
|
|
|
|
|
|
| ------------------------ | ----------------------------------- | ------------------------------------------------------- |
|
|
|
|
|
|
| **auth** | `src/plugins/auth/` | 用户注册/登录/资料管理,JWT 鉴权,管理员初始化 |
|
|
|
|
|
|
| **doubao** | `src/plugins/doubao/` | 豆包视觉理解,支持 AICC 安全通信通道 |
|
|
|
|
|
|
| **aibox_sophon_adapter** | `src/plugins/aibox_sophon_adapter/` | AI Box 设备心跳监控、离线检测、告警上报与查询、视频上传 |
|
|
|
|
|
|
| **example** | `src/plugins/example/` | 四则运算 + 心跳演示(含 MQTT 端点示例) |
|
2026-07-28 14:13:43 +08:00
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
---
|
2026-07-28 14:13:43 +08:00
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
## 工具包列表
|
2026-07-28 14:13:43 +08:00
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
| 包名 | 路径 | 语言 | 说明 |
|
|
|
|
|
|
| ---------------------------- | ----------------------- | ----------- | ---------------------------------------------- |
|
|
|
|
|
|
| **chongming-config** | `utils/config/` | Python | TOML 配置加载,TypedDict 类型安全 |
|
|
|
|
|
|
| **chongming-database** | `utils/database/` | Python | aiosqlite + SQLModel 异步数据库封装 |
|
|
|
|
|
|
| **chongming-jwt** | `utils/jwt/` | Rust + PyO3 | JWT 编解码,支持 HS256/384/512 + RS256/384/512 |
|
|
|
|
|
|
| **chongming-password** | `utils/password/` | Rust + PyO3 | Argon2id 密码哈希与验证 |
|
|
|
|
|
|
| **chongming-request** | `utils/request/` | Python | Zenoh RPC 直连客户端 |
|
|
|
|
|
|
| **chongming-worker** | `utils/worker/` | Python | Worker 框架核心:装饰器、运行时、配置加载 |
|
|
|
|
|
|
| **chongming-stream-manager** | `utils/stream_manager/` | Python | ffmpeg + MediaMTX RTSP 流代理管理 |
|
|
|
|
|
|
| **bytedance** | `utils/bytedance/` | Python | 字节跳动 AICC 安全通信 SDK(Jeddak 等) |
|
2026-07-28 14:13:43 +08:00
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
---
|
2026-07-28 14:13:43 +08:00
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
## 配置说明
|
2026-07-28 14:13:43 +08:00
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
- **应用配置**:根目录 `config.toml`,包含环境、服务器、安全、MQTT 等全局设置
|
|
|
|
|
|
- **Zenoh 配置**:`config/zenoh_config.json5`
|
2026-08-14 16:03:49 +08:00
|
|
|
|
- **插件注册**:`config/workers/<name>/config.toml` 的 `[workers]` 节,定义加载方式、副本数与运行时配置(旧全局 `config/workers/config.toml` 仅作兜底兼容)
|
2026-08-05 18:18:48 +08:00
|
|
|
|
- **路由定义**:`config/workers/<name>/*.toml`,每个端点一个文件
|
2026-07-28 14:13:43 +08:00
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
详细配置说明见 [`config/README.md`](config/README.md)。
|
2026-07-28 14:13:43 +08:00
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
---
|
2026-07-28 14:13:43 +08:00
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
## 构建部署
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# PyInstaller 打包
|
|
|
|
|
|
uv run python -m chongming.scripts.build pyinstaller
|
|
|
|
|
|
|
|
|
|
|
|
# Nuitka 打包
|
|
|
|
|
|
uv run python -m chongming.scripts.build nuitka
|
|
|
|
|
|
```
|
2026-07-24 15:14:18 +08:00
|
|
|
|
|
2026-08-05 18:18:48 +08:00
|
|
|
|
构建过程包括:模块加密打包 → 资源复制 → PyInstaller/Nuitka 打包 → 数据库初始化 → 前端编译 → VFS 挂载。
|
2026-07-24 15:14:18 +08:00
|
|
|
|
|
2026-07-24 16:33:23 +08:00
|
|
|
|
详见 [插件开发指南](src/plugins/README.md)。
|
2026-07-24 15:14:18 +08:00
|
|
|
|
|
|
|
|
|
|
### 常用命令
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
uv run serve # 启动开发服务器
|
2026-08-12 10:18:34 +08:00
|
|
|
|
uv run gen_plugin <name> # 生成统一风格插件骨架
|
2026-07-24 15:14:18 +08:00
|
|
|
|
uv run python -m chongming.scripts.gen_models # 生成 Pydantic 模型
|
|
|
|
|
|
uv run build pyinstaller # PyInstaller 打包
|
|
|
|
|
|
uv run build nuitka # Nuitka 打包
|
|
|
|
|
|
uv pip install -e utils/<name> # 安装/更新工具包子包
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### TOML 配置字段速查
|
|
|
|
|
|
|
2026-07-24 16:33:23 +08:00
|
|
|
|
| 字段 | 位置 | 说明 |
|
|
|
|
|
|
| -------------------- | --------------------- | --------------------------------------- |
|
2026-08-14 16:03:49 +08:00
|
|
|
|
| `count` | `<插件>/config.toml` | Worker 副本数(`[workers]` 节) |
|
2026-07-24 16:33:23 +08:00
|
|
|
|
| `router_prefix` | `<插件>/config.toml` | API 路由前缀 |
|
|
|
|
|
|
| `defaults.timeout` | `<插件>/config.toml` | 默认超时(秒) |
|
|
|
|
|
|
| `defaults.cacheable` | `<插件>/config.toml` | 是否缓存 RPC 结果 |
|
|
|
|
|
|
| `params` | `<操作>.toml` | 参数列表(`"name: type"` 格式) |
|
|
|
|
|
|
| `auth_required` | `<操作>.toml` | 是否需要 JWT 鉴权 |
|
|
|
|
|
|
| `internal` | `<操作>.toml` | `true` 则仅限内部 RPC,不注册 HTTP 路由 |
|
|
|
|
|
|
| `cacheable` | `<操作>.toml` | 端点是否可缓存 |
|
|
|
|
|
|
| `summary` | `<操作>.toml` | 端点描述(用于 OpenAPI / 日志) |
|
2026-07-24 15:14:18 +08:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 内置插件
|
|
|
|
|
|
|
2026-07-28 14:13:43 +08:00
|
|
|
|
| 插件 | HTTP 前缀 | MQTT 主题前缀 | 说明 |
|
|
|
|
|
|
| ------------------------ | --------- | ------------------------ | ------------------------------------ |
|
|
|
|
|
|
| **auth** | `/auth` | `auth.*` | 注册、登录、JWT 鉴权、个人信息、改密 |
|
|
|
|
|
|
| **doubao** | `/doubao` | `doubao.*` | 火山引擎豆包视觉理解模型 |
|
|
|
|
|
|
| **example** | `/calc` | `example.*` | 四则运算 + 访问计数 + MQTT 心跳示例 |
|
|
|
|
|
|
| **aibox_sophon_adapter** | `/aibox` | `aibox_sophon_adapter.*` | AI Box 设备心跳适配 + 视频上传 |
|
2026-07-24 15:14:18 +08:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 工具包
|
2026-07-21 16:12:13 +08:00
|
|
|
|
|
2026-07-24 15:14:18 +08:00
|
|
|
|
| 包名 | 说明 | 技术栈 |
|
|
|
|
|
|
| -------------------- | --------------------------------------------- | ----------- |
|
|
|
|
|
|
| `chongming-config` | TOML 配置加载、TypedDict 类型定义 | Python |
|
2026-07-24 16:33:23 +08:00
|
|
|
|
| `chongming-database` | 异步 SQLite(aiosqlite + SQLModel) | Python |
|
2026-07-24 15:14:18 +08:00
|
|
|
|
| `chongming-jwt` | JWT 编码/验证(HS256/384/512, RS256/384/512) | Rust + PyO3 |
|
|
|
|
|
|
| `chongming-password` | Argon2id 密码哈希与验证 | Rust + PyO3 |
|
2026-07-24 16:33:23 +08:00
|
|
|
|
| `chongming-request` | Zenoh Worker 客户端(负载均衡、超时重试) | Python |
|
2026-07-24 15:14:18 +08:00
|
|
|
|
| `chongming-worker` | Worker 框架核心(`@rpc_method`、运行时) | Python |
|
2026-07-21 16:12:13 +08:00
|
|
|
|
|
2026-07-24 15:14:18 +08:00
|
|
|
|
---
|
2026-07-21 16:12:13 +08:00
|
|
|
|
|
|
|
|
|
|
## 更多文档
|
|
|
|
|
|
|
2026-07-24 15:14:18 +08:00
|
|
|
|
- [配置说明](config/README.md)
|
|
|
|
|
|
- [插件开发指南](src/plugins/README.md)
|
|
|
|
|
|
- [前端开发指南](src/chongming-web/README.md)
|
|
|
|
|
|
- [Worker 框架](utils/worker/README.md)
|