|
@@ -0,0 +1,370 @@
|
|
|
|
|
+package com.sckw.robot.service;
|
|
|
|
|
+
|
|
|
|
|
+import com.alibaba.fastjson2.JSONObject;
|
|
|
|
|
+import com.alibaba.fastjson2.TypeReference;
|
|
|
|
|
+import com.sckw.robot.pojo.dto.*;
|
|
|
|
|
+import com.sckw.robot.util.IdUtil;
|
|
|
|
|
+import com.sckw.robot.util.OkHttpUtils;
|
|
|
|
|
+import com.sckw.robot.util.R;
|
|
|
|
|
+import jakarta.annotation.Resource;
|
|
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
|
|
+import org.springframework.data.redis.core.RedisTemplate;
|
|
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
|
|
+
|
|
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * @author xucaiqin
|
|
|
|
|
+ * @date 2025-07-08 14:12:45
|
|
|
|
|
+ */
|
|
|
|
|
+@Service
|
|
|
|
|
+public class ApiService {
|
|
|
|
|
+ // ================== 机器人相关API ==================
|
|
|
|
|
+ private static final String BASE_URL = "http://your-robot-api-base-url"; // TODO: 替换为实际baseUrl,可通过配置注入
|
|
|
|
|
+ @Resource
|
|
|
|
|
+ private RedisTemplate<String, Object> redisTemplate;
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 获取thirdToken,优先查缓存,无则生成并写入缓存
|
|
|
|
|
+ */
|
|
|
|
|
+ private String getToken() {
|
|
|
|
|
+ String cacheKey = "thirdToken";
|
|
|
|
|
+ String cached = (String) redisTemplate.opsForValue().get(cacheKey);
|
|
|
|
|
+ if (StringUtils.isNotBlank(cached)) {
|
|
|
|
|
+ return cached;
|
|
|
|
|
+ }
|
|
|
|
|
+ String token = IdUtil.UUID();
|
|
|
|
|
+ redisTemplate.opsForValue().set(cacheKey, token, 24, TimeUnit.HOURS);
|
|
|
|
|
+ return token;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 获取自检数据
|
|
|
|
|
+ */
|
|
|
|
|
+ public R<DiagDataDto> getDiagData(String robotId) {
|
|
|
|
|
+ String url = BASE_URL + "/robot/ctrl/" + robotId + "/diag";
|
|
|
|
|
+ String result = OkHttpUtils.builder()
|
|
|
|
|
+ .url(url)
|
|
|
|
|
+ .addHeader("content-type", "application/json")
|
|
|
|
|
+ .addHeader("thirdToken", getToken())
|
|
|
|
|
+ .post(true)
|
|
|
|
|
+ .sync();
|
|
|
|
|
+ return JSONObject.parseObject(result, new TypeReference<>() {
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 获取传感器数据
|
|
|
|
|
+ */
|
|
|
|
|
+ public R<SensorsDto> getSensors(String robotId) {
|
|
|
|
|
+ String url = BASE_URL + "/robot/" + robotId + "/sensors";
|
|
|
|
|
+ String result = OkHttpUtils.builder()
|
|
|
|
|
+ .url(url)
|
|
|
|
|
+ .addHeader("thirdToken", getToken())
|
|
|
|
|
+ .get()
|
|
|
|
|
+ .sync();
|
|
|
|
|
+ return JSONObject.parseObject(result, new TypeReference<>() {
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 获取机器人实时状态(包含位置数据)
|
|
|
|
|
+ */
|
|
|
|
|
+ public R<RobotStatusDetailDto> getRobotStatusDetail(String robotId) {
|
|
|
|
|
+ String url = BASE_URL + "/robot/" + robotId + "/getRobotStatusDetail";
|
|
|
|
|
+ String result = OkHttpUtils.builder()
|
|
|
|
|
+ .url(url)
|
|
|
|
|
+ .addHeader("thirdToken", getToken())
|
|
|
|
|
+ .get()
|
|
|
|
|
+ .sync();
|
|
|
|
|
+ return JSONObject.parseObject(result, new TypeReference<>() {
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 任务计划列表
|
|
|
|
|
+ */
|
|
|
|
|
+ public R<TaskPlanListDto> getTaskPlanList(String deviceId, String deviceType, Integer pageNum, Integer pageSize) {
|
|
|
|
|
+ String url = BASE_URL + "/task/plan/list";
|
|
|
|
|
+ OkHttpUtils builder = OkHttpUtils.builder()
|
|
|
|
|
+ .url(url)
|
|
|
|
|
+ .addHeader("thirdToken", getToken())
|
|
|
|
|
+ .addPara("deviceId", deviceId)
|
|
|
|
|
+ .addPara("deviceType", deviceType);
|
|
|
|
|
+ if (pageNum != null) builder.addPara("pageNum", String.valueOf(pageNum));
|
|
|
|
|
+ if (pageSize != null) builder.addPara("pageSize", String.valueOf(pageSize));
|
|
|
|
|
+ String result = builder.get().sync();
|
|
|
|
|
+ return JSONObject.parseObject(result, new TypeReference<>() {
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 任务执行
|
|
|
|
|
+ */
|
|
|
|
|
+ public R<ExecTaskNowDto> execTaskNow(String taskId) {
|
|
|
|
|
+ String url = BASE_URL + "/task/plan/execNow/" + taskId;
|
|
|
|
|
+ String result = OkHttpUtils.builder()
|
|
|
|
|
+ .url(url)
|
|
|
|
|
+ .addHeader("content-type", "application/json")
|
|
|
|
|
+ .addHeader("thirdToken", getToken())
|
|
|
|
|
+ .post(true)
|
|
|
|
|
+ .sync();
|
|
|
|
|
+ return JSONObject.parseObject(result, new TypeReference<>() {
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 获取任务报告
|
|
|
|
|
+ */
|
|
|
|
|
+ public R<TaskReportDto> getTaskReport(String id) {
|
|
|
|
|
+ String url = BASE_URL + "/task/plan/history/" + id;
|
|
|
|
|
+ String result = OkHttpUtils.builder()
|
|
|
|
|
+ .url(url)
|
|
|
|
|
+ .addHeader("thirdToken", getToken())
|
|
|
|
|
+ .get()
|
|
|
|
|
+ .sync();
|
|
|
|
|
+ return JSONObject.parseObject(result, new TypeReference<>() {
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 获取任务结果列表
|
|
|
|
|
+ */
|
|
|
|
|
+ public R<TaskStepHistoryListDto> getTaskStepHistoryList(String taskPlanHistoryId, Integer pageNum, Integer pageSize) {
|
|
|
|
|
+ String url = BASE_URL + "/task/step/history/list";
|
|
|
|
|
+ OkHttpUtils builder = OkHttpUtils.builder()
|
|
|
|
|
+ .url(url)
|
|
|
|
|
+ .addHeader("thirdToken", getToken())
|
|
|
|
|
+ .addPara("taskPlanHistoryId", taskPlanHistoryId);
|
|
|
|
|
+ if (pageNum != null) builder.addPara("pageNum", String.valueOf(pageNum));
|
|
|
|
|
+ if (pageSize != null) builder.addPara("pageSize", String.valueOf(pageSize));
|
|
|
|
|
+ String result = builder.get().sync();
|
|
|
|
|
+ return JSONObject.parseObject(result, new TypeReference<>() {
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 一键回充
|
|
|
|
|
+ */
|
|
|
|
|
+ public R<RechargeDto> recharge(String robotId) {
|
|
|
|
|
+ String url = BASE_URL + "/robot/ctrl/" + robotId + "/recharge";
|
|
|
|
|
+ String result = OkHttpUtils.builder()
|
|
|
|
|
+ .url(url)
|
|
|
|
|
+ .addHeader("thirdToken", getToken())
|
|
|
|
|
+ .get()
|
|
|
|
|
+ .sync();
|
|
|
|
|
+ return JSONObject.parseObject(result, new TypeReference<>() {
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 机器人模式切换
|
|
|
|
|
+ */
|
|
|
|
|
+ public R<SwitchModelDto> switchModel(String robotId, String mode) {
|
|
|
|
|
+ String url = BASE_URL + "/robot/ctrl/" + robotId + "/model_switch";
|
|
|
|
|
+ JSONObject body = new JSONObject();
|
|
|
|
|
+ body.put("mode", mode);
|
|
|
|
|
+ String result = OkHttpUtils.builder()
|
|
|
|
|
+ .url(url)
|
|
|
|
|
+ .addHeader("thirdToken", getToken())
|
|
|
|
|
+ .addBodyJsonStr(body.toJSONString())
|
|
|
|
|
+ .post(true)
|
|
|
|
|
+ .sync();
|
|
|
|
|
+ return JSONObject.parseObject(result, new TypeReference<>() {
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 查询是否有控制权
|
|
|
|
|
+ */
|
|
|
|
|
+ public R<RobotCtrDto> getRobotCtr(String robotId) {
|
|
|
|
|
+ String url = BASE_URL + "/robot/ctrl/" + robotId + "/getRobotCtr";
|
|
|
|
|
+ String result = OkHttpUtils.builder()
|
|
|
|
|
+ .url(url)
|
|
|
|
|
+ .addHeader("thirdToken", getToken())
|
|
|
|
|
+ .post(true)
|
|
|
|
|
+ .sync();
|
|
|
|
|
+ return JSONObject.parseObject(result, new TypeReference<>() {
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 获取控制权
|
|
|
|
|
+ */
|
|
|
|
|
+ public R<RobotCtrDto> setRobotCtr(String robotId) {
|
|
|
|
|
+ String url = BASE_URL + "/robot/ctrl/" + robotId + "/setRobotCtr";
|
|
|
|
|
+ String result = OkHttpUtils.builder()
|
|
|
|
|
+ .url(url)
|
|
|
|
|
+ .addHeader("thirdToken", getToken())
|
|
|
|
|
+ .post(true)
|
|
|
|
|
+ .sync();
|
|
|
|
|
+ return JSONObject.parseObject(result, new TypeReference<>() {
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 释放控制权
|
|
|
|
|
+ */
|
|
|
|
|
+ public R<RobotCtrDto> delRobotCtr(String robotId) {
|
|
|
|
|
+ String url = BASE_URL + "/robot/ctrl/" + robotId + "/delRobotCtr";
|
|
|
|
|
+ String result = OkHttpUtils.builder()
|
|
|
|
|
+ .url(url)
|
|
|
|
|
+ .addHeader("thirdToken", getToken())
|
|
|
|
|
+ .post(true)
|
|
|
|
|
+ .sync();
|
|
|
|
|
+ return JSONObject.parseObject(result, new TypeReference<>() {
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 机器人导航点列表
|
|
|
|
|
+ */
|
|
|
|
|
+ public R<NavPointsDto> getNavPoints(String robotId, String presetId) {
|
|
|
|
|
+ String url = BASE_URL + "/robot/" + robotId + "/nav_points";
|
|
|
|
|
+ OkHttpUtils builder = OkHttpUtils.builder()
|
|
|
|
|
+ .url(url)
|
|
|
|
|
+ .addHeader("thirdToken", getToken());
|
|
|
|
|
+ if (presetId != null) builder.addPara("presetId", presetId);
|
|
|
|
|
+ String result = builder.get().sync();
|
|
|
|
|
+ return JSONObject.parseObject(result, new TypeReference<>() {
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 机器人预置位列表
|
|
|
|
|
+ */
|
|
|
|
|
+ public R<PresetsDto> getPresets(String robotId, String navPointId) {
|
|
|
|
|
+ String url = BASE_URL + "/robot/" + robotId + "/presets";
|
|
|
|
|
+ OkHttpUtils builder = OkHttpUtils.builder()
|
|
|
|
|
+ .url(url)
|
|
|
|
|
+ .addHeader("thirdToken", getToken());
|
|
|
|
|
+ if (navPointId != null) builder.addPara("navPointId", navPointId);
|
|
|
|
|
+ String result = builder.get().sync();
|
|
|
|
|
+ return JSONObject.parseObject(result, new TypeReference<>() {
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 移动到导航点
|
|
|
|
|
+ */
|
|
|
|
|
+ public R<MoveToNavPointDto> moveToNavPoint(String robotId, String navPoint, int speed) {
|
|
|
|
|
+ String url = BASE_URL + "/robot/ctrl/" + robotId + "/move_to";
|
|
|
|
|
+ JSONObject body = new JSONObject();
|
|
|
|
|
+ body.put("nav_point", navPoint);
|
|
|
|
|
+ body.put("speed", speed);
|
|
|
|
|
+ String result = OkHttpUtils.builder()
|
|
|
|
|
+ .url(url)
|
|
|
|
|
+ .addHeader("content-type", "application/json")
|
|
|
|
|
+ .addHeader("thirdToken", getToken())
|
|
|
|
|
+ .addBodyJsonStr(body.toJSONString())
|
|
|
|
|
+ .post(true)
|
|
|
|
|
+ .sync();
|
|
|
|
|
+ return JSONObject.parseObject(result, new TypeReference<>() {
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 移动到预置位
|
|
|
|
|
+ */
|
|
|
|
|
+ public R<MoveToPresetDto> moveToPreset(String robotId, String presetName, int speed) {
|
|
|
|
|
+ String url = BASE_URL + "/robot/ctrl/" + robotId + "/moveToPreset";
|
|
|
|
|
+ JSONObject body = new JSONObject();
|
|
|
|
|
+ body.put("preset_name", presetName);
|
|
|
|
|
+ body.put("speed", speed);
|
|
|
|
|
+ String result = OkHttpUtils.builder()
|
|
|
|
|
+ .url(url)
|
|
|
|
|
+ .addHeader("content-type", "application/json")
|
|
|
|
|
+ .addHeader("thirdToken", getToken())
|
|
|
|
|
+ .addBodyJsonStr(body.toJSONString())
|
|
|
|
|
+ .post(true)
|
|
|
|
|
+ .sync();
|
|
|
|
|
+ return JSONObject.parseObject(result, new TypeReference<>() {
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 机器人云台控制
|
|
|
|
|
+ */
|
|
|
|
|
+ public R<PtzCmdDto> ptzCmd(String robotId, String command, int speed, String ptzName) {
|
|
|
|
|
+ String url = BASE_URL + "/robot/ctrl/" + robotId + "/cmd/ptz";
|
|
|
|
|
+ JSONObject body = new JSONObject();
|
|
|
|
|
+ body.put("command", command);
|
|
|
|
|
+ body.put("speed", speed);
|
|
|
|
|
+ if (ptzName != null) body.put("ptzName", ptzName);
|
|
|
|
|
+ String result = OkHttpUtils.builder()
|
|
|
|
|
+ .url(url)
|
|
|
|
|
+ .addHeader("content-type", "application/json")
|
|
|
|
|
+ .addHeader("thirdToken", getToken())
|
|
|
|
|
+ .addBodyJsonStr(body.toJSONString())
|
|
|
|
|
+ .post(true)
|
|
|
|
|
+ .sync();
|
|
|
|
|
+ return JSONObject.parseObject(result, new TypeReference<>() {
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 停止云台运动
|
|
|
|
|
+ */
|
|
|
|
|
+ public R<PtzStopDto> ptzStop(String robotId) {
|
|
|
|
|
+ String url = BASE_URL + "/robot/ctrl/" + robotId + "/ptzStop";
|
|
|
|
|
+ String result = OkHttpUtils.builder()
|
|
|
|
|
+ .url(url)
|
|
|
|
|
+ .addHeader("content-type", "application/json")
|
|
|
|
|
+ .addHeader("thirdToken", getToken())
|
|
|
|
|
+ .post(true)
|
|
|
|
|
+ .sync();
|
|
|
|
|
+ return JSONObject.parseObject(result, new TypeReference<>() {
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 相机控制
|
|
|
|
|
+ */
|
|
|
|
|
+ public R<CamCmdDto> camCmd(String robotId, String cameraId, String command, int speed) {
|
|
|
|
|
+ String url = BASE_URL + "/robot/ctrl/" + robotId + "/cmd/cam";
|
|
|
|
|
+ JSONObject control = new JSONObject();
|
|
|
|
|
+ control.put("speed", speed);
|
|
|
|
|
+ JSONObject body = new JSONObject();
|
|
|
|
|
+ body.put("cameraId", cameraId);
|
|
|
|
|
+ body.put("command", command);
|
|
|
|
|
+ body.put("control", control);
|
|
|
|
|
+ String result = OkHttpUtils.builder()
|
|
|
|
|
+ .url(url)
|
|
|
|
|
+ .addHeader("content-type", "application/json")
|
|
|
|
|
+ .addHeader("thirdToken", getToken())
|
|
|
|
|
+ .addBodyJsonStr(body.toJSONString())
|
|
|
|
|
+ .post(true)
|
|
|
|
|
+ .sync();
|
|
|
|
|
+ return JSONObject.parseObject(result, new TypeReference<>() {
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 拍照
|
|
|
|
|
+ */
|
|
|
|
|
+ public R<CaptureDto> capture(String robotId, String cameraId) {
|
|
|
|
|
+ String url = BASE_URL + "/robot/ctrl/" + robotId + "/capture?cameraId=" + cameraId;
|
|
|
|
|
+ String result = OkHttpUtils.builder()
|
|
|
|
|
+ .url(url)
|
|
|
|
|
+ .addHeader("content-type", "application/json")
|
|
|
|
|
+ .addHeader("thirdToken", getToken())
|
|
|
|
|
+ .post(true)
|
|
|
|
|
+ .sync();
|
|
|
|
|
+ return JSONObject.parseObject(result, new TypeReference<>() {
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 获取机器人相机列表
|
|
|
|
|
+ */
|
|
|
|
|
+ public R<CamerasDto> getCameras(String robotId) {
|
|
|
|
|
+ String url = BASE_URL + "/robot/" + robotId + "/cameras";
|
|
|
|
|
+ String result = OkHttpUtils.builder()
|
|
|
|
|
+ .url(url)
|
|
|
|
|
+ .addHeader("thirdToken", getToken())
|
|
|
|
|
+ .get()
|
|
|
|
|
+ .sync();
|
|
|
|
|
+ return JSONObject.parseObject(result, new TypeReference<>() {
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+}
|