# 机器人调度系统Demo **Repository Path**: chen-zheng-jimmy/robot-interface-demo ## Basic Information - **Project Name**: 机器人调度系统Demo - **Description**: 基于RuoYi-Spring Cloud二次开发的网址 - **Primary Language**: Java - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-08-19 - **Last Updated**: 2025-09-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: ruoyi, gaussian, OpenAPI ## README

园区机器人调度系统 · 代码结构演示(RuoYi-Cloud v3.6.6)

面向多厂商(高仙 / Gaussian Robotics、宇树等)的机器人接入、编排与调度平台(只读示例仓库,默认不可运行)

> **What**:多厂商机器人接入、编排与调度的平台**代码结构与设计示例**。 > **Why**:避免误触发真实设备与泄露敏感信息,本仓库**默认不可运行**。 > **Who**:面向后端/架构/平台治理读者(网关治理、稳定性与可观测性)。 ## 📌 重要声明(务必先读) - 本仓库为**代码结构与设计演示**,**默认不可运行**。 - **未包含 Nacos 配置**、任何密钥/凭据与可用的外部地址;所有第三方参数均已移除或以占位符存在。 - 原因:项目对接真实机器人/生产环境,公开可运行版本可能**误触发真实设备**或泄露隐私,因此默认禁用实际调用。 - 运行效果已在 **百度网盘 / Slides** 展示(见下文),用于说明功能与界面,不依赖本仓库直接连外网。 --- ## 📚 目录 - 📌 重要声明(必读) - 🧾 项目简介(含技术栈) - 🎬 效果展示(驾驶舱 & 后台截图) - 📈 服务等级目标(SLO) - 📂 模块与阅读路线 - 🏗️ 架构设计(运行时视图) - 🗃️ 目录结构(示例) - 🧩 关键方案:RabbitMQ 异步化 & 抗洪峰 - 📘 使用须知(合规·不可运行·私有演示·FAQ·License) - 👤 Author --- ## 🧾 项目简介 本项目基于 **RuoYi-Cloud v3.6.6** 二次开发,目标是打造一个**多厂商机器人集成调度系统**:统一接入不同厂商 OpenAPI(以**高仙(Gaussian Robotics)**为例),提供任务编排、地图/分区管理、状态监控与可观测性。 为确保安全与合规,当前仓库以**示例代码结构**为主,聚焦工程拆分、网关与业务层设计、限流/降级与可观测性接入方式。 --- ## 主要能力(示例代码侧重) - **多厂商适配层**:封装第三方 OpenAPI(以高仙为例),抽象设备/指令与状态模型,屏蔽协议/字段差异。 - **任务编排与异步受理**:临时/循环任务的受理改为 **202 Accepted + taskId**,状态稳定查询;失败进入 **DLQ** 便于回溯。 - **资产与运行视图**:设备列表与在线状态、地图/分区清单,任务进度与异常联动(Demo 数据)。 - **网关治理**:统一路由聚合,**限流/熔断/降级**,黑白名单与基础鉴权挂点;读写分流的返回策略示例。 - **可观测性闭环**:全链路 **TraceId 贯通**(Gateway → Service → MQ → 厂商 OpenAPI),日志↔链路互查。 - **配置与灰度**:Nacos 作为服务发现与配置中心,按环境下发开关/阈值,支持规则热更新。 - **安全与合规**:公开仓库仅保留接口/DTO/骨架,**不包含**可运行地址与任何密钥,避免误连真实设备。 - **代码组织与可读性**:API/Service/Adapter 分层清晰,接口契约与命名统一,便于替换厂商或扩展能力。 --- ## 技术栈(结构演示) - **后端框架** - Java 17 · **Spring Boot** - **Spring Cloud Alibaba**:Gateway(路由/治理)、OpenFeign(服务间调用) - 校验与序列化:Spring Validation、Jackson(按需) - **中间件与数据** - **RabbitMQ**:Topic→Queue→DLQ;手动 ack、幂等键(`X-Request-Id`) - **Redis**:任务状态与幂等缓存(TTL),热点数据缓存 - **MySQL**:基础配置/业务表(示例不附带可用连接) - **Nacos**:服务发现与配置下发 - **可观测性** - **SkyWalking**:OAP + UI;服务上报 Trace,日志携带 TraceId 做关联检索 - 统一日志:Logback(示例埋点) - **前端与交付** - **ruoyi-ui(Vue 2.x)** 作为后台管理界面 - **Nginx** 静态托管/反向代理(驾驶舱 Demo 与后台) - **接口契约(示例约定)** - 接口返回:**202 + taskId**(受理成功),查询接口返回 `PENDING|DONE|FAILED` - 命名规范:`Exchange=robot.task.topic`、`DLQ=robot.task.dlq` 等 - 观测透传:`TraceId` 通过 Header 贯穿全链路 --- ## 🎬 效果展示 - **百度网盘(脱敏截图打包)**: [https://pan.baidu.com/s/11KPn1tRsMa1jslKZIbxPTA?pwd=xgbp](https://pan.baidu.com/s/11KPn1tRsMa1jslKZIbxPTA?pwd=xgbp) - **Google Slides(示意流程与界面)**: [https://docs.google.com/presentation/d/1I7oIYdUIYdgaCM-MY_42yEG9jm_DSXGXnCeFv1YzYWM/](https://docs.google.com/presentation/d/1I7oIYdUIYdgaCM-MY_42yEG9jm_DSXGXnCeFv1YzYWM/) > 网盘/Slides展示了机器人列表、状态监控、地图/分区与任务下发等界面与流程(截图均已脱敏/打码)。 ### 后台 · 机器人管理 Web 机器人管理示意 ### 园区驾驶舱(3D 场景) 园区驾驶舱示意 **主要视图** - 任务态势:临时/循环任务的批量下发与进度 - 设备分布:区域化检索、利用率热力 - 异常联动:告警→任务/设备视图联动 - 3D 场景:园区模型与路线演示(Demo 数据) **观测闭环** - 驾驶舱事件与后台链路(Gateway → Service → MQ → 厂商 OpenAPI)共享 TraceId,便于从“点到因”回溯链路。 > 目标:面向园区的一张图态势;展示设备在线、任务流转、地图分区/位姿与告警联动。 > 说明:本仓库展示**演示数据/截图**;真实联调与运行效果见《Project Appendix.pdf》。 **主要视图** - 任务态势:临时/循环任务的地图叠加与进度 - 设备分布:区域在线数、利用率/热力 - 告警联动:异常点位与处置流程示意 - 3D 场景:园区模型与路径演示(Demo 数据) **观测闭环** - 驾驶舱事件与后台链路(Gateway → 服务 → MQ → 厂商 OpenAPI)共享 TraceId,便于从“点图回溯”到日志/链路。 --- ## 📈 服务等级目标(SLO) - 状态查询 `/external/gs/status/**`:成功率 ≥ **99.9%**;P95 **< 300ms**(P99 **< 800ms**) - 地图列表 `/maps/list/**`:成功率 ≥ **99.9%**;P95 **< 400ms** - 任务下发(异步受理) `/external/gs/task/**`:受理成功率 ≥ **99.5%**;受理 P95 **< 1s** - WebSocket 恢复:**99% < 3s** > 统计口径:HTTP 非 5xx + 业务 `code==0` 计成功;**策略性 429(限流命中)不计失败**,单独作为容量与阈值校准指标。 > 细则见:[`docs/SLO.md`](./docs/SLO.md) ## 📂 模块与阅读路线 | 模块 | 作用 | 关键目录/类 | 顺序 | |---|---|---|---| | ruoyi-gateway | 路由与治理(限流/熔断/鉴权钩子) | filters/, routes/ | 1 | | ruoyi-robot-gs | 厂商适配与业务骨架 | openapi/, service/ | 2 | | ruoyi-common-* | 日志、Redis、Swagger 等 | ruoyi-common-swagger 等 | 3 | | ruoyi-system | 系统服务 | controller/, service/ | 4 | **阅读路线**:`/gsrobot` → `ruoyi-api` → `ruoyi-gateway` → Sentinel 规则 ## 🏗️ 架构设计(运行时视图)
Robot Management Platform Architecture
*图例* - **实线**:请求 / 调用  **虚线**:服务发现 / 配置 / 遥测 - **蓝**:入口 **绿**:服务 **橙**:数据/基础设施 **灰**:可观测 **粉**:外部 **要点** - User/Browser → **Nginx** → **Spring Cloud Gateway**(统一路由/治理) - Gateway → **RuoYi-System** / **RuoYi-Robot Adapter**(厂商 OpenAPI 聚合) - **Nacos**:服务发现 + 配置;**MySQL/Redis**:配置/缓存 - **SkyWalking**:服务上报 Trace 到 OAP,UI 查询展示 - **Gaussian OpenAPI**:外部厂商接口(HTTPS) ## 🗃️ 目录结构(示例) ~~~ com.ruoyi ├── ruoyi-ui // 前端框架 [80] ├── ruoyi-gateway // 网关模块 [8080] ├── ruoyi-auth // 认证中心 [9200] ├── ruoyi-api // 接口模块 │ └── ruoyi-api-system // 系统接口 │ └── ruoyi-api-robot // 机器人接口 ├── ruoyi-common // 通用模块 │ └── ruoyi-common-core // 核心模块 │ └── ruoyi-common-datascope // 权限范围 │ └── ruoyi-common-datasource // 多数据源 │ └── ruoyi-common-log // 日志记录 │ └── ruoyi-common-redis // 缓存服务 │ └── ruoyi-common-seata // 分布式事务 │ └── ruoyi-common-security // 安全模块 │ └── ruoyi-common-sensitive // 数据脱敏 │ └── ruoyi-common-swagger // 系统接口 ├── ruoyi-modules // 业务模块 │ └── ruoyi-robot-gs // 机器人管理 │ └── ruoyi-system // 系统模块 [9201] │ └── ruoyi-gen // 代码生成 [9202] │ └── ruoyi-job // 定时任务 [9203] │ └── ruoyi-file // 文件服务 [9300] ├── ruoyi-visual // 图形化管理模块 │ └── ruoyi-visual-monitor // 监控中心 [9100] ├──pom.xml // 公共依赖 ~~~ ## 🗂 代码可读指南 - 入口页面:`/gsrobot`(前端路由示例) - 厂商适配:`ruoyi-robot` 模块的 `openapi/` 与 `service/` 包(接口与实现骨架) - 网关规则:`ruoyi-gateway` 的路由与过滤器示例 - 限流/降级:Sentinel 注解与示例规则(已脱敏) --- ## 🧩 关键方案:RabbitMQ 异步化 & 抗洪峰 - 设计:接入 RabbitMQ,建立异步任务通道(Topic→Queue→DLQ),**手动 ack** 与**幂等校验** - 协议:接口改为 **202 Accepted**,返回 taskId,客户端轮询查询;峰值时从容削峰 - 配置:由 Nacos 下发 MQ 参数,问题可在 DLQ 快速回溯 **受理—查询(示意)** ```http POST /external/gs/async/robot/command/tempTask → 202 Accepted {taskId} GET /external/gs/async/tasks/{taskId} → PENDING | DONE | FAILED ``` **拓扑(命名一致,便于控制台校验)** - `Exchange=robot.task.topic`(topic) → `Queue=robot.task.q` - `DLX=robot.task.dlx` → `DLQ=robot.task.dlq`(`rk=#`) - `RoutingKey=robot.task.dispatch` **消费策略** - 手动 `ack`;异常 `nack(requeue=false)` → 直达 **DLQ** - 参考配置:`concurrency=2`,`prefetch=20`(最多 40 in-flight) - 生产端 `confirm/return` + `mandatory=true`(路由失败可见) **幂等 & 结果缓存** - 幂等键:请求头 `X-Request-Id` → `robot:idem:{id}`(默认 TTL 3600s) - 任务状态:`robot:task:{taskId}`(默认 TTL 86400s)用于查询接口 **消息模型(示例)** ```json { "taskId": "c34c7980...f1b7", "requestId": "rq-0002", "type": "GS_TEMP_TASK", "payload": {"...": "..."} } ``` 验证方式(见配套 PDF) POST /external/gs/async/robot/command/tempTask → 返回 status=202 与 taskId GET /external/gs/async/tasks/{taskId} → PENDING → DONE/FAILED 异常场景可在 DLQ 查看失败消息 --- ## 📘 使用须知(合规·不可运行·私有演示·FAQ·License) ### 🚫 不包含的内容 - Nacos 可用配置、任何密钥/凭据(如 clientId/clientSecret/openAccessKey、JWT Secret、数据库/Redis 账号等)。 - 可运行的外部地址:真实 `baseUrl`、内网 IP/网关、设备序列号、地图/公司/地理信息等。 - 任何可直接触发真实设备的实现(仅保留方法位与接口骨架)。 ### ℹ️ 为什么默认不可运行 - 避免误调用真实机器人或第三方 API。 - 公有仓库无法安全托管外网地址与密钥,因此**移除了所有运行所需配置**。 - 涉及厂商协作内容仅为占位/示意,真实接入需在私有环境按规范配置并完成回归。 ### 🧪 私有环境试跑(仅供你自己) - 自备 **Nacos / 环境变量** 注入第三方参数和测试密钥;使用**非生产设备**。 - 在隔离网络中部署网关与服务,并配置**限流/熔断/降级与回退**。 - **勿**将任何密钥或可用配置提交回此仓库。 ### ❓ FAQ - **Q:为什么默认不可运行?** **A:** 为避免触发真实设备/生产 API,已移除运行所需配置。 - **Q:能否在本地沙箱试跑?** **A:** 可以,但需自备 Nacos/测试密钥/测试设备,并在内网沙箱中做好限流/熔断。 - **Q:接受 PR 吗?** **A:** 以展示为主,暂不接受功能型 PR;欢迎文档/安全修订。 ### 📄 License & 免责声明 - 若未特别声明,示例代码建议采用 **Apache-2.0 / MIT**;请在仓库根目录提供匹配的 `LICENSE`。 - 本仓库不对接真实设备;使用者需自行确保合规与安全。 --- ## 👤 作者 陈峥 Jimmy Chen - 领英:https://www.linkedin.com/in/jimmy-chen-74a8182b8/ - Gitee: https://gitee.com/chen-zheng-jimmy - Github: https://github.com/JimmyZChen ---

Smart Park Robot Platform · Code Structure Demo (RuoYi-Cloud v3.6.6)

A vendor‑agnostic robot integration, orchestration & scheduling platform (read‑only sample; non‑runnable by default)

> **What**: a **code structure & design showcase** for a multi‑vendor robot management platform. > **Why**: publicly runnable builds may trigger real devices or leak secrets, so this repo is **non‑runnable by default**. > **Who**: backend / platform / architecture readers (gateway governance, resilience, observability). ## 📚 Table of Contents - 📌 Important Notes (Read First) - 🧾 Overview (with Tech Stack) - 🎬 Showcase (Cockpit & Backend) - 📈 Service Level Objectives (SLO) - 📂 Modules & Reading Path - 🏗️ Architecture (Runtime View) - 🗃️ Project Layout (sample) - 🧩 Key Design: RabbitMQ Async & Peak Shaving - 📘 Usage Notes (Compliance · Non‑runnable · Private demo · FAQ · License) - 👤 Author / Maintainer --- ## 📌 Important Notes (Read First) - This repository focuses on **structure & design**, and is **non‑runnable by default**. - It **does not include Nacos configuration**, any secrets/credentials, or usable external endpoints — all third‑party params are removed or replaced by placeholders. - Reason: the real project integrates robots/production APIs in private environments; exposing runnable configs could **trigger real devices** or leak data. - UI/flows are shown via **Slides / Baidu Netdisk**; they do not require this repository to connect to external services. --- ## 🧾 Overview (with Tech Stack) Built on **RuoYi‑Cloud v3.6.6**, this sample illustrates a **multi‑vendor robot orchestration platform**: unified OpenAPI integration (e.g., **Gaussian Robotics**), task orchestration, maps/partitions, status monitoring, and observability. For safety & compliance, we emphasize **service decomposition, gateway & service layering, rate‑limit/circuit ideas, and observability touchpoints**. --- ## Key Capabilities (code-side focus) - **Vendor adaptation layer**: wrap third-party OpenAPIs (e.g., Gaussian), abstract device/command & state models, hide protocol/field gaps. - **Task orchestration & async acceptance**: ad-hoc/loop tasks accepted as **202 Accepted + taskId**; status polling; failures go to **DLQ** for traceability. - **Assets & runtime views**: device list & online state, map/partition lists, task progress and alert linkage (demo data). - **Gateway governance**: unified routing; **rate-limit / circuit-break / degrade**; allow/deny lists and basic auth hooks; sample response policy for read/write. - **Observability loop**: end-to-end **TraceId propagation** (Gateway → Service → MQ → Vendor OpenAPI), log↔trace correlation. - **Config & rollout**: Nacos for service discovery and config delivery; env-based toggles/thresholds; hot rule updates. - **Security & compliance**: public repo keeps only interfaces/DTOs/skeletons; **no** runnable endpoints or secrets, preventing real-device invocation. - **Code organization & readability**: clear API/Service/Adapter layering; unified contracts & naming; easy to swap vendors or extend features. --- ## Tech Stack (structure demo) - **Backend framework** - Java 17 · **Spring Boot** - **Spring Cloud Alibaba**: Gateway (routing/governance), OpenFeign (service-to-service) - Validation & serialization: Spring Validation, Jackson (as needed) - **Middleware & data** - **RabbitMQ**: Topic→Queue→DLQ; manual ack; idempotency key (`X-Request-Id`) - **Redis**: task status & idempotency cache (TTL), hot data caching - **MySQL**: base config/business tables (sample does **not** ship runnable connections) - **Nacos**: service discovery & config delivery - **Observability** - **SkyWalking**: OAP + UI; services report traces; logs carry TraceId for cross-navigation - Unified logging: Logback (sample markers) - **Frontend & delivery** - **ruoyi-ui (Vue 2.x)** as the admin UI - **Nginx** for static hosting / reverse proxy (cockpit demo & admin) - **API contract (sample conventions)** - Response: **202 + taskId** (accepted), query returns `PENDING|DONE|FAILED` - Naming: `Exchange=robot.task.topic`, `DLQ=robot.task.dlq`, etc. - Trace propagation: `TraceId` forwarded via headers end-to-end --- ## 🎥 Demo - **Google Slides (flows & UI mock)**: https://docs.google.com/presentation/d/1I7oIYdUIYdgaCM-MY_42yEG9jm_DSXGXnCeFv1YzYWM/ - **Baidu Netdisk (redacted screenshots)**: https://pan.baidu.com/s/11KPn1tRsMa1jslKZIbxPTA?pwd=xgbp > Slides/Netdisk include robot list, status monitoring, map/partition views, and temporary task dispatch flows (all screenshots redacted/anonymized). ### Backend · Robot Management Web Robot Management ### Park Cockpit (3D Scene) Park Cockpit (3D) **Key Views** - Ad‑hoc/loop task dispatch & progress tracking - Regional device distribution & utilization - Alarm → task/device view linkage - Campus 3D & route demo (demo data) **Observability Loop** - Cockpit events and backend chain (Gateway → Service → MQ → Vendor OpenAPI) share the same TraceId. --- ## 📈 Service Level Objectives (SLO) - Status query `/external/gs/status/**`: Success ≥ **99.9%**; P95 **< 300ms** (P99 **< 800ms**) - Map list `/maps/list/**`: Success ≥ **99.9%**; P95 **< 400ms** - Task dispatch (async acceptance) `/external/gs/task/**`: Acceptance success ≥ **99.5%**; P95 **< 1s** - WebSocket recovery: **99% < 3s** > Measurement: HTTP non‑5xx **and** business `code==0` count as success; **intentional 429** (rate‑limit) is excluded and tracked separately. > Details: [`docs/SLO.md`](./docs/SLO.md) --- ## 🏗️ Architecture (Runtime View)
Robot Management Platform Architecture
*Legend* - **Solid**: Request/Call  **Dashed**: Discovery/Config/Telemetry - **Blue**: Entry **Green**: Services **Orange**: Data/Infra **Gray**: Observability **Pink**: External **Highlights** - User/Browser → **Nginx** → **Spring Cloud Gateway** (unified routing/governance) - Gateway → **RuoYi-System** / **RuoYi-Robot Adapter** (vendor OpenAPI aggregation) - **Nacos**: service discovery + config; **MySQL/Redis**: config/cache - **SkyWalking**: services report traces to OAP; UI for exploration - **Gaussian OpenAPI**: external vendor API (HTTPS) --- ## 📂 Project Layout (sample) ~~~ com.ruoyi ├── ruoyi-ui // Frontend framework [80] ├── ruoyi-gateway // API Gateway module [8080] ├── ruoyi-auth // Authentication center [9200] ├── ruoyi-api // API modules │ └── ruoyi-api-system // System APIs │ └── ruoyi-api-robot // Robot APIs ├── ruoyi-common // Common modules │ └── ruoyi-common-core // Core module │ └── ruoyi-common-datascope // Data scope │ └── ruoyi-common-datasource // Multi-datasource │ └── ruoyi-common-log // Logging │ └── ruoyi-common-redis // Cache service │ └── ruoyi-common-seata // Distributed transactions │ └── ruoyi-common-security // Security module │ └── ruoyi-common-sensitive // Data masking │ └── ruoyi-common-swagger // Swagger/OpenAPI support ├── ruoyi-modules // Business modules │ └── ruoyi-robot-gs // Robot management │ └── ruoyi-system // System service [9201] │ └── ruoyi-gen // Code generator [9202] │ └── ruoyi-job // Scheduled jobs [9203] │ └── ruoyi-file // File service [9300] ├── ruoyi-visual // Visual management modules │ └── ruoyi-visual-monitor // Monitoring center [9100] ├── pom.xml // Parent POM / common dependencies ~~~ --- ## 🧩 Key Design: RabbitMQ Asynchrony & Peak-Shaving - **Design**: integrate RabbitMQ and build an async task channel (Topic → Queue → DLQ) with **manual ack** and **idempotency checks**. - **Contract**: APIs return **202 Accepted** with a `taskId`; the client polls for status. Burst traffic is smoothed. - **Config**: MQ parameters are delivered via Nacos; failures can be quickly traced in the DLQ. **Acceptance → Query (example)** ```http POST /external/gs/async/robot/command/tempTask → 202 Accepted {taskId} GET /external/gs/async/tasks/{taskId} → PENDING | DONE | FAILED ``` **Topology (consistent naming for easy console verification)** - `Exchange=robot.task.topic`(topic) → `Queue=robot.task.q` - `DLX=robot.task.dlx` → `DLQ=robot.task.dlq`(`rk=#`) - `RoutingKey=robot.task.dispatch` **Consumer policy** - Manual ack; on exception nack(requeue=false) → goes directly to **DLQ** - Reference settings: concurrency=2, prefetch=20 (up to 40 in-flight) - Producer confirm/return + mandatory=true (routing failures observable) **Idempotency & result cache** - Idempotency key: request header X-Request-Id → robot:idem:{id} (default TTL 3600s) - Task status: robot:task:{taskId} (default TTL 86400s) for the query API **Message model (sample)** ```json { "taskId": "c34c7980...f1b7", "requestId": "rq-0002", "type": "GS_TEMP_TASK", "payload": {"...": "..."} } ``` Verification (see Appendix PDF) POST /external/gs/async/robot/command/tempTask → returns status=202 with taskId GET /external/gs/async/tasks/{taskId} → PENDING → DONE/FAILED Abnormal cases can be inspected in the DLQ to locate failed messages. --- ## 📘 Usage Notes (Compliance · Non‑runnable · Private demo · FAQ · License) ### 🚫 Not Included - Nacos configs; any secrets/credentials (e.g., `clientId/clientSecret/openAccessKey`, JWT secrets, DB/Redis accounts). - Usable external endpoints: real `baseUrl`, internal IPs/domains, device serials, map/company/geo data. - Any implementations that could trigger real actions (we keep interface & skeleton only). ### ℹ️ Why Non‑runnable - To prevent accidental calls to real robots or production APIs. - Public repos can’t safely host secrets/internal endpoints, so **all runtime configs are removed**. - Vendor‑related parts are placeholders; real access must be configured & verified in private environments. ### 🧪 Private Sandbox Try (for you only) - Bring your own Nacos/env vars & **non‑production devices/keys**. - Deploy inside an isolated network; configure **rate‑limit/circuit‑break & fallbacks**. - **Never** commit keys or usable configs back to this repo. ### ❓ FAQ - **Why non‑runnable?** To avoid triggering real devices/APIs; runtime configs were removed. - **Can I try locally?** Yes, inside a private sandbox with your configs/devices and proper governance. - **Do you accept PRs?** Showcase‑first; no feature PRs for now. Docs/security fixes are welcome. ### 📄 License & Disclaimer - Unless otherwise stated, code can be under **Apache‑2.0 / MIT**. Provide a matching `LICENSE` at repo root. - This repo does not control real devices. Use it legally and safely in your environment. --- ## 👤 Author / Maintainer Chen Zheng - Linkedin:https://www.linkedin.com/in/jimmy-chen-74a8182b8/ - Github: https://github.com/JimmyZChen - Gitee: https://gitee.com/chen-zheng-jimmy