黑客松
这是我们为Anthropic Gradio MCP的第一个生日黑客马拉松提交的一部分:https://huggingface.co/spaces/MCP-1st-Birthday/Vehicle-Diagnostic-Assistant
此存储库涵盖了AI Agent。我们也在黑客马拉松中开发了MCP服务器,您可以在此处访问:https://github.com/castlebbs/Embedded-MCP-ELM327
项目概述
对于第二次黑客马拉松,我们决定玩得开心,并创建了一个直接连接到您的汽车并帮助您诊断问题的AI代理。
对于这个项目,我们做了:
- AI代理和聊天机器人执行汽车诊断
- 诊断MCP服务器,我们直接安装在OBD-II设备上。
大多数汽车都有一个OBD-II端口,可以让诊断设备与汽车的计算机通信。机械师将他们的扫描仪连接到这个端口,以读取汽车健康信息,并找出警告灯亮起的原因。
上面是我们使用的OBD-II加密狗,我们不得不打开它,用我们的特殊黑客马拉松固件替换固件☺️
HuggingFace空间上的演示正在连接到OBD-II _模拟器_ (我们不希望每个人都弄乱我们的车:-)。有趣的是,模拟器也是一个Gradio空间: OBD-II模拟器Gradio空间
如果您想了解更多关于我们如何在诊断设备上实现MCP服务器的详细信息,请导航到“嵌入式设备上的MCP服务器”选项卡。
查看我们对上一次活动的参与情况: 游戏中AI生成3D环境.
______________________________________________________________________
技术架构
系统概述
车辆诊断助手由三个主要部件组成:
- Gradio Web界面 -面向用户的聊天界面,支持流式响应
- LangChain/LangGraph代理 -协调工具调用和AI推理
- MCP 服务器 -通过模型上下文协议提供车辆诊断功能
User → Gradio UI → LangGraph Agent → MCP Tools → OBD-II Device → Vehicle ECU
↓
AI Model (Nebius/Anthropic)
↓
Additional Tools (YouTube, VIN decoder, calculators)组件详情
1.AI代理(app.py)
代理人使用 LangGraph 对于支持流媒体的有状态会话管理:
- 模型:可配置的LLM后端:
- Nebius AI(Qwen3-Coder-480B,Llama-3.3-70B,DeepSeek-R1)
- 检查点:InMemorySaver用于会话状态持久化
- 消息流:通过工具调用跟踪逐个令牌流式传输
- 会话管理:使用UUID进行基于线程的对话隔离
代理配置:
agent = create_agent(
model=model,
system_prompt=system_prompt,
tools=all_tools,
checkpointer=checkpointer,
)2.MCP服务器集成
运输:基于HTTP的流媒体协议(streamable_http) 协议:基于HTTP的JSON-RPC 2.0 端点:
- 物理设备:
http://192.168.10.69/mcp - 模拟器:
https://castlebbs-elm327-simulator.hf.space/gradio_api/mcp/
可用的MCP工具:
get_system_status-MCP服务器状态信息send_elm327_command-原始ELM327 AT命令和OBD-II PID查询get_history-历史PID数据检索
3.自定义工具(tools.py)
代理可以访问专门的处理工具:
OBD-II数据处理:
hex_to_decimal(hex_value)-将十六进制响应转换为十进制combine_bytes(byte_a, byte_b, byte_c, byte_d)-多字节值组合(大端序)calculate_obd_value(formula, bytes)-应用OBD-II公式(例如。,(A*256+B)/4RPM)
车辆信息:
decode_vin(vin)-通过NHTSA vPIC API查找VINsearch_youtube_video(query)-维修教程搜索
安全特性:
safe_eval()-沙盒公式计算(无任意代码执行)- 有限运营商:
+, -, *, /, //, %, **, unary +/- - 指数限制和除零保护
4.嵌入式MCP服务器(W600-B800固件)
硬件平台:
- 微控制器:WinnerMicro W600-B800
- RTOS:自由
- 网络堆栈:lwIP
- 通信:UART到ELM327芯片(38400波特,8N1)
固件功能:
- OTA(空中下载)固件更新
- 用于远程调试的UDP系统日志
- ELM327协议驱动程序,带模拟模式
- MCP端点的HTTP服务器
- JSON-RPC 2.0请求处理程序
协议栈:
MCP Client (Agent) → HTTP Request → JSON-RPC 2.0 → MCP Method Router → Tool Handlers → ELM327 Driver → UART → ELM327 Chip → CAN Bus → Vehicle ECUOBD-II协议
OBD-II(车载诊断II) 是一种标准化的车辆诊断协议:
- PID(参数ID):传感器数据的标准化代码(例如。,
01 0C发动机转速) - DTC(故障诊断码):格式为P0XXX、C0XXX、B0XXX、U0XXX的错误代码
- 模式:
- 模式01:当前数据 - 模式02:冻结帧数据 - 模式03:存储的DTC - 模式04:清除故障诊断码 - 模式09:车辆信息(VIN)
ELM327:工业标准OBD-II解释器芯片,将UART命令转换为CAN/ISO协议。
______________________________________________________________________
安装和设置
先决条件
- Python 3.8+
- pip包管理器
- 访问OBD-II设备或模拟器
安装步骤
- 克隆仓库:
git clone
cd Vehicle-Diagnostic-Assistant- 安装依赖项:
pip install -r requirements.txt- 配置API密钥:
- 对于Nebius AI:设置 NEBIUS_API_KEY 环境变量
- 配置MCP服务器端点 在
app.py:
"url": "http://192.168.10.69/mcp", # Physical device
# or
"url": "https://castlebbs-elm327-simulator.hf.space/gradio_api/mcp/", # Simulator- 启动应用程序:
python app.pyDocker部署
docker-compose up --build______________________________________________________________________
用法示例
基本车辆诊断
示例1:检查发动机状态
User: "Get system information"
Agent: [Calls get_system_status tool] → Shows information about the ELM327 MCP server.示例2:读取发动机转速
User: "What's my current RPM?"
Agent: [Calls send_obd2_command with PID 01 0C] → "41 0C 1A F8"
Agent: [Calls combine_bytes + calculate_obd_value] → "1710 RPM"示例3:解码VIN
User: "Decode VIN 5TDKRKEC7PS142916"
Agent: [Calls decode_vin tool] → Returns make, model, year, engine specs示例4:诊断错误代码
User: "I have a P0420 code, what does it mean?"
Agent: [Analyzes DTC] → "Catalyst System Efficiency Below Threshold"
Agent: [Calls search_youtube_video] → Returns repair tutorial link高级用法
自定义PID计算:
# The agent can calculate any OBD-II PID using formulas
# Example: Fuel pressure (PID 01 0A)
calculate_obd_value("A * 3", byte_a="4F") # Returns 237 kPa历史数据分析:
# Retrieve historical PID data collected by the MCP server
get_history(pid="01 0C", limit=10) # Last 10 RPM readings______________________________________________________________________
依赖项
Python包(requirements.txt)
langchain # LLM framework
langchain[anthropic] # Anthropic Claude support (optional)
langchain_nebius # Nebius AI integration
langchain-mcp-adapters # MCP protocol adapters
gradio # Web UI framework
youtube-search # YouTube API wrapper嵌入式固件依赖关系
- WinnerMicro W600 SDK -FreeRTOS、lwIP、外围设备驱动程序
- EasyLogger -针对UDP syslog支持进行了修改
- 自定义库:
- elm327.c -ELM327协议驱动程序 - mcp_http.c -MCP的HTTP服务器 - mcp_jsonrpc.c -JSON-RPC 2.0实现 - mcp_methods.c -MCP工具处理程序
______________________________________________________________________
开发说明
系统提示设计
代理使用中定义的系统提示 prompts.py.
DTC显示部件
这 dtc_display.py 模块提供了一个自定义的Gradio组件,用于呈现故障诊断码,该组件具有:
- 颜色编码的严重程度(红色表示严重,黄色表示警告)
- 描述和可能原因
- 建议维修
流媒体架构
代理通过以下方式实现逐个令牌的流式传输:
- 实时工具调用可视化
- 部分工具调用的参数累积
- 多个工具的并发消息跟踪
- 带有加载指示器的流畅用户体验
使用模拟器进行测试
Gradio OBD-II模拟器提供:
- 没有真实车辆的模拟ECU响应
- 可配置的发动机参数
- DTC注入用于测试诊断工作流程
- 安全的发展环境
______________________________________________________________________
技术规格
通信协议
| 层 | 协议 | 详细信息 |
|---|---|---|
| 应用程序 | MCP(模型上下文协议) | 工具调用接口 |
| RPC | JSON-RPC 2.0 | 请求/响应格式 |
| 传输 | HTTP。 | 可流式传输HTTP |
| 车辆 | OBD-II | ISO 15765-4(CAN)、ISO 9141-2、ISO 14230-4 |
| 解释器 | ELM327 | AT命令集 |
| 物理 | UART | 38400波特,8N1 |
支持的OBD-II PID
代理可以查询任何标准PID,包括:
- 01 00:支持PID\[01-20\]
- 01 0C:发动机转速
- 01 0天:车辆速度
- 01 05:发动机冷却液温度
- 01 0F:进气温度
- 01 11:油门位置
- 01 10:MAF空气流量
- 01 0E:时间提前
- 01 2F:燃油箱液位
- 09 02:车辆识别码(VIN)
错误处理
- MCP连接故障:带有错误消息的优雅降级
- 工具超时:具有重试逻辑的20秒超时
- 无效响应:十六进制验证和格式检查
- 除以零:在所有计算工具中都受到保护
- JSON-RPC格式错误:根据规范的错误代码响应
______________________________________________________________________
团队
- @stargarnet:人工智能试剂开发
- @castlebbs:MCP服务器和嵌入式固件
AI积分赞助商
- Nebius代币工厂
技术栈
前端和代理:
- Gradio 6-交互式网络界面
- LangChain/LangGraph-代理编排
- Nebius AI/人类克劳德-语言模型
后端工具:
- MCP服务器(嵌入OBD-II加密狗或模拟器中)
- 系统状态监控 - ELM327命令执行 - OBD-II PID查询 - 历史数据检索
- OBD-II响应解码工具
- 十六进制转换实用程序
- NHTSA vPIC VIN解码器
- YouTube搜索集成
嵌入式系统:
- WinnerMicro W600-B800微控制器
- FreeRTOS+lwIP
- 自定义ELM327驱动器
- HTTP/JSON-RPC服务器
______________________________________________________________________
项目结构
Vehicle-Diagnostic-Assistant/
├── app.py # Main Gradio application
├── tools.py # Custom LangChain tools
├── prompts.py # System prompts for the agent
├── dtc_display.py # DTC rendering component
├── requirements.txt # Python dependencies
├── docker-compose.yml # Docker deployment config
├── Dockerfile # Container build instructions
├── styles.css # Custom UI styling
│
├── assets/ # Images and media
│ ├── obd.png # Hardware photos
│ ├── agent.png # UI screenshots
│ └── probes.png # Firmware upload setup
│
├── MCP_servers/
│ └── gradio-OBD2-simulator/ # Simulator MCP server
│ ├── app.py # Gradio simulator interface
│ └── README.md # Simulator documentation
│
├── hackathon_detail.md # Hackathon submission details
├── mcp_server_detail.md # Embedded firmware documentation
└── LICENSE # Project license关键文件说明
app.py:主要应用程序入口点。初始化LangGraph代理,连接到MCP服务器,处理流式聊天界面tools.py:定义用于十六进制转换、字节组合、OBD-II计算、VIN解码和YouTube搜索的自定义工具prompts.py:包含系统提示,为代理提供车辆诊断知识dtc_display.py:自定义Gradio组件,用于呈现带有颜色编码的故障诊断码mcp_server_detail.md:嵌入式固件实施的完整技术文档
______________________________________________________________________
故障排除
常见问题
MCP服务器连接失败
- 验证设备是否已通电并连接到Wi-Fi
- 检查IP地址是否与配置匹配
- 确保防火墙允许端口80上的HTTP流量
- 先用模拟器测试:
https://castlebbs-elm327-simulator.hf.space/gradio_api/mcp/
车辆无响应
- 确保车辆点火开关打开(发动机不需要运转)
- 检查OBD-II加密狗是否完全插入车辆端口
- 验证ELM327芯片是否响应AT命令
- 尝试重置ELM327:发送
ATZ命令
刀具超时错误
- 增加超时时间
app.py:"timeout": 30.0 - 检查MCP服务器的网络延迟
- 验证车辆ECU是否响应(尝试不同的PID)
十六进制值无效
- 确保响应格式正确(空格分隔的十六进制字节)
- 检查ELM327的“无数据”或错误响应
- 验证车辆是否支持PID(
01 00查询)
______________________________________________________________________
许可证
此项目根据LICENSE文件中指定的条款获得许可。
