|
1 | | -# 知乎 / 公众号 长文(中文) |
| 1 | +# 知乎 / 微博短文(中文,500 字内) |
2 | 2 |
|
3 | | -## 标题候选 |
| 3 | +## 标题 |
4 | 4 |
|
5 | | -1. **DCP:让 LLM 安全控制 1 美元单片机的开源协议**(推荐) |
6 | | -2. **MCP 不下沉的地方,我们做了一个新协议:DCP** |
7 | | -3. **LLM 调用硬件,该有的安全原语都不应该是 application code** |
8 | | - |
9 | | -## 摘要(发文时填到顶部) |
10 | | - |
11 | | -> Anthropic 的 MCP 解决了 LLM 调 SaaS 工具的标准化问题,但**故意不下沉到嵌入式硬件**——这是他们 2026 roadmap 明确的选择。 |
12 | | -> |
13 | | -> 我们开源了 **DCP (Device Context Protocol)**,把"LLM ↔ 物理设备"这最后一米的标准做出来。已经在 ESP32-WROOM-32 上端到端验证通过,Claude Desktop 真能调动一颗 1 美元单片机上的灯。 |
14 | | -> |
15 | | -> 完全互补 MCP,不是替代。 |
16 | | -> |
17 | | -> 仓库:github.com/device-context-protocol/dcp |
| 5 | +**DCP:让 LLM 安全控制 1 美元单片机的开源协议** |
18 | 6 |
|
19 | 7 | ## 正文 |
20 | 8 |
|
21 | | -### 为什么这个东西需要存在 |
22 | | - |
23 | | -我做 IoT 几年了,反复遇到同一个问题:有了 LLM 能写自然语言指令,有了 MCP 能标准化工具调用,但**到设备这一层标准没了**。 |
24 | | - |
25 | | -每个"Arduino MCP 服务器"项目都是 JSON-RPC over WebSocket,塞进一颗 32KB RAM 的 MCU。要么浪费 80% 的资源,要么干脆排除掉 Cortex-M0+ 这种 0.3 美元的便宜芯片——而这恰好是消费级 IoT 真正能 scale 的价位段。 |
26 | | - |
27 | | -另一条路是**自己撸串口协议**。每个项目重新发明帧结构、错误码、能力管理。结果是不能互操作,不能复用工具链,LLM 用起来也很危险——给一个会"幻觉"的调用者直接的 GPIO 控制权,出事是迟早的。 |
28 | | - |
29 | | -### DCP 的定位 |
30 | | - |
31 | | -**一句话**:DCP = MCP 的"最后一米",一个紧凑的二进制协议加上安全原语,让 LLM 能安全地操控便宜的微控制器。 |
32 | | - |
33 | | -``` |
34 | | -LLM ─MCP─▶ Bridge ─DCP wire─▶ Device (<16KB MCU) |
35 | | - │ |
36 | | - └─ 这里负责所有安全检查:capability / range / dry-run / token 验证 |
37 | | -``` |
| 9 | +Anthropic 的 MCP 解决了 LLM 调 SaaS 工具的标准化,**但不下沉到嵌入式**——这是他们 2026 roadmap 明确的选择。 |
38 | 10 |
|
39 | | -中间的 **Bridge** 是唯一的信任边界。LLM 永远看不到裸 GPIO。Bridge 会: |
40 | | -- 验证 capability token(HMAC-SHA256,过期/范围) |
41 | | -- 检查所有参数 range、单位、类型 |
42 | | -- LLM 可以 dry-run("如果我这么做,会发生什么?"),设备不真执行 |
43 | | -- 拦截幻觉调用 —— 比如 LLM 把"调到 50 度"理解成华氏度送到一个摄氏度设备,Bridge 单位检查拦住 |
| 11 | +我开源了 **DCP (Device Context Protocol)**,补这最后一米。**已在 ESP32 上端到端跑通**,Claude 真能直接控住一颗 ¥10 单片机上的灯。 |
44 | 12 |
|
45 | | -设备保持简单。也因此能跑在 32 KB 的 MCU 上。 |
| 13 | +完全互补 MCP,不是替代。 |
46 | 14 |
|
47 | | -### 跟前人的关系 |
| 15 | +### 三个数字 |
48 | 16 |
|
49 | | -- **MCP**:上游,我们用 Bridge 翻译,保证零配置兼容 Claude Desktop / Claude Code |
50 | | -- **IoT-MCP**(arXiv:2510.01260):学术先驱,他们证明 MCP 可以下沉到 74KB peak。**我们走得更远**:14KB 纯协议代码,有安全原语,可生产部署 |
51 | | -- **W3C WoT**:更重的描述层,我们做 wire-format 互补 |
52 | | -- **Matter**:智能家居 vertical,不直接竞争 |
| 17 | +- **19 字节** —— 一次典型调用的 wire 大小(对比 MCP JSON-RPC ~180 字节) |
| 18 | +- **<16 KB** —— firmware 在 ESP32 上的体积目标(实测 14 KB) |
| 19 | +- **88/88 + 10/10** —— Python 单测 + 真机 round-trip 全绿 |
53 | 20 |
|
54 | | -技术对比表完整版在 [docs/RATIONALE.md](https://github.com/device-context-protocol/dcp/blob/main/docs/RATIONALE.md)。 |
| 21 | +### 为什么不是"又一个 IoT 协议" |
55 | 22 |
|
56 | | -### 数字 |
| 23 | +DCP 把 LLM 安全相关的几件事直接做进了**协议层**,不是 application code: |
57 | 24 |
|
58 | | -实测在 ESP32-WROOM-32(CH340 USB 转串口,115200 波特率): |
| 25 | +| | DCP 协议层管 | |
| 26 | +|---|---| |
| 27 | +| 单位歧义(华氏/摄氏)| `unit:` 字段强制声明 | |
| 28 | +| LLM 幻觉出超界参数 | manifest `range:` Bridge 拦截 | |
| 29 | +| LLM 想干超权限的事 | HMAC-SHA256 capability token | |
| 30 | +| 不可逆动作 | `dry_run` 是 wire 格式的一个 bit | |
59 | 31 |
|
60 | | -| 维度 | DCP | 对比 | |
61 | | -|---|---|---| |
62 | | -| 典型 call 帧 | 19 字节 | MCP JSON-RPC ~180 字节 | |
63 | | -| 纯协议代码 | ~14 KB | IoT-MCP 74 KB peak | |
64 | | -| Python 测试 | 88/88 PASS | — | |
65 | | -| 真硬件 round-trip | 10/10 PASS | — | |
66 | | -| 支持的 transport | 5 种(UART/MQTT/BLE/USB-CDC/loopback) | 多数项目 1 种 | |
| 32 | +这 4 件事 90% 的 IoT 协议丢给开发者自己实现,出事率极高。DCP 把它们标准化。 |
67 | 33 |
|
68 | | -### 设计取舍上的几个有意思的点 |
| 34 | +### 架构 |
69 | 35 |
|
70 | | -**1. Bridge 集中安全,设备傻** |
71 | | -违反直觉,但是必要的。如果每个设备自己实现 capability 检查,就会有 10000 种实现,99% 有 bug。把这层抽到 Bridge,设备只管做事。 |
72 | | - |
73 | | -**2. 单位写在 manifest 里** |
74 | | -```yaml |
75 | | -level: { type: float, unit: percent, range: [0, 100] } |
76 | 36 | ``` |
77 | | -LLM 在 tool schema 里直接看到 unit,**从协议层消灭了单位混淆**。比 docstring 写"please use Celsius" 强 100 倍。 |
78 | | -
|
79 | | -**3. dry-run 是 wire format 的一个 bit** |
80 | | -不是约定,不是 payload flag,是协议的 kind 字段(0x81)。LLM 可以发"假装我开锁了,会发生什么"——设备返回预测结果但**不开锁**。对不可逆操作是必需品。 |
81 | | -
|
82 | | -**4. 单一 wire format,跨所有 transport** |
83 | | -UART / MQTT / BLE / USB-CDC 同一份固件,只换 transport 类。**从原型到生产换接口,协议不动**。 |
84 | | -
|
85 | | -### 老实的局限 |
86 | | -
|
87 | | -发布是 **v0.3 draft**,不是 v1.0。诚实列出来: |
| 37 | +LLM ── MCP ──▶ Bridge(唯一可信边界)── DCP wire ──▶ Device |
| 38 | + │ |
| 39 | + ├─ 容量 token 校验 |
| 40 | + ├─ 范围/类型检查 |
| 41 | + └─ dry-run 预演 |
| 42 | +``` |
88 | 43 |
|
89 | | -- 只在一种 MCU 上跑过(ESP32-WROOM-32)。Cortex-M0+ / nRF52840 / RP2040 是 v0.4 的活 |
90 | | -- 跟 IoT-MCP 的实测 A/B 还没做,这是后续 paper 的事 |
91 | | -- 协议 spec 等第二个独立实现(社区贡献的 C 或 Rust 版本)才能 freeze v1.0 |
92 | | -- Wire HMAC 不带 in-band marker,需要部署侧约定——这是有意的(防降级攻击),但配置容易出错 |
| 44 | +Bridge 是个 Python 进程,你的 LLM(Claude/本地模型/其他)说 MCP,Bridge 翻译成 DCP 喊设备。**设备永远收不到 LLM 直发的命令**。 |
93 | 45 |
|
94 | | -### 试一下 |
| 46 | +### 现在能做什么 |
95 | 47 |
|
96 | 48 | ```bash |
97 | | -pip install pydcp[mcp,serial] |
98 | | -dcp serve examples/lamp_manifest.yaml --simulator |
99 | | -# 或者你有 ESP32: |
100 | | -# 烧 firmware/esp32/examples/lamp/lamp.ino |
| 49 | +pip install "pydcp[mcp,serial]" |
101 | 50 | dcp serve examples/lamp_manifest.yaml --serial COM5 |
| 51 | +# 然后 Claude Desktop 加 MCP server,"调灯到 30%" 就生效 |
102 | 52 | ``` |
103 | 53 |
|
104 | | -接 Claude Desktop:在 `claude_desktop_config.json` 加几行 `mcpServers`,问 Claude "把灯调到 30%",真灯真变暗。 |
| 54 | +### 仓库 / 论文 |
105 | 55 |
|
106 | | -仓库: |
107 | | -**[github.com/device-context-protocol/dcp](https://github.com/device-context-protocol/dcp)** |
| 56 | +- 代码 + spec:**github.com/device-context-protocol/dcp**(MIT) |
| 57 | +- Paper 草稿(arXiv 待审):同 repo `/docs/paper/main.pdf` |
108 | 58 |
|
109 | | ---- |
| 59 | +### 我想要的反馈 |
110 | 60 |
|
111 | | -如果你做 IoT、嵌入式 AI、agent 工具链,欢迎来 GitHub issues / discussions 拍砖。最希望的反馈是: |
112 | | -1. **跨平台移植**:谁能在 STM32 / nRF52 / RP2040 上跑通,我请喝奶茶 |
113 | | -2. **第二个独立实现**:Rust 或 C 版本(spec 一页纸,实现量 ~500 行) |
114 | | -3. **真实场景测试**:你手里有什么硬件想接 LLM 的,告诉我哪里 protocol 不够用 |
| 61 | +主要是 spec 设计层的:**有没有看到漏的安全场景?有没有更好的 capability 模型?** |
| 62 | +小修小补走 GitHub issues。 |
| 63 | + |
| 64 | +--- |
115 | 65 |
|
116 | | -MIT 协议,无 CLA,无认证费,无供应商绑定。 |
| 66 | +(图床:配 architecture 图 `arch.png` 在第一段后面) |
0 commit comments