在Trae Solo模式下用Qt HttpServer和Concurrent升级MCP服务器绘制6G互联网覆盖区域

文章目录

  • 一、Qt实现MCP是不是走偏门?
    • [1.1 核心技术实现](#1.1 核心技术实现)
      • [1. 服务器架构设计](#1. 服务器架构设计)
      • [2. Qt HttpServer的使用](#2. Qt HttpServer的使用)
      • [3. Qt Concurrent的并发处理](#3. Qt Concurrent的并发处理)
    • [1.2. MCP协议实现](#1.2. MCP协议实现)
      • [1. 核心方法实现](#1. 核心方法实现)
      • [2. 工具函数注册机制](#2. 工具函数注册机制)
    • [1.3 小回顾:Qt HttpServer+Concurrent好在哪](#1.3 小回顾:Qt HttpServer+Concurrent好在哪)
  • 二、AI调用MCP的应用效果
  • 三、总结
    • [3.1 技术栈对比](#3.1 技术栈对比)
    • [3.2 MCP本身的问题](#3.2 MCP本身的问题)
  • [四 源码链接](#四 源码链接)

一、Qt实现MCP是不是走偏门?

现在,MCP服务器已经非常流行了,很多软件都通过MCP和Skills为AI暴露功能句柄,允许LLM在必要时调用功能,完成对软件工具的操作。纵观网上常见的MCP实现,鲜有Qt的案例。现在AI编程厉害了,前面用对话式AI推导公式,实现算法,现在看看能不能在Trae环境下直接理解调用传统Qt代码,生成MCP的封装。

实验箱目是从传统C++代码改造而来。MCP协议涉及到标准化的JSON结构握手和约定,本次实验,准备继续使用TRAE自动化编程技术。具体的来说:

  1. 使用提示词,让TRAE理解C++的代码。
  2. 在理解C++代码的基础上,Trae Solo模式实现MCP协议的封装。
  3. 人类调试并进行手工微调修改。
  4. 注册MCP,并测试。

最终效果:实现了基于Qt的MCP(Model Context Protocol)服务器。项目包含两个主要MCP服务:

  1. 地理计算MCP服务器(geocalc/mcp/server):提供各种地理坐标转换、距离计算等功能
  2. 地图服务器MCP(qplanetosm/mcp_mapserver):提供地图标记、路径绘制等功能

我们可以通过本文章看到,Qt具有成熟的HttpServer开发能力,可以轻松应对MCP Server的开发需求,并在使用自然语言求解6G天基互联网的基本覆盖问题上实现初步的问答应用。

1.1 核心技术实现

1. 服务器架构设计

MCP服务器采用三层架构:

  • HTTP层:处理HTTP请求和响应
  • MCP协议层:实现MCP协议的各种方法
  • 工具函数层:提供具体的业务功能

2. Qt HttpServer的使用

Qt HttpServer 结合 Concurrent,可以支持极为灵活的线程池并发模型。

在Qt6.10里,HttpServer可以绑定到一个tcp端口,实现多个 httpServer 采用不同的 router ,共享1个端口。这种原理类似 nginx。

服务器初始化

在main函数里,直接开启线程池,新建TCP端口,而后绑定服务器。

cpp 复制代码
// 初始化线程池
QThreadPool * threadPool = new QThreadPool();
threadPool->setMaxThreadCount(16);
threadPool->setExpiryTimeout(3600*24*365);

// 创建TCP服务器
QTcpServer* tcpServer = new QTcpServer();
if (!tcpServer->listen(QHostAddress(addr), port)) {
    // 错误处理
}

// 创建HTTP服务器
QHttpServer* svr = new QHttpServer(threadPool);
if (!svr->bind(tcpServer)) {
    // 错误处理
}

上面的例子里,线程池、TCP服务器、Http服务器是一对一的。实际情况,他们可以是1对多的。

路由配置

为server添加处理路由借点,把/mcp等虚拟路径路由到不同的逻辑处理。注意,在路由处理的逻辑里,直接使用的是QFuture返回值的异步请求。

cpp 复制代码
// 添加OPTIONS端点
server->route(routePath, QHttpServerRequest::Method::Options, [this](QHttpServerResponder& response) {
    QHttpServerResponse rp(QHttpServerResponder::StatusCode::NoContent);
    rp.setHeaders(defautl_Header());
    response.sendResponse(rp);
});

// 添加POST端点
server->route(routePath, QHttpServerRequest::Method::Post, [this, threadPool](const QHttpServerRequest& request) {
    QByteArray array = request.body();
    // 并发处理请求
    return QtConcurrent::run(threadPool,[this, array]() {
        // 处理请求
    });
});

3. Qt Concurrent的并发处理

异步请求通过一个Lambda表达式,捕获局部变量和This指针,实现具体的信息提取和处理逻辑:

异步处理HTTP请求

cpp 复制代码
return QtConcurrent::run(threadPool,[this, array]() {
    // 解析JSON请求
    QJsonParseError parseError;
    QJsonObject jsonObject = QJsonDocument::fromJson(array, &parseError).object();
    if (parseError.error != QJsonParseError::NoError) {
        return error_happened("", "JSON Error", -32700);
    }
    
    // 提取方法名并处理
    QString method = jsonObject["method"].toString();
    // 处理不同类型的请求...
});

1.2. MCP协议实现

1. 核心方法实现

  1. handle_initialize:响应客户端询问服务特性
  2. handle_ping:响应客户端保活请求
  3. handle_toolist:返回可用工具函数列表
  4. handle_tools_call:处理具体工具函数调用
cpp 复制代码
QHttpServerResponse McpServer::handle_initialize(const QJsonObject& jsonObject) {
    QJsonObject capabilities{
      {"tools", QJsonObject({\n          {"listChanged", true}\n        })}
    };
    QJsonObject serverInfo{
      {"name", "geocalc_mcp_server"},
      {"version", "1.0"}
    };
    QJsonObject result{
      {"capabilities", capabilities},
      {"protocolVersion", "2025-03-26"},
      {"serverInfo", serverInfo}
    };
    QJsonObject responseJson{
      {"jsonrpc", "2.0"},
      {"id", jsonObject["id"]},
      {"result", result}
    };
    return send_response(responseJson);
}

2. 工具函数注册机制

为了让MCPServer类变得通用,我们设计了比较通用的功能注册和发布机制。原理是开发一个工具函数,并向MCP服务器注册,实现该函数的自动化发布和调用。

注册工具函数

cpp 复制代码
void McpServer::register_tool_func(QString name, QJsonObject desc,
    std::function<QHttpServerResponse (McpServer* mcpServer, const QJsonObject& objreq) > func)
{
    tool_func_desc_map[name] = desc;
    tool_func_obj_map[name] = func;
}

注册示例

cpp 复制代码
// 注册工具函数
MCP_SERVER::register_toolfunc_lla2ecef(mcpServer);
MCP_SERVER::register_toolfunc_ecef2lla(mcpServer);
MCP_SERVER::register_toolfunc_enu_R_from_lla(mcpServer);
// 更多工具函数注册...

1.3 小回顾:Qt HttpServer+Concurrent好在哪

  • 线程池管理:通过QThreadPool管理线程,避免线程频繁创建销毁的开销
  • 异步处理:使用QtConcurrent::run实现请求的异步处理,提高并发能力
  • 资源利用:合理设置线程池大小(16线程),充分利用系统资源

二、AI调用MCP的应用效果

下一代互联网,是天地一体的互联网,我们就以分析天基互联网卫星的地面覆盖区域和天线主瓣覆盖范围,可视化展示覆盖效果为例子,看看AI

能力如何。

示例对话

复制代码
用户:我有一个卫星,轨道高度901.33千米,星下点经度89.222度,纬度23.4847度。请求取地面覆盖区域,并绘制多边形。
AI:我将使用地理计算MCP服务计算卫星覆盖区域,然后使用地图MCP服务绘制多边形。
AI:调用工具 mcp_Geocalc_MCP_Server_contour_elevation
AI:计算得到72个覆盖区域边界点
AI:调用工具 mcp_mapserver_MCP_Server_update_polygon
AI:覆盖区域绘制成功!已将卫星地面覆盖区域添加到地图中。

可视化效果

  • 半透明蓝色填充的多边形,显示卫星全向覆盖范围
  • 覆盖区域呈现不规则形状,最北点纬度约52.35度,最南点纬度约-5.41度

示例对话

复制代码
用户:这颗卫星上有一个定向天线,姿态角度:Heading为134度,Pitch为-45度,roll为0. 这个天线的方向图主瓣张角为16度,请求取主瓣在地面的覆盖范围。
AI:我将使用地理计算MCP服务计算天线主瓣覆盖范围,然后使用地图MCP服务绘制多边形。
AI:调用工具 mcp_Geocalc_MCP_Server_HPR_Polar_Alpha2LLAs
AI:计算得到73个覆盖区域边界点
AI:调用工具 mcp_mapserver_MCP_Server_update_polygon
AI:天线主瓣覆盖范围绘制成功!已添加到地图中。

可视化效果

  • 半透明红色填充的多边形,显示天线主瓣覆盖范围
  • 覆盖区域呈现扇形,主要覆盖东南亚地区
  • 与星下点标记(黄色圆形)配合,直观展示天线指向

三、总结

使用Qt的HttpServer和Concurrent模块实现MCP服务器,具有以下显著优势:

  1. 高性能:通过线程池和异步处理,实现高并发请求处理
  2. 易扩展:模块化设计和工具函数注册机制,便于功能扩展
  3. 可靠性:完善的错误处理和资源管理,确保服务稳定运行
  4. 标准兼容:完全实现MCP协议,与各种客户端兼容
  5. 开发效率:利用Qt的成熟组件,减少开发工作量

这种实现方式不仅适用于地理计算和地图服务,也可以推广到其他需要高性能RPC服务的场景。通过TRAE自动化编程技术,传统C++代码可以快速转型为现代化的服务架构,提升系统的可维护性和扩展性。

3.1 技术栈对比

技术方案 优点 缺点 适用场景
Qt HttpServer + Concurrent 高性能、跨平台、易于集成 依赖Qt框架 桌面应用、跨平台服务
Node.js + Express 轻量级、生态丰富 单线程性能受限 Web应用、API服务
Python + Flask/FastAPI 开发效率高、库丰富 性能不如C++ 原型开发、数据处理
C++ + Boost.Asio 性能极高、灵活 开发复杂度高 高性能服务、嵌入式系统

3.2 MCP本身的问题

从本实验来看,AI在没有行业背景的时候,对MCP的使用有如下短板:

  1. 对准确的单一功能调用描述,可以很好的识别。但如果笼统的给出需要连续调用4-5个函数的需求,很可能会跑偏。
  2. 输入输出效率差。全靠LLM,尤其是MCPServer返回大量JSON数组时,快速消耗Tokens,等了很久才出结果。
  3. 如果你本身很熟练,建议自己写C++函数来实现功能,说话说半天,有这时间他亚的早就自己撸完了。

因此,MCPServer 擅长:做一件很复杂的很大粒度的事情,比如"帮我炒一盘番茄炒蛋",而后MCPServer里面自己切菜、配料、打鸡蛋、翻炒,上盘。

MCPServer不适合:做小碎步,比如实现切菜、配料、打鸡蛋、翻炒,上盘这种精细的操作。如果你不提供菜谱,别指望它每次都能响应"帮我炒番茄炒蛋"的步骤。

四 源码链接

请参考 gitcode 服务器:

https://gitcode.com/colorEagleStdio/geocalc

https://gitcode.com/colorEagleStdio/qplanetosm

相关推荐
Aawy1201 小时前
C++中的状态模式高级应用
开发语言·c++·算法
笨笨马甲1 小时前
Qt MODBUS协议
开发语言·qt
LFly_ice1 小时前
C# Web 开发从入门到实践
开发语言·前端·c#
勇闯逆流河2 小时前
【Linux】Linux进程概念(进程优先级,进程切换详解)
linux·运维·服务器
穗余2 小时前
java大模型应用开发里的SseEmitter和websocket区别
java·开发语言·人工智能·websocket
好家伙VCC2 小时前
# 发散创新:用 Rust构建高并发虚拟世界引擎核心模块在当今游戏开发与元宇宙构建中,**虚拟世界的性能瓶颈往往不是图形渲染,而是底
java·开发语言·python·rust·图形渲染
Liu628882 小时前
C++中的状态模式
开发语言·c++·算法
smchaopiao2 小时前
使用C语言打印几何图形:从三角形到菱形
c语言·开发语言·算法
爱滑雪的码农2 小时前
Java基础六:条件语句与switch case
java·开发语言