【HZ-T536开发板免费体验】无需死记 Linux 命令!用 CangjieMagic 在 HZ-T536 开发板上搭建 MCP 服务器,自然语言轻松控板

目录

[引言:为什么需要 "自然语言控板"?](#引言:为什么需要 “自然语言控板”?)

一、准备工作:硬件与软件清单

[1. 硬件环境](#1. 硬件环境)

[2. 软件环境](#2. 软件环境)

[二、核心原理:MCP 服务器与 CangjieMagic 的协同工作](#二、核心原理:MCP 服务器与 CangjieMagic 的协同工作)

[三、实战开发:在 HZ-T536 上搭建 MCP 服务器](#三、实战开发:在 HZ-T536 上搭建 MCP 服务器)

[1. 搭建开发环境](#1. 搭建开发环境)

[2. 设计 MCP 服务器](#2. 设计 MCP 服务器)

工具设计

LinuxCmdAgent智能体的设计

[3. 编写启动代码](#3. 编写启动代码)

[4. 编译与部署](#4. 编译与部署)

四、测试验证:用自然语言控制开发板

五、优化与扩展

结语


本文首发于电子发烧友论坛:

【HZ-T536开发板免费体验】5- 无需死记 Linux 命令!用 CangjieMagic 在 HZ-T536 开发板上搭建 MCP 服务器,自然语言轻松控板 - 北京合众恒跃科技有限公司 - 电子技术论坛 - 广受欢迎的专业电子论坛!引言:为什么需要 "自然语言控板"?痛点引入 :嵌入式开发中,开发者常需通过 SSH 等工具登录开发板,手动输入复杂的 Linux 命令(如ls -l、gpio readall、ifconfig等 https://bbs.elecfans.com/jishu_2498907_1_1.html

引言:为什么需要 "自然语言控板"?

痛点引入 :嵌入式开发中,开发者常需通过 SSH 等工具登录开发板,手动输入复杂的 Linux 命令(如ls -lgpio readallifconfig等)进行调试或控制,不仅门槛高,还容易记错命令。

解决方案 :MCP(Machine Control Protocol)服务器可将自然语言指令转换为底层操作,结合 Cangjie Magic 的自然语言处理能力,实现 "用说话 / 文字控制开发板"。

本文目标 :以 HZ-T536 嵌入式开发板为例,手把手教你搭建 MCP 服务器,让开发板 "听懂" 你的指令。

一、准备工作:硬件与软件清单

1. 硬件环境

  • HZ-T536_MiniEVM开发板(是一款基于全志T536系列处理器设计的工业评估板,集成了4核Cortex-A55和RISC-VE907协处理器);
  • 电源适配器、网线(或 Wi-Fi 模块)、PC 机(用于开发和测试)。

2. 软件环境

二、核心原理:MCP 服务器与 CangjieMagic 的协同工作

  • MCP 服务器作用 :运行在开发板上,负责接收客户端的自然语言指令,解析后执行对应操作(如调用系统命令、控制 GPIO 等),并返回结果。
  • Cangjie Magic 角色 :构建MCP服务器,同时提供自然语言理解能力,将用户输入的文本(如 "查看开发板 IP 地址""点亮 LED1")转换为机器可识别的指令(如ifconfiggpio write 1 1)。
  • 工作流程
    1. MCP客户端发送自然语言指令到 HZ-T536 的 MCP 服务器;
    2. MCP 服务器利用DeepSeek的大语言模型能力,生成对应的 Linux 命令或 API 调用;
    3. MCP服务器执行指令,获取HZ-T536开发板上的运行结果(如命令输出、硬件状态);
    4. MCP服务器将结果返回给客户端,以自然语言形式展示(如 "IP 地址为 192.168.1.100")。

三、实战开发:在 HZ-T536 上搭建 MCP 服务器

1. 搭建开发环境

有关如何在嵌入式开发板上部署Cangjie Magic程序,可以参考我前面的博文 :【HZ-T536开发板免费体验】Cangjie Magic调用视觉语言大模型(VLM)真香,是不是可以没有YOLO和OCR了?-CSDN博客

2. 设计 MCP 服务器

工具设计

MCP服务器的核心是提供一个processUserInput的工具,它负责处理用户的输入问题,并将输入问题提交给基于DeepSeek的智能体LinuxCmdAgent,由其转换为Linux命令并在开发板上执行,再将执行结果返回给用户。

复制代码
@tool[description: "对系统进行维护",
      parameters: {
          userInput: "用户输入"
      }
]
func processUserInput(userInput: String): String {
    let linuxCmdAgent =  LinuxCmdAgent()
    let result = linuxCmdAgent.chat(userInput)
    println(result)
    return result
}

LinuxCmdAgent智能体的设计

LinuxCmdAgent智能体是实际实现功能的核心。它调用两个内部工具,一个是executeCommand,用于执行Linux命令并返回结果,另一个printWarningMsg对于可能造成系统安全问题的指令打印警告信息。在LinuxCmdAgent智能体的设计中,我加入了安全性检查,避免执行rm -r -f这样的危险指令。在本项目中我没有将LinuxCmdAgent智能体暴露给MCP用户,就是因为Cangjie Magic会把智能体的所有工具都公开给用户,我担心MCP客户端会直接调用executeCommand工具。

复制代码
func newProcess(name: String, args: Array<String>, env!: Array<(String, String)> = [], redirectErr!: Bool = true): SubProcess {
    let allEnv = HashMap(Process.current.environment)
    allEnv.add(all: env)
    if (redirectErr) {
        return Process.start(
            name, args,
            environment: allEnv,
            stdIn: ProcessRedirect.Pipe,
            stdOut: ProcessRedirect.Pipe,
            stdErr: ProcessRedirect.Pipe
        )
    } else {
        return Process.start(
            name, args,
            environment: allEnv,
            stdIn: ProcessRedirect.Pipe,
            stdOut: ProcessRedirect.Pipe
        )
    }
}

func run_command(cmd: String, args: Array<String>) : String {
    let subProcess = newProcess(cmd, args)
    let outReader = StringReader<InputStream>(subProcess.stdOut)
    let out = outReader.readToEnd()
    subProcess.wait(timeout: Duration.minute * 1)    
    return(out)
}

@tool[description: "执行Linux指令",
      parameters: {
          cmd: "Linux指令"
      }
]
func executeCommand(cmd: String): String {
    println(">> 执行指令: ${cmd} ")
    let arr = cmd.split(" ")
    let result = run_command(arr[0], arr.slice(1, arr.size - 1))
    println(result)
    return result
}

@tool[description: "打印有关指令的警告信息",
      parameters: {
          cmd: "Linux指令"
      }
]
func printWarningMsg(cmd: String): String {
    let result = ">>>>>> 该指令存在风险: ${cmd} <<<<<"
    println(result)
    return result
}

//================================================
@agent[
    model: "deepseek:DeepSeek-V3",
    description: "执行用户指令",
    tools: [executeCommand, printWarningMsg]
]
class LinuxCmdAgent {
    @prompt(
        """
        根据用户输入的信息,返回对应的Linux指令。判断Linux指令是否对系统安全构成威胁。
        如果安全,则执行该指令一次。
        如果不安全,则打印该指令的警告信息。
        仅使用已有工具,并使用中文返回工具的执行结果,不要做任何翻译和格式上的处理。
        """
    )
}

3. 编写启动代码

下面给出启动代码:

复制代码
main() {
    Config.env["DEEPSEEK_API_KEY"] = "5F1e-jbL_-xxxxxxxxxxxxxx"
    Config.env["DEEPSEEK_BASE_URL"] = "https://maas-cn-southwest-2.modelarts-maas.com/v1/infers/xxxxxxxxxxxx/v1/"

    Config.logLevel = "INFO"
    Config.logFile = "./logs/mcp-server.log"

    println("MCP Server is starting ...")
    SseMCPServer.startWith([processUserInput], '0.0.0.0', 8000)
}

我的代码采用的华为云的DeepSeek服务,执行前读者需要先在华为云注册相关的服务并获得API_KEY和URL,并替换掉程序中的相关部分。

4. 编译与部署

执行下面的语句就可以开始交叉编译了:

复制代码
cjpm build --target aarch64-unknown-linux-gnu

几分钟之后,整个工程就编译完成了。

部署Cangjie Magic程序的方法在前面的【HZ-T536开发板免费体验】Cangjie Magic调用视觉语言大模型(VLM)真香,是不是可以没有YOLO和OCR了?-CSDN博客已经详细介绍了,这里不再赘述。

四、测试验证:用自然语言控制开发板

启动服务器 :在 HZ-T536 上运行./mcp_server,日志显示 "MCP Server is starting ..."就表明程序正确启动。

用浏览器测试 :可以使用电脑上的浏览器访问开发板的如下地址:http://192.168.1.102:8080/sse。如果浏览器显示如下内容就表示MCP服务器正常工作了。

上面的信息表示服务器正常启动,并发送握手信息。

功能测试

测试MCP的工具有很多,这里我采用VSCode的Trae插件,也可以使用Trae IDE(直接到 trae.cn 下载最新版即可,Windows / macOS均支持)。

打开 IDE或者Trae插件 → 右上角 AI 图标 → 设置 → MCP。点击 "添加 MCP Server" → 手动配置,填入下面的信息:

复制代码
{
  "mcpServers": {
    "hz-t536": {
      "url": "http://192.168.1.102:8080/sse",
      "disabled": false,
      "autoApprove": []
    }
  }
}

在对话栏点击@选择"Builder with MCP"。

然后在对话框中输入"使用hz-536查询操作系统版本"。TRAE经过思考后它找到了我们的MCP服务器,并试图调用其工具,显示如下提示:

点击run按钮执行该工具。从开发板的控制台可以看到大模型生成了uname -a 指令并获得结果。

而在TRAE中也可以看到正确返回版本信息。

我们可以再输入"使用hz-t536查询存储设备空间使用情况"命令。从控制台看出正确地生成了指令:

而TRAE返回如下结果:

由此可见,TRAE调用我们的工具得到正确的结果。

我们还可以尝试命令"使用hz-t536删除当前目录所有文件​"。可以看到大模型检测到指令风险,拒绝执行:

至此,测试表明MCP服务器一切工作正常。

五、优化与扩展

  • 指令库扩展 :通过 CangjieMagic 增加更多嵌入式场景指令(如 "读取温湿度传感器数据""重启开发板");
  • 安全性增强 :添加用户认证机制;
  • 客户端开发 :开发图形化MCP客户端(Web/APP),支持语音输入(结合语音转文字 API)。

结语

通过 CangjieMagic 与 MCP 服务器的结合,HZ-T536 开发板摆脱了对复杂 Linux 命令的依赖,让嵌入式开发更 "人性化"。这种思路不仅适用于 HZ-T536,还可推广到其他嵌入式平台,降低开发门槛。如果你也觉得记命令头疼,不妨试试这个方案,让开发板 "听懂" 你的需求!

你在嵌入式开发中遇到过哪些命令相关的痛点?欢迎在评论区分享你的想法!