大模型远程控制LED

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. 附录一:成果展示

alt text

结论,RTIO REST-Like特性(比如立即返回设备调用结果),使LLM通过MCP(Model Context Protocol)远程控制设备极为简单,甚至可直接通过LLM生成MCP-Server代码。