AI语音智能体开发日记(五)为智能设备注入“灵魂”——详解MCP工具的注册与使用
相关链接AI语音智能体开发日记一如何为“小智”服务器启用并调试 License 功能-CSDN博客AI语音智能体开发日记二解决 Wi-Fi 配网小程序的兼容性问题-CSDN博客AI语音智能体开发日记三解决小程序配网中的蓝牙命名与MAC地址获取问题-CSDN博客AI语音智能体开发日记四在FreeRTOS中构建线程安全的UART2通信模块-CSDN博客AI语音智能体开发日记五为智能设备注入“灵魂”——详解MCP工具的注册与使用-CSDN博客AI语音智能体开发日记六为智能体注入旋律——七牛云音乐服务的接入与避坑指南-CSDN博客AI语音智能体开发日记七搞定功放控制——详解GX8006平台Mute电平配置-CSDN博客推荐链接AI语音智能体架构解析一系统架构全景图-CSDN博客AI语音智能体架构解析二大模型AI 的大脑-CSDN博客AI语音智能体架构解析三智控台指挥中心-CSDN博客AI语音智能体架构解析四AI 语音终端执行器官-CSDN博客AI语音智能体架构解析五小程序/APP遥控器-CSDN博客推荐链接AI 应用 图文 解说 (一) -- 百度智能云 实现 语音 聊天-CSDN博客AI 应用 图文 解说 (二) -- 百度智能云 ASR LIM TTS 语音AI助手程序 -CSDN博客开发手记为智能设备注入“灵魂”——详解MCP工具的注册与使用在嵌入式开发中硬件驱动是设备的“躯体”而业务逻辑则是其“灵魂”。今天我们来深入探讨一下lightning项目中如何通过MCPMachine Control Protocol工具系统将简单的硬件指令封装成可供上层应用调用的、具有明确语义的功能模块。这个过程主要围绕project/ln_model_public/app/servers/qiniu/mcp_server/mcp_tools/smart_toilet/mcp_tools.c文件展开可以分为三个核心步骤定义工具语义、实现指令函数、以及注册工具。第一步定义工具语义 (Mcp的语义定义)MCP工具的核心思想是将一个功能抽象成一个结构体。这个结构体不仅包含了功能的名称更重要的是定义了它的自然语言描述和参数规范让AI或上层应用能够“理解”这个功能是做什么的以及如何使用它。以控制机械狗前进的mcp_tool_dog_forward为例1// 文件: mcp_tools.c 2 3const mcp_tool_t mcp_tool_dog_forward { 4 // 1. 工具的唯一标识名 5 .name dog.action.forward, 6 7 // 2. 工具的自然语言描述用于AI理解 8 .description 靠近的类似词语认为是前进控制机械狗向前行走。可指定持续时间单位秒例如‘向前3秒’。如果不指定时间默认前进1秒。最大支持10秒。, 9 10 // 3. 关联的处理函数 11 .call dog_forward_handler, 12 13 // 4. 是否在独立任务中执行对于有延时的操作必须为true 14 .call_in_task true, 15 16 // 5. 定义工具的参数列表 17 .properties { 18 { 19 .name duration, // 参数名 20 .type kPropertyTypeInteger, // 参数类型整数 21 .has_min_value true, // 是否有最小值 22 .min_value 1, // 最小值为1秒 23 .has_max_value true, // 是否有最大值 24 .max_value 10 // 最大值为10秒 25 }, 26 { .name NULL } // 参数列表结束标志 27 } 28};通过这样的定义一个名为dog.action.forward的工具就拥有了清晰的“身份”它知道自己是干什么的description需要什么参数properties以及具体由哪个函数来执行call。第二步实现指令函数 (Mcp工具指令函数)定义好语义后就需要实现具体的业务逻辑。dog_forward_handler函数就是mcp_tool_dog_forward的执行体。1// 文件: mcp_tools.c 2 3static cJSON *dog_forward_handler(mcp_property_t *args, int args_count) 4{ 5 int duration_sec 1; // 默认1秒 6 7 // 1. 解析参数遍历传入的参数列表查找名为 duration 的参数 8 for (int i 0; i args_count; i) { 9 mcp_property_t *prop args[i]; 10 if (strcmp(prop-name, duration) 0 prop-type kPropertyTypeInteger) { 11 duration_sec prop-value.ival; // 获取参数值 12 break; 13 } 14 } 15 16 // 2. 业务逻辑将秒转换为毫秒并进行FreeRTOS延时 17 int duration_ms duration_sec * 1000; 18 LOG(LOG_LVL_INFO, [MCP] Dog forward for %d seconds (%d ms)\r\n, duration_sec, duration_ms); 19 20 // 模拟前进动作例如通过UART发送指令 21 uint8_t cmd_buf[5] {0x55, 0x01, 0x00, 0x00, 0xAA}; // 示例指令帧 22 for(int i 0; i duration_sec * 10; i) { 23 // 构造并发送“前进”指令 24 cmd_buf[1] 0x02; 25 cmd_buf[4] cmd_buf[0] cmd_buf[1] cmd_buf[2] cmd_buf[3]; // 计算校验和 26 safe_cmd_uart_write((char*)cmd_buf, 5); 27 vTaskDelay(pdMS_TO_TICKS(100)); // 延时100ms 28 } 29 30 // 模拟停止动作 31 cmd_buf[1] 0x00; 32 cmd_buf[4] cmd_buf[0] cmd_buf[1] cmd_buf[2] cmd_buf[3]; 33 safe_cmd_uart_write((char*)cmd_buf, 5); 34 35 LOG(LOG_LVL_INFO, [MCP] Dog stop\r\n); 36 return NULL; 37}这个函数清晰地展示了MCP工具的执行流程参数解析从args数组中安全地提取出duration参数的值。逻辑执行根据参数值执行具体的硬件操作。在这里它通过一个循环持续调用我们之前实现的safe_cmd_uart_write函数向外部设备发送“前进”指令并在结束后发送“停止”指令。第三步注册工具 (Mcp的语义注册)定义和实现都完成后最后一步是将这些工具“注册”到MCP核心系统中使其生效。这个过程在mcp_tools_register_all函数中完成。1// 文件: mcp_tools.c 2 3static int mcp_tools_register_all(void) 4{ 5 int result 0; 6 // 将所有定义好的工具通过 mcp_core_register_tool 函数逐一注册 7 result | mcp_core_register_tool(mcp_tool_device_get_status); 8 result | mcp_core_register_tool(mcp_tool_device_set_volume); 9 // ... 其他工具 ... 10 result | mcp_core_register_tool(mcp_tool_dog_forward); // 注册“前进”工具 11 result | mcp_core_register_tool(mcp_tool_dog_backward); // 注册“后退”工具 12 result | mcp_core_register_tool(mcp_tool_dog_turn_left); // 注册“左转”工具 13 result | mcp_core_register_tool(mcp_tool_dog_turn_right); // 注册“右转”工具 14 // ... 更多工具 ... 15 16 return result; 17}这个函数就像一个总控开关在系统初始化时被调用将我们定义的所有“狗”的动作前进、后退、左转、右转等以及其他设备功能获取状态、设置音量等全部添加到MCP的工具列表中。总结通过“定义语义 - 实现函数 - 注册工具”这三步我们成功地将底层的硬件操作如UART通信封装成了一个个高级的、语义化的MCP工具。这种设计模式的优势非常明显高内聚低耦合每个工具都是一个独立的模块职责单一。易于扩展增加新功能时只需按照同样的模式定义、实现并注册一个新的工具即可无需修改核心框架。AI友好清晰的自然语言描述和参数定义为AI理解和调用设备功能提供了标准化的接口。这不仅是代码的组织方式更是一种让嵌入式设备变得更“智能”、更易于集成的优秀架构思想。

相关新闻

今天不升级AI协作方法,明天就被淘汰:2024Q2行业协作效能预警报告(附自检清单)

今天不升级AI协作方法,明天就被淘汰:2024Q2行业协作效能预警报告(附自检清单)

更多请点击: https://kaifayun.com 第一章:AI协作效能危机的底层逻辑 当团队将Copilot、Cursor或自研AI助手深度嵌入日常开发流程后,代码提交频率上升37%,但线上缺陷密度反而增长21%——这并非工具失效,而是人机协作范…

2026/10/10 15:45:18 阅读更多 →
单片机毕设选题推荐:基于 STM32/51 单片机的水质多参采集声光报警系统开发 单片机控制的水体浊度温度可视化检测终端设计(021601)

单片机毕设选题推荐:基于 STM32/51 单片机的水质多参采集声光报警系统开发 单片机控制的水体浊度温度可视化检测终端设计(021601)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/10/10 16:30:33 阅读更多 →
OpenAI财报泄露背后:AI大模型的成本困境与行业影响分析

OpenAI财报泄露背后:AI大模型的成本困境与行业影响分析

1. 从一份“泄露”的财报说起:我们看到了什么?最近,一份据称是OpenAI的内部财务数据在圈内流传开来,核心信息相当炸裂:这家全球最受瞩目的AI公司,可能在短短三个月内就烧掉了高达37亿美元,而年化…

2026/9/30 19:47:25 阅读更多 →

最新新闻

基于PJ85718DM与STM32F407ZG的HVAC本地与远程温度监测方案

基于PJ85718DM与STM32F407ZG的HVAC本地与远程温度监测方案

1. 从一颗温度传感器说起:为什么HVAC场景对测温链路如此挑剔做过嵌入式暖通空调(HVAC)项目的人都有一个共识:温度采集看起来是最简单的活儿,实际上是最容易翻车的地方。一颗传感器、一根走线、一段ADC采样代码&#xf…

2026/10/10 20:39:25 阅读更多 →
显示器无信号排查逻辑树:从线缆到GPU的七段式故障定位

显示器无信号排查逻辑树:从线缆到GPU的七段式故障定位

1. 这不是故障,是信号链路上的一次“失联”——为什么“无信号”最让人抓狂“显示器显示无信号输出”这八个字,几乎刻在每个用电脑的人的神经末梢上。它不像蓝屏那样带着悲壮的仪式感,也不像死机那样有明确的停滞点,而是一种安静的…

2026/10/10 20:39:25 阅读更多 →
基于PJ85718DM与PIC18F56K42的嵌入式温度监测系统设计与实现

基于PJ85718DM与PIC18F56K42的嵌入式温度监测系统设计与实现

1. 项目缘起与整体设计思路嵌入式温度监测这件事,说起来简单,做起来全是细节。我最早接触这类需求是在一个环境控制类项目里,当时的要求很朴素:本地要能看到实时温度,远程也要能拿到数据,而且整套东西得稳定…

2026/10/10 20:39:25 阅读更多 →
2026年配音工具怎么选?我用免费配音软件配完一套课程旁白,顺手把TaoToken接进工作流

2026年配音工具怎么选?我用免费配音软件配完一套课程旁白,顺手把TaoToken接进工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 20:39:25 阅读更多 →
订单超时自动关闭方案:从Spring Boot定时任务到XXL-JOB分片实践

订单超时自动关闭方案:从Spring Boot定时任务到XXL-JOB分片实践

做电商后端时间长了,订单自动关闭这个功能可以说每个系统都会遇到。用户下单之后一直不付款,订单不能永远挂在“待支付”状态,库存不能一直锁着,客服也不可能半夜爬起来人工关单。订单超时自动关闭就是在这种背景下成为电商系统的…

2026/10/10 20:39:24 阅读更多 →
Lean 4形式化数学:黎曼-霍奇-BSD三大猜想的机器可读重构

Lean 4形式化数学:黎曼-霍奇-BSD三大猜想的机器可读重构

1. 项目概述:这不是论文轰炸,而是一次数学表达范式的悄然迁移“OpenAI一夜甩出722篇数学论文”——这个标题在科技圈和数学圈同时炸开,但如果你真去点开那些PDF,会发现一个反直觉的事实:它们绝大多数不是人类意义上的“…

2026/10/10 20:38:23 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →