目录
1. 说明
本文分享使用LLM Chat工具远程控制LED,基于MCP(Model Context Protocol)协议通信,设备端采用ESP32-C6-DevKitC-1开发板。本文与前篇 基于RTIO远程控制LED实验的部分步骤相同,只是用户端不再使用curl,而是通过LLM(作为Assistant)对设备进行控制。
整体架构图如下图。
+-------+ +----------+ +--------+ +--------+
| |--->|MCP-Server|--->| RTIO |--->|ESP32-C6|
| Chat | +----------+ +--------+ +--------+
| or |
| Agent | +----------+
| |--->| LLM-APIs |
+-------+ +----------+
2. 硬件及环境设置
设备端硬件及系统开发环境设置,可参考 基于RTIO远程控制LED-硬件及环境设置 。
3. 实验步骤
3.1. 服务端运行
docker run -it --entrypoint ./rtio \
--rm -p 17017:17017 -p 17917:17917 registry.cn-guangzhou.aliyuncs.com/rtio/rtio:v0.8.0 \
-disable.deviceverify -disable.hubconfiger \
-enable.hub.tls \
-hub.tls.certfile ./certificates/demo_server.crt \
-hub.tls.keyfile ./certificates/demo_server.key \
-log.level info
使用WSL对外进行服务,需要设置防火墙、端口映射到WSL,参考基于RTIO远程控制LED-WSL网络配置 。
3.2. 设备端编译和运行
可参考 基于RTIO远程控制LED-设备端编译 进行编译和运行。
3.3. 配置MCP Server
可通过多种MCP Host工具集成MCP Server,下面使用fast-agent进行演示。fast-agent详细使用可参考fast-agent官网。
如下为fastagent.config.yaml,
- 在
mcp.servers
下增加rtio_led_switch
配置项; - RTIO_DEVICE_URL - 为RTIO服务地址和设备ID。
mcp:
servers:
rtio_led_switch:
command: "npx"
args: ["-y", "@mkrainbow/rtio-led-switch-demo"]
env:
RTIO_DEVICE_URL: "http://localhost:17917/cfa09baa-4913-4ad7-a936-3e26f9671b10"
注意在agent.py中增加rtio_led_switch
项。
# Define the agent
@fast.agent(instruction="You are a helpful AI Agent", servers=["rtio_led_switch", "memory"])
async def main():
# use the --model command line switch or agent arguments to change model
async with fast.run() as agent:
await agent.interactive()
3.4. 与LLM聊天
提示词(Prompts):
- Turn LED on via RTIO service.
- Turn LED off via RTIO service.
以下为与LLM对话展示。也可参考附录一:成果展示。
设备在线:
$ uv run agent.py
default > Turn LED on via RTIO service.
╭────────────────────────────────────────────────────── (default) [USER] ─╮
│ │
│ Turn LED on via RTIO service. │
│ │
╰─ gemma3-4b turn 1 ──────────────────────────────────────────────────────╯
╭─ [ASSISTANT] (default) ─────────────────────────────────────────────────╮
│ │
│ the assistant requested tool calls │
│ │
╰─ [rtio_led_switch] [memory] ───────────────────────────────────────────╯
╭─ [TOOL CALL] ───────────────────────────────────────────────────────────╮
│ │
│ {"value":"on"} │
│ │
╰─ [rtio_led_sw…] ───────────────────────────────────────────────────────╯
╭───────────────────────────────────────────────────────── [TOOL RESULT] ─╮
│ │
│ meta=None content=[TextContent(type='text', text='{"code":"OK"}', │
│ annotations=None)] isError=False │
│ │
╰─────────────────────────────────────────────────────────────────────────╯
╭─ [ASSISTANT] (default) ─────────────────────────────────────────────────╮
│ │
│ The LED has been turned on. │
│ │
╰─ [rtio_led_switch] [memory] ───────────────────────────────────────────╯
default > Turn LED off via RTIO service.
╭────────────────────────────────────────────────────── (default) [USER] ─╮
│ │
│ Turn LED off via RTIO service. │
│ │
╰─ gemma3-4b turn 2 ──────────────────────────────────────────────────────╯
╭─ [ASSISTANT] (default) ─────────────────────────────────────────────────╮
│ │
│ the assistant requested tool calls │
│ │
╰─ [rtio_led_switch] [memory] ───────────────────────────────────────────╯
╭─ [TOOL CALL] ───────────────────────────────────────────────────────────╮
│ │
│ {"value":"off"} │
│ │
╰─ [rtio_led_sw…] ───────────────────────────────────────────────────────╯
╭───────────────────────────────────────────────────────── [TOOL RESULT] ─╮
│ │
│ meta=None content=[TextContent(type='text', text='{"code":"OK"}', │
│ annotations=None)] isError=False │
│ │
╰─────────────────────────────────────────────────────────────────────────╯
╭─ [ASSISTANT] (default) ─────────────────────────────────────────────────╮
│ │
│ The LED has been turned off. │
│ │
╰─ [rtio_led_switch] [memory] ───────────────────────────────────────────╯
设备离线:
default > Turn LED on via RTIO service.
╭────────────────────────────────────────────────────── (default) [USER] ─╮
│ │
│ Turn LED on via RTIO service. │
│ │
╰─ gemma3-4b turn 7 ──────────────────────────────────────────────────────╯
╭─ [ASSISTANT] (default) ─────────────────────────────────────────────────╮
│ │
│ the assistant requested tool calls │
│ │
╰─ [rtio_led_switch] [memory] ───────────────────────────────────────────╯
╭─ [TOOL CALL] ───────────────────────────────────────────────────────────╮
│ │
│ {"value":"on"} │
│ │
╰─ [rtio_led_sw…] ───────────────────────────────────────────────────────╯
╭───────────────────────────────────────────────────────── [TOOL RESULT] ─╮
│ │
│ meta=None content=[TextContent(type='text', │
│ text='{"code":"DEVICEID_OFFLINE"}', annotations=None)] isError=False │
│ │
╰─────────────────────────────────────────────────────────────────────────╯
╭─ [ASSISTANT] (default) ─────────────────────────────────────────────────╮
│ │
│ I'm unable to control the LED device at this time. It appears to be │
│ offline. │
│ │
╰─ [rtio_led_switch] [memory] ───────────────────────────────────────────╯
4. 附录一:成果展示
结论,RTIO REST-Like特性(比如立即返回设备调用结果),使LLM通过MCP(Model Context Protocol)远程控制设备极为简单,甚至可直接通过LLM生成MCP-Server代码。