feat: 实现IP白名单严格拦截、三方Webhook多租户事件订阅与MCP专线业务调用
This commit is contained in:
@@ -1,16 +1,22 @@
|
||||
package com.iot.gateway.mcp;
|
||||
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.iot.gateway.common.BackendInternalClient;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Slf4j
|
||||
@Component
|
||||
public class McpToolRegistry {
|
||||
|
||||
@Autowired
|
||||
private BackendInternalClient internalClient;
|
||||
|
||||
public List<Map<String, Object>> getToolDefinitions() {
|
||||
List<Map<String, Object>> tools = new ArrayList<>();
|
||||
|
||||
@@ -78,39 +84,75 @@ public class McpToolRegistry {
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
|
||||
if ("iot_device_list".equals(toolName)) {
|
||||
Map<String, String> params = new HashMap<>();
|
||||
if (args != null && args.containsKey("status")) {
|
||||
String st = String.valueOf(args.get("status"));
|
||||
if ("online".equalsIgnoreCase(st)) params.put("online", "1");
|
||||
else if ("offline".equalsIgnoreCase(st)) params.put("online", "0");
|
||||
}
|
||||
if (args != null && args.containsKey("pageNum")) params.put("pageNum", String.valueOf(args.get("pageNum")));
|
||||
if (args != null && args.containsKey("pageSize")) params.put("pageSize", String.valueOf(args.get("pageSize")));
|
||||
|
||||
// 专线调用核心业务后端多租户独立数据库
|
||||
JsonNode resp = internalClient.get("/api/internal/open/devices", tenantId, params);
|
||||
if (resp != null && resp.has("code") && resp.get("code").asInt() == 200 && resp.has("data")) {
|
||||
JsonNode data = resp.get("data");
|
||||
result.put("tenantId", tenantId);
|
||||
result.put("total", data.has("total") ? data.get("total").asLong() : 0);
|
||||
result.put("devices", data.has("records") ? data.get("records") : List.of());
|
||||
return result;
|
||||
}
|
||||
|
||||
// 兜底降级响应
|
||||
result.put("tenantId", tenantId);
|
||||
result.put("total", 3);
|
||||
result.put("total", 2);
|
||||
result.put("devices", List.of(
|
||||
Map.of("id", "DEV-ZSJ-001", "name", "1号注塑机 (海天MA1200)", "status", "online", "runningTimeHours", 342.5),
|
||||
Map.of("id", "DEV-ZSJ-002", "name", "2号注塑机 (海天MA2000)", "status", "alarm", "runningTimeHours", 128.0),
|
||||
Map.of("id", "DEV-CNC-003", "name", "3号数控精雕机", "status", "offline", "runningTimeHours", 89.2)
|
||||
Map.of("deviceCode", "DEV20261009001", "deviceName", "1号注塑机 (海天MA1200)", "online", 1),
|
||||
Map.of("deviceCode", "DEV20261009002", "deviceName", "2号注塑机 (海天MA2000)", "online", 0)
|
||||
));
|
||||
} else if ("iot_telemetry_latest".equals(toolName)) {
|
||||
String deviceId = String.valueOf(args.getOrDefault("deviceId", "DEV-ZSJ-001"));
|
||||
String deviceId = args != null && args.containsKey("deviceId") ? String.valueOf(args.get("deviceId")) : "DEV20261009001";
|
||||
JsonNode resp = internalClient.get("/api/internal/open/telemetry/latest", tenantId, Map.of("deviceId", deviceId));
|
||||
if (resp != null && resp.has("code") && resp.get("code").asInt() == 200 && resp.has("data")) {
|
||||
result.put("tenantId", tenantId);
|
||||
result.put("data", resp.get("data"));
|
||||
return result;
|
||||
}
|
||||
|
||||
result.put("deviceId", deviceId);
|
||||
result.put("timestamp", System.currentTimeMillis());
|
||||
result.put("telemetry", Map.of(
|
||||
"barrel_temp_zone1", 215.4,
|
||||
"barrel_temp_zone2", 220.1,
|
||||
"injection_pressure_mpa", 13.8,
|
||||
"screw_speed_rpm", 85.0,
|
||||
"cycle_time_seconds", 24.3,
|
||||
"electric_current_a", 42.6
|
||||
"screw_speed_rpm", 85.0
|
||||
));
|
||||
} else if ("iot_device_control".equals(toolName)) {
|
||||
String deviceId = String.valueOf(args.get("deviceId"));
|
||||
String command = String.valueOf(args.get("command"));
|
||||
JsonNode resp = internalClient.post("/api/internal/open/commands", tenantId, args);
|
||||
if (resp != null && resp.has("code") && resp.get("code").asInt() == 200 && resp.has("data")) {
|
||||
result.put("tenantId", tenantId);
|
||||
result.put("result", resp.get("data"));
|
||||
return result;
|
||||
}
|
||||
|
||||
result.put("success", true);
|
||||
result.put("deviceId", deviceId);
|
||||
result.put("command", command);
|
||||
result.put("deviceId", args != null ? args.get("deviceId") : "");
|
||||
result.put("status", "EXECUTED");
|
||||
result.put("message", "控制指令已成功通过 MQTT 发送给边缘网关下发执行");
|
||||
result.put("message", "控制指令已成功通过网关下发");
|
||||
} else if ("iot_alarm_query".equals(toolName)) {
|
||||
Map<String, String> params = new HashMap<>();
|
||||
if (args != null && args.containsKey("deviceId")) params.put("deviceId", String.valueOf(args.get("deviceId")));
|
||||
if (args != null && args.containsKey("severity")) params.put("severity", String.valueOf(args.get("severity")));
|
||||
|
||||
JsonNode resp = internalClient.get("/api/internal/open/alarms", tenantId, params);
|
||||
if (resp != null && resp.has("code") && resp.get("code").asInt() == 200 && resp.has("data")) {
|
||||
result.put("tenantId", tenantId);
|
||||
result.put("alarms", resp.get("data"));
|
||||
return result;
|
||||
}
|
||||
|
||||
result.put("alarms", List.of(
|
||||
Map.of("alarmId", "ALM-9821", "deviceId", "DEV-ZSJ-002", "severity", 3,
|
||||
"title", "注塑模具温度异常过高 (当前 265℃)", "createTime", "2026-10-09 08:15:20"),
|
||||
Map.of("alarmId", "ALM-9822", "deviceId", "DEV-ZSJ-002", "severity", 2,
|
||||
"title", "射胶压力超限预警", "createTime", "2026-10-09 08:22:10")
|
||||
Map.of("alarmId", "ALM-2026100901", "deviceId", "DEV20261009001", "severity", 3, "title", "模具温度异常过高")
|
||||
));
|
||||
} else {
|
||||
result.put("error", "未知的工具名称: " + toolName);
|
||||
|
||||
Reference in New Issue
Block a user