Bladeren bron

暂时文件

xucaiqin 5 maanden geleden
bovenliggende
commit
ca76ba76e0

+ 10 - 0
README.md

@@ -0,0 +1,10 @@
+# 轨道机器人
+
+## 端口
+
+8860 项目服务端口
+7788 zlm服务端口
+554 rtsp
+1935 rtmp
+rtc 8000
+

+ 17 - 12
pom.xml

@@ -137,20 +137,25 @@
             <artifactId>okhttp</artifactId>
             <version>4.9.3</version>
         </dependency>
+        <dependency>
+            <groupId>com.aizuda</groupId>
+            <artifactId>zlm4j</artifactId>
+            <version>1.4.0</version>
+        </dependency>
     </dependencies>
 
-    <repositories>
-        <repository>
-            <id>releases</id>
-            <name>Releases</name>
-            <url>https://oss.sonatype.org/content/repositories/releases/</url>
-        </repository>
-        <repository>
-            <id>snapshots</id>
-            <name>Snapshots</name>
-            <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
-        </repository>
-    </repositories>
+<!--    <repositories>-->
+<!--        <repository>-->
+<!--            <id>releases</id>-->
+<!--            <name>Releases</name>-->
+<!--            <url>https://oss.sonatype.org/content/repositories/releases/</url>-->
+<!--        </repository>-->
+<!--        <repository>-->
+<!--            <id>snapshots</id>-->
+<!--            <name>Snapshots</name>-->
+<!--            <url>https://oss.sonatype.org/content/repositories/snapshots/</url>-->
+<!--        </repository>-->
+<!--    </repositories>-->
 
     <build>
         <pluginManagement>

+ 17 - 18
src/main/java/com/sckw/robot/controller/ApiController.java

@@ -1,15 +1,14 @@
 package com.sckw.robot.controller;
 
-import com.sckw.robot.pojo.dto.DiagDataDto;
-import com.sckw.robot.pojo.dto.RobotStatusDetailDto;
-import com.sckw.robot.pojo.dto.SensorsDto;
-import com.sckw.robot.pojo.dto.TaskPlanListDto;
+import com.sckw.robot.pojo.dto.*;
 import com.sckw.robot.service.ApiService;
 import com.sckw.robot.service.BusinessService;
 import com.sckw.robot.util.R;
 import jakarta.annotation.Resource;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 /**
  * api接口
  *
@@ -39,28 +38,28 @@ public class ApiController {
         return apiService.getDiagData(robotId);
     }
 
-    @GetMapping("/robot/sensors/{robotId}")
-    public R<SensorsDto> getSensors(@PathVariable String robotId) {
+    @GetMapping("/query/sensors")
+    public R<List<SensorsDto>> getSensors(@RequestParam("robotId") String robotId) {
         return apiService.getSensors(robotId);
     }
 
-    @GetMapping("/robot/status/{robotId}")
-    public R<RobotStatusDetailDto> getRobotStatusDetail(@PathVariable String robotId) {
+    @GetMapping("/query/status")
+    public R<RobotStatusDetailDto> getRobotStatusDetail(@RequestParam("robotId") String robotId) {
         return apiService.getRobotStatusDetail(robotId);
     }
 
     @GetMapping("/task/plan/list")
-    public R<TaskPlanListDto> getTaskPlanList(@RequestParam String deviceId, @RequestParam String deviceType, @RequestParam(required = false) Integer pageNum, @RequestParam(required = false) Integer pageSize) {
-        return apiService.getTaskPlanList(deviceId, deviceType, pageNum, pageSize);
+    public R<TaskPlanListDto> getTaskPlanList(@RequestParam String deviceId,  @RequestParam(required = false) Integer pageNum, @RequestParam(required = false) Integer pageSize) {
+        return apiService.getTaskPlanList(deviceId,  pageNum, pageSize);
     }
-//
+
 //    @PostMapping("/task/plan/execNow")
 //    public R<ExecTaskNowDto> execTaskNow(@RequestBody ExecTaskNowDto dto) {
 //        return apiService.execTaskNow(dto.getTaskId());
 //    }
 //
 //    @GetMapping("/task/plan/report/{id}")
-//    public R<TaskReportDto> getTaskReport(@PathVariable String id) {
+//    public R<TaskReportDto> getTaskReport(@RequestParam("robotId") String id) {
 //        return apiService.getTaskReport(id);
 //    }
 //
@@ -80,7 +79,7 @@ public class ApiController {
 //    }
 //
 //    @GetMapping("/robot/ctrl/getRobotCtr/{robotId}")
-//    public R<RobotCtrDto> getRobotCtr(@PathVariable String robotId) {
+//    public R<RobotCtrDto> getRobotCtr(@RequestParam("robotId") String robotId) {
 //        return apiService.getRobotCtr(robotId);
 //    }
 //
@@ -133,9 +132,9 @@ public class ApiController {
 //    public R<CaptureDto> capture(@RequestBody CaptureDto dto) {
 //        return apiService.capture(dto.getRobotId(), dto.getCameraId());
 //    }
-//
-//    @GetMapping("/robot/cameras/{robotId}")
-//    public R<CamerasDto> getCameras(@PathVariable String robotId) {
-//        return apiService.getCameras(robotId);
-//    }
+
+    @GetMapping("/robot/cameras")
+    public R<CamerasDto> getCameras(@RequestParam("robotId") String robotId) {
+        return apiService.getCameras(robotId);
+    }
 }

+ 6 - 5
src/main/java/com/sckw/robot/service/ApiService.java

@@ -11,6 +11,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -56,7 +57,7 @@ public class ApiService {
     /**
      * 获取传感器数据
      */
-    public R<SensorsDto> getSensors(String robotId) {
+    public R<List<SensorsDto>> getSensors(String robotId) {
         String url = BASE_URL + "/robot/" + robotId + "/sensors";
         String result = OkHttpUtils.builder()
                 .url(url)
@@ -84,13 +85,13 @@ public class ApiService {
     /**
      * 任务计划列表
      */
-    public R<TaskPlanListDto> getTaskPlanList(String deviceId, String deviceType, Integer pageNum, Integer pageSize) {
+    public R<TaskPlanListDto> getTaskPlanList(String deviceId, 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);
+                .addPara("deviceType", "robot");
         if (pageNum != null) builder.addPara("pageNum", String.valueOf(pageNum));
         if (pageSize != null) builder.addPara("pageSize", String.valueOf(pageSize));
         String result = builder.get().sync();
@@ -219,7 +220,7 @@ public class ApiService {
     /**
      * 机器人导航点列表
      */
-    public R<NavPointsDto> getNavPoints(String robotId,  String presetId) {
+    public R<NavPointsDto> getNavPoints(String robotId, String presetId) {
         String url = BASE_URL + "/robot/" + robotId + "/nav_points";
         OkHttpUtils builder = OkHttpUtils.builder()
                 .url(url)
@@ -233,7 +234,7 @@ public class ApiService {
     /**
      * 机器人预置位列表
      */
-    public R<PresetsDto> getPresets(String robotId,  String navPointId) {
+    public R<PresetsDto> getPresets(String robotId, String navPointId) {
         String url = BASE_URL + "/robot/" + robotId + "/presets";
         OkHttpUtils builder = OkHttpUtils.builder()
                 .url(url)

+ 0 - 1
src/main/java/com/sckw/robot/service/QueueService.java

@@ -19,7 +19,6 @@ import org.springframework.stereotype.Service;
 @Slf4j
 public class QueueService {
 
-
     @RabbitListener(queues = RabbitConstant.QUEUE)
     public void rawQueue(@Payload LocDto data, @Header("amqp_receivedRoutingKey") String routingKey) {
         log.info("data {}", JSONObject.toJSONString(data));

+ 70 - 0
src/main/java/com/sckw/robot/service/SsoService.java

@@ -0,0 +1,70 @@
+package com.sckw.robot.service;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.util.Base64;
+
+/**
+ * @author xucaiqin
+ * @date 2025-07-28 10:41:11
+ */
+public class SsoService {
+
+    private IvParameterSpec ivSpec;
+    private SecretKeySpec keySpec;
+
+    public SsoService(String srckey) {
+        String key = paddingkey(srckey);
+        try {
+            byte[] keyBytes = key.getBytes();
+            byte[] buf = new byte[16];
+            for (int i = 0; i < keyBytes.length && i < buf.length; i++) {
+                buf[i] = keyBytes[i];
+            }
+            this.keySpec = new SecretKeySpec(buf, "AES");
+            this.ivSpec = new IvParameterSpec(keyBytes);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public String encrypt(String src) {
+        try {
+            byte[] origData = src.getBytes();
+            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
+            cipher.init(Cipher.ENCRYPT_MODE, this.keySpec, this.ivSpec);
+            byte[] re = cipher.doFinal(origData);
+            return new String(Base64.getEncoder().encode(re));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public String decrypt(String src) throws Exception {
+
+        byte[] crypted = Base64.getDecoder().decode(src);
+        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
+        cipher.init(Cipher.DECRYPT_MODE, this.keySpec, this.ivSpec);
+        byte re[] = cipher.doFinal(crypted);
+        return new String(re);
+    }
+
+    private static String paddingkey(String liu) {
+        StringBuffer sb = new StringBuffer(liu);
+        for (int i = liu.length(); i < 16; i++) {
+            sb.append("0");
+        }
+        return sb.toString();
+
+    }
+
+    public static void main(String[] args) {
+        SsoService test = new SsoService("jindingsecrekey");
+        System.out.println(test.encrypt("{\"account\":\"test\",\"time\":" + System.currentTimeMillis() + "}"));
+        // outPut:  5SOZ33f22XAIqPNiiy3aFVa7+nELOf/a/eJ27oN7q4i7WXvuFPragDPsCHiE5fXK
+    }
+
+
+}

+ 121 - 0
src/main/java/com/sckw/robot/service/StreamService.java

@@ -0,0 +1,121 @@
+package com.sckw.robot.service;
+
+import com.aizuda.zlm4j.core.ZLMApi;
+import com.aizuda.zlm4j.structure.MK_EVENTS;
+import com.aizuda.zlm4j.structure.MK_INI;
+import com.sun.jna.Native;
+import jakarta.annotation.PostConstruct;
+import jakarta.annotation.PreDestroy;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author xucaiqin
+ * @date 2025-07-09 13:01:48
+ */
+@Slf4j
+@Component
+public class StreamService {
+    //动态链接库放在/resource/win32-x86-64&/resource/linux-x86-64下JNA会自动查找目录
+    public static ZLMApi ZLM_API = Native.load("mk_api", ZLMApi.class);
+
+    //Windows环境测试
+    //public static ZLMApi ZLM_API = Native.load("E:\\ZLMediaKit\\release\\windows\\Debug\\mk_api.dll", ZLMApi.class);
+    //Linux环境测试
+    //public static ZLMApi ZLM_API = Native.load("/opt/media/libmk_api.so", ZLMApi.class);
+    public static boolean isLinux() {
+        String osName = System.getProperty("os.name").toLowerCase();
+        return osName.contains("linux");
+    }
+
+    @PostConstruct
+    public void start() {
+        //初始化sdk配置
+        ZLM_API.mk_env_init2(1, 1, 1, null, 0, 0, null, 0, null, null);
+        //初始化环境配置 SDK参数配置详见ZLM4J参数配置
+        MK_INI mkIni = ZLM_API.mk_ini_default();
+        //配置参数 全部配置参数及说明见(resources/conf.ini)
+        ZLM_API.mk_ini_set_option(mkIni, "general.mediaServerId", "JMediaServer");
+        ZLM_API.mk_ini_set_option(mkIni, "http.notFound", "<h1 style=\"text-align:center;\">Media Server</h1>");
+        ZLM_API.mk_ini_set_option_int(mkIni, "protocol.auto_close", 0);
+        ZLM_API.mk_ini_set_option_int(mkIni, "general.streamNoneReaderDelayMS", 30000);
+        ZLM_API.mk_ini_set_option_int(mkIni, "general.maxStreamWaitMS", 30000);
+        ZLM_API.mk_ini_set_option_int(mkIni, "protocol.enable_ts", 1);
+        ZLM_API.mk_ini_set_option_int(mkIni, "protocol.enable_hls", 1);
+        ZLM_API.mk_ini_set_option_int(mkIni, "protocol.enable_fmp4", 1);
+        ZLM_API.mk_ini_set_option_int(mkIni, "protocol.enable_rtsp", 1);
+        ZLM_API.mk_ini_set_option_int(mkIni, "protocol.enable_rtmp", 1);
+        ZLM_API.mk_ini_set_option_int(mkIni, "protocol.enable_mp4", 1);
+        ZLM_API.mk_ini_set_option_int(mkIni, "protocol.enable_hls_fmp4", 1);
+        ZLM_API.mk_ini_set_option_int(mkIni, "protocol.enable_audio", 1);
+        ZLM_API.mk_ini_set_option_int(mkIni, "protocol.mp4_as_player", 1);
+        ZLM_API.mk_ini_set_option_int(mkIni, "protocol.mp4_max_second", 3600);
+        if (isLinux()) {
+            ZLM_API.mk_ini_set_option(mkIni, "http.rootPath", "/data/project/www");
+            ZLM_API.mk_ini_set_option(mkIni, "protocol.mp4_save_path", "/data/project/www");
+            ZLM_API.mk_ini_set_option(mkIni, "protocol.hls_save_path", "/data/project/www");
+
+        } else {
+            ZLM_API.mk_ini_set_option(mkIni, "http.rootPath", "D:/www");
+            ZLM_API.mk_ini_set_option(mkIni, "protocol.mp4_save_path", "D:/www");
+            ZLM_API.mk_ini_set_option(mkIni, "protocol.hls_save_path", "D:/www");
+        }
+
+        ZLM_API.mk_ini_set_option_int(mkIni, "protocol.hls_demand", 0);
+        ZLM_API.mk_ini_set_option_int(mkIni, "protocol.rtsp_demand", 0);
+        ZLM_API.mk_ini_set_option_int(mkIni, "protocol.rtmp_demand", 0);
+        ZLM_API.mk_ini_set_option_int(mkIni, "protocol.ts_demand", 0);
+        ZLM_API.mk_ini_set_option_int(mkIni, "protocol.fmp4_demand", 0);
+        //全局回调 全部回调见MK_EVENTS内所有的回调属性,如果配置了推流回调、播放回调请务必执行invoker_do,否则无法推流、回放
+        MK_EVENTS mkEvents = new MK_EVENTS();
+        //流状态改变回调
+        mkEvents.on_mk_media_changed = (regist, sender) -> {
+            log.info("app:" + ZLM_API.mk_media_source_get_app(sender));
+            log.info("stream:" + ZLM_API.mk_media_source_get_stream(sender));
+            log.info("schema:" + ZLM_API.mk_media_source_get_schema(sender));
+            log.info("这里是流改变回调通知:" + regist);
+        };
+        //无人观看回调
+        mkEvents.on_mk_media_no_reader = sender -> {
+            log.info("这里是无人观看回调通知");
+            ZLM_API.mk_media_source_close(sender, 1);
+        };
+        //推流回调 可控制鉴权、录制、转协议控制等
+        mkEvents.on_mk_media_publish = (url_info, invoker, sender) -> {
+            //这里拿到访问路径后(例如rtmp://xxxx/xxx/xxx?token=xxxx其中?后面就是拿到的参数)的参数
+            // err_msg返回 空字符串表示鉴权成功 否则鉴权失败提示
+            //String param = ZLM_API.mk_media_info_get_params(url_info);
+            MK_INI option = ZLM_API.mk_ini_create();
+            ZLM_API.mk_ini_set_option_int(option, "enable_mp4", 1);
+            ZLM_API.mk_ini_set_option_int(option, "enable_audio", 1);
+            ZLM_API.mk_ini_set_option_int(option, "enable_fmp4", 1);
+            ZLM_API.mk_ini_set_option_int(option, "enable_ts", 1);
+            ZLM_API.mk_ini_set_option_int(option, "enable_hls", 1);
+            ZLM_API.mk_ini_set_option_int(option, "enable_rtsp", 1);
+            ZLM_API.mk_ini_set_option_int(option, "enable_rtmp", 1);
+            ZLM_API.mk_ini_set_option_int(option, "auto_close", 0);
+            //流名称替换
+            //ZLM_API.mk_ini_set_option(option, "stream_replace", "test1");
+            ZLM_API.mk_publish_auth_invoker_do2(invoker, "", option);
+            ZLM_API.mk_ini_release(option);
+            //ZLM_API.mk_publish_auth_invoker_do(invoker, "", 0, 0);
+        };
+        //添加全局回调
+        ZLM_API.mk_events_listen(mkEvents);
+        //创建http服务器 0:失败,非0:端口号
+        short http_server_port = ZLM_API.mk_http_server_start((short) 7788, 0);
+        //创建rtsp服务器 0:失败,非0:端口号
+        short rtsp_server_port = ZLM_API.mk_rtsp_server_start((short) 554, 0);
+        //创建rtmp服务器 0:失败,非0:端口号
+        short rtmp_server_port = ZLM_API.mk_rtmp_server_start((short) 1935, 0);
+        //创建RTC服务器 0:失败,非0:端口号
+        short rtc_server_port = ZLM_API.mk_rtc_server_start((short) 8000);
+    }
+
+    @PreDestroy
+    public void stop() {
+        log.info("ZLMediaKit 服务关闭中...");
+        ZLM_API.mk_stop_all_server();
+        log.info("ZLMediaKit 服务已关闭");
+    }
+}