From cc081bc9ebe7ac3b317b81e89bd6846423d8209e Mon Sep 17 00:00:00 2001 From: DaGou12138 <991623169@qq.com> Date: Thu, 26 Feb 2026 17:46:20 +0800 Subject: [PATCH] =?UTF-8?q?#2939=20=E4=BF=AE=E5=A4=8DgetDeviceTools()?= =?UTF-8?q?=E4=B8=AD=E6=9C=AA=E8=80=83=E8=99=91=E5=88=86=E9=A1=B5=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/DeviceServiceImpl.java | 105 +++++++++++++----- 1 file changed, 75 insertions(+), 30 deletions(-) diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/DeviceServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/DeviceServiceImpl.java index 57e7247e..adabbd95 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/DeviceServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/DeviceServiceImpl.java @@ -4,6 +4,7 @@ import java.nio.charset.StandardCharsets; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.time.Instant; +import java.util.ArrayList; import java.util.Base64; import java.util.Date; import java.util.HashMap; @@ -38,6 +39,8 @@ import cn.hutool.crypto.digest.DigestUtil; import cn.hutool.http.ContentType; import cn.hutool.http.Header; import cn.hutool.http.HttpRequest; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import jakarta.servlet.http.HttpServletRequest; import lombok.AllArgsConstructor; @@ -700,40 +703,82 @@ public class DeviceServiceImpl extends BaseServiceImpl // 构建完整的URL String url = StrUtil.format("http://{}/api/commands/{}", mqttGatewayUrl, clientId); - // 构建请求体 - Map payload = MapUtil - .builder(new HashMap()) - .put("jsonrpc", "2.0") - .put("id", 2) - .put("method", "tools/list") - .put("params", MapUtil.builder(new HashMap()) - .put("withUserTools", true) - .build()) - .build(); + // 存储所有工具列表 + List allTools = new ArrayList<>(); + String cursor = null; - Map requestBody = MapUtil - .builder(new HashMap()) - .put("type", "mcp") - .put("payload", payload) - .build(); - - // 发送请求 - String resultMessage = HttpRequest.post(url) - .header(Header.CONTENT_TYPE, ContentType.JSON.getValue()) - .header(Header.AUTHORIZATION, "Bearer " + generateBearerToken()) - .body(JSONUtil.toJsonStr(requestBody)) - .timeout(10000) // 超时,毫秒 - .execute().body(); - - // 解析响应 - if (StringUtils.isNotBlank(resultMessage)) { - cn.hutool.json.JSONObject jsonObject = JSONUtil.parseObj(resultMessage); - if (jsonObject.getBool("success", false)) { - return jsonObject.get("data"); + // 循环获取分页数据 + while (true) { + // 构建params + Map paramsMap = MapUtil.builder(new HashMap()) + .put("withUserTools", true) + .build(); + // 如果有cursor,添加到请求参数中 + if (StringUtils.isNotBlank(cursor)) { + paramsMap.put("cursor", cursor); } + + // 构建请求体 + Map payload = MapUtil + .builder(new HashMap()) + .put("jsonrpc", "2.0") + .put("id", 2) + .put("method", "tools/list") + .put("params", paramsMap) + .build(); + + Map requestBody = MapUtil + .builder(new HashMap()) + .put("type", "mcp") + .put("payload", payload) + .build(); + + // 发送请求 + String resultMessage = HttpRequest.post(url) + .header(Header.CONTENT_TYPE, ContentType.JSON.getValue()) + .header(Header.AUTHORIZATION, "Bearer " + generateBearerToken()) + .body(JSONUtil.toJsonStr(requestBody)) + .timeout(10000) // 超时,毫秒 + .execute().body(); + + // 解析响应 + if (StringUtils.isBlank(resultMessage)) { + break; + } + + JSONObject jsonObject = JSONUtil.parseObj(resultMessage); + if (!jsonObject.getBool("success", false)) { + break; + } + + JSONObject data = jsonObject.getJSONObject("data"); + if (data == null) { + break; + } + + // 获取当前页的工具列表 + JSONArray tools = data.getJSONArray("tools"); + if (tools != null && !tools.isEmpty()) { + allTools.addAll(tools); + } + + // 获取下一页的cursor + String nextCursor = data.getStr("nextCursor"); + if (StringUtils.isBlank(nextCursor)) { + // 没有下一页了 + break; + } + cursor = nextCursor; } - return null; + // 构建返回结果 + if (allTools.isEmpty()) { + return null; + } + + Map resultData = new HashMap<>(); + resultData.put("tools", allTools); + return resultData; } @Override