核心结论:安信可 PalChat 系列(V1/V2)支持 MCP(模型上下文协议),工程师只需写几十行 C 代码,就能让 AI 模型直接控制硬件设备。V1 基于 Ai-WB2-12F,适合快速验证;V2 基于 Ai-M61-32S,新增屏幕、支持多 AI 平台,MCP 参数类型也更丰富。两款都把"AI 理解人话→执行设备操作"这条链路做成了开箱即用的能力。
最近两年,AI 大模型的能力进步飞快,但有一个问题一直没解决好:模型怎么控制真实的物理设备?
传统方案里,工程师要自己写一套"语义解析→指令映射→设备控制"的逻辑。用户说"把灯调暗一点",设备要能听懂这句话,还要知道"暗一点"是把 PWM 调低多少——这中间有很多脆弱的对应关系需要人工维护。
MCP(Model Context Protocol,模型上下文协议)换了一个思路:让 AI 直接调用你定义的工具函数。你告诉 AI "有个叫 Light 的工具,能开关灯",AI 就会在用户说"关灯"的时候,直接调用这个工具,传入参数 enabled=false,你的回调函数处理剩下的事情。
换句话说,MCP 把设备控制从"自然语言解析"变成了"函数调用"。前者很难维护,后者是工程师最熟悉的模式。
MCP 是 Anthropic 提出的开放协议,目前已被多个 AI 平台支持。安信可将其集成进 PalChat 系列 SDK,开发者不需要自己对接协议层,只需要关注工具的定义和回调实现。
在聊 MCP 功能之前,先把两款产品的差异说清楚,避免选错。
| 对比项 | PalChat V1 | PalChat V2 |
|---|---|---|
主控模组 | Ai-WB2-12F | Ai-M61-32S |
屏幕 | 无 | 1.69 寸 TFT 彩屏 |
AI 平台支持 | 小智 AI | 小智 AI + 火山引擎 |
语音打断 | 支持离线唤醒 | 插话打断 + 唤醒词打断 |
供电 | Type-C / 电池 | Type-C / 电池 |
MCP 参数类型 | 布尔型、数值型 | 布尔型、数值型、字符串型 |
开发文件位置 | SDK 内自定义 | user_mcp_tools.c / .h |
适合场景 | 快速原型验证、开源项目 | 产品级开发、多平台集成 |
两款都支持 MCP,但 V2 的 MCP 能力更完整——特别是新增了字符串类型参数,意味着你可以传"播放古典音乐"这类文本型指令,而不只是开关和数字。
不管是 V1 还是 V2,MCP 工具的开发逻辑是一致的:
用 mcp_server_tool_t 结构体描述你的工具:叫什么名字、干什么事、接受什么参数。
mcp_server_tool_t light_tool = {
.name = "Light",
.description = "控制是否打开灯光",
.setRequestHandler = light_set_callback, // 控制回调
.checkRequestHandler = light_check_callback, // 查询回调
.inputSchema = { ... } // 参数定义
};
一行代码把工具加进去:
mcp_server_add_tool_to_toolList(&light_tool);
写两个函数:一个处理"控制",一个处理"查询"。
// 控制回调:AI 说"关灯"时触发
returnValues_t light_set_callback(void *params) {
bool enabled = get_bool_param(params, "enabled");
gpio_set_level(LIGHT_PIN, enabled ? 1 : 0);
return MCP_SUCCESS; // 0 = 成功
}
// 查询回调:AI 问"灯开着吗"时触发
void light_check_callback(void *params) {
bool state = gpio_get_level(LIGHT_PIN);
set_response_bool("enabled", state);
}
这三步完成后,用户对着 PalChat 说"打开灯",AI 就会调用 light_set_callback,传入 enabled=true,灯就亮了。你不需要写任何自然语言解析的代码。
错误码规范:V1/V2 均统一使用 0 表示成功,-32602 表示参数错误。回调函数里记得处理异常,避免设备进入未定义状态。
两款的 MCP 架构一致,差异主要体现在参数类型和开发结构上。
| 参数类型 | V1 支持 | V2 支持 | 典型用途 |
|---|---|---|---|
BOOLEAN | 开关控制、状态查询 | ||
NUMBER | 音量、亮度、温度等数值 | ||
STRING | 模式名称、播放列表、文本指令 |
字符串类型的加入,让 V2 能处理更复杂的语义。比如"切换到睡眠模式"——这个"睡眠"是个字符串,V1 没法原生传递,V2 可以直接把 "sleep" 传进回调函数,你的设备再根据字符串值做对应的操作。
V1 的 MCP 工具开发在 SDK 内灵活定义;V2 则固定了开发入口:
固定的文件结构对团队协作更友好——新人知道去哪里找代码,代码审查也更容易。
V1 目前对接小智 AI;V2 额外支持火山引擎语音平台。两者的 MCP 接口兼容,切换 AI 平台不需要重写工具代码,只改配置就行。
做过传统语音控制的工程师都知道有多麻烦:
有了 MCP,这些全省了。你只需要关心两件事:工具怎么定义(说清楚 AI 能用什么功能),以及回调怎么写(功能触发了做什么)。自然语言的理解交给 AI 模型,指令的分发交给 MCP 协议,你只管设备控制逻辑。
量化对比:传统方案下,一个"灯光 + 音量 + 模式切换"三功能语音控制系统,关键词枚举 + 逻辑处理大约需要 300-500 行代码,且随产品迭代持续膨胀。用 MCP 实现同样功能,工具定义 + 回调函数约 80-120 行,后续新增功能只需追加工具,不影响已有逻辑。
两款 PalChat 的 SDK 里内置了两个示例工具,可以直接参考:
最简单的布尔控制场景。用户说"开灯"或"关灯",AI 调用工具,传入 enabled 参数。
| 要素 | 内容 |
|---|---|
| 工具名称 | Light |
| 属性 | enabled(布尔型)— 当前灯光状态 |
| 控制方法 | SetEnabled(true=开,false=关) |
| 触发语句示例 | "打开灯光" / "关灯" / "灯开着吗?" |
数值型参数场景。用户说"把音量调到 70",AI 解析出 70 这个数字,直接传入。
| 要素 | 内容 |
|---|---|
| 工具名称 | Speaker |
| 属性 | volume(数值型,0-100)— 当前音量 |
| 控制方法 | SetVolume(传入 0-100 整数) |
| 触发语句示例 | "音量调到50" / "声音小一点" / "现在音量多少?" |
这两个示例覆盖了 MCP 里最常见的两种参数类型。实际开发时,基于这两个例子做扩展,能快速上手。
两款都支持 MCP,硬件差异决定了适用场景不同。
经验建议:如果你的产品控制点超过 5 个,或者涉及模式切换这类"文本型"指令,直接上 V2。V2 的字符串参数类型和规范化开发结构,在产品迭代时会省很多麻烦。
PalChat 的 MCP 工具数量受 MCP_SERVER_TOOL_NUMBLE_LEN 这个常量限制(V2 文档中有提及)。实际上,一个中等复杂的智能家居产品——灯光、窗帘、温度、模式、音乐——五个工具就能覆盖大部分控制需求,不会遇到上限问题。
更重要的是,MCP 协议本身是开放的,工具的能力边界取决于你的回调函数写了什么。灯光控制是一个工具,调用外部 HTTP API 可以是另一个工具,读取传感器数据同样可以包装成工具。只要能写成函数的操作,都能接进 MCP。
安信可官方也列出了参考资料:
PalChat V1 和 V2 都把 MCP 做成了开箱即用的能力:三步开发流程、两个内置示例、标准化的回调接口。对工程师来说,最直接的价值是省掉了自然语言解析这层复杂度,让设备控制回归到熟悉的"函数定义 + 参数处理"模式。
两款的核心差异在于:V1 轻量、适合验证;V2 更完整,多了屏幕、字符串参数类型、多 AI 平台支持。项目处于探索期,选 V1;准备做成产品,选 V2。
MCP 这条路,安信可铺好了基础设施。剩下的,就是你的设备要做什么了。这正是"安信可,可安心"的意思——底层的通信和协议对接已经帮你做完,你只管专注产品逻辑。
全部0条评论
快来发表一下你的评论吧 !