Commit f27bd7614d0cf4136f8084179f5b6fcd01ff07d1
1 parent
ff6c5ef5
fix():
Showing
14 changed files
with
314 additions
and
129 deletions
src/main/java/com/genersoft/iot/vmp/TCPClient.java
| ... | ... | @@ -13,17 +13,10 @@ public class TCPClient { |
| 13 | 13 | //获取输入流 |
| 14 | 14 | InputStream is = socket.getInputStream(); |
| 15 | 15 | // 将要传递给server的字符串参数转换称byte数组,并将数组写入到输出流中 |
| 16 | - os.write(new String("hello world").getBytes()); | |
| 17 | - int ch = 0; | |
| 18 | - byte[] buff = new byte[1024]; | |
| 19 | - // buff主要用来读取输入的内容,存成byte数组,ch主要用来获取读取数组的长度(与服务端作用相同) | |
| 20 | - ch = is.read(buff); | |
| 21 | - //将接收流的byte数组转换成字符串,这里是从服务端回发的字符串参数的长度 | |
| 22 | - String content = new String(buff,0,ch); | |
| 23 | - System.out.println(content); | |
| 24 | - //一定要关闭输入输出流及socket | |
| 25 | - is.close(); | |
| 26 | - os.close(); | |
| 27 | - socket.close(); | |
| 16 | + while(true){ | |
| 17 | + os.write(new String("hello world").getBytes()); | |
| 18 | + os.flush(); | |
| 19 | + Thread.sleep(1000); | |
| 20 | + } | |
| 28 | 21 | } |
| 29 | 22 | } | ... | ... |
src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMHttpHookListener.java
| ... | ... | @@ -7,6 +7,7 @@ import com.genersoft.iot.vmp.common.InviteSessionType; |
| 7 | 7 | import com.genersoft.iot.vmp.common.StreamInfo; |
| 8 | 8 | import com.genersoft.iot.vmp.common.VideoManagerConstants; |
| 9 | 9 | import com.genersoft.iot.vmp.conf.UserSetting; |
| 10 | +import com.genersoft.iot.vmp.conf.exception.ServiceException; | |
| 10 | 11 | import com.genersoft.iot.vmp.conf.exception.SsrcTransactionNotFoundException; |
| 11 | 12 | import com.genersoft.iot.vmp.gb28181.bean.*; |
| 12 | 13 | import com.genersoft.iot.vmp.gb28181.event.EventPublisher; |
| ... | ... | @@ -684,7 +685,11 @@ public class ZLMHttpHookListener { |
| 684 | 685 | if (object == null) { |
| 685 | 686 | String[] split = param.getStream().split("_"); |
| 686 | 687 | if (split != null && split.length == 2) { |
| 687 | - jt1078OfCarController.clearMap(split[1],split[0]); | |
| 688 | + try { | |
| 689 | + jt1078OfCarController.clearMap(split[1],split[0]); | |
| 690 | + } catch (ServiceException e) { | |
| 691 | + throw new RuntimeException(e); | |
| 692 | + } | |
| 688 | 693 | } |
| 689 | 694 | } |
| 690 | 695 | } | ... | ... |
src/main/java/com/genersoft/iot/vmp/vmanager/jt1078/platform/Jt1078OfCarController.java
| ... | ... | @@ -12,6 +12,7 @@ import com.alibaba.fastjson2.JSONObject; |
| 12 | 12 | import com.genersoft.iot.vmp.conf.MediaConfig; |
| 13 | 13 | import com.genersoft.iot.vmp.conf.StreamProxyTask; |
| 14 | 14 | import com.genersoft.iot.vmp.conf.exception.ControllerException; |
| 15 | +import com.genersoft.iot.vmp.conf.exception.ServiceException; | |
| 15 | 16 | import com.genersoft.iot.vmp.conf.security.JwtUtils; |
| 16 | 17 | import com.genersoft.iot.vmp.conf.security.dto.JwtUser; |
| 17 | 18 | import com.genersoft.iot.vmp.jtt1078.app.VideoServerApp; |
| ... | ... | @@ -149,6 +150,20 @@ public class Jt1078OfCarController { |
| 149 | 150 | } |
| 150 | 151 | |
| 151 | 152 | |
| 153 | + @GetMapping("/history/uploading/{stream}") | |
| 154 | + public void uploading(@PathVariable String stream) { | |
| 155 | + try { | |
| 156 | + String url = StringUtils.replace(jt1078ConfigBean.getJt1078Url(), "{0}", this.jt1078ConfigBean.getHistoryUpload()); | |
| 157 | + String msg = jt1078ConfigBean.formatMessageHistoryUpload(stream); | |
| 158 | + HttpClientPostEntity httpClientPost = this.httpClientUtil.doPost(url, msg, (String) null); | |
| 159 | + chooseEntity(httpClientPost, url, false); | |
| 160 | + | |
| 161 | + } catch (Exception e) { | |
| 162 | + throw new RuntimeException(e); | |
| 163 | + } | |
| 164 | + } | |
| 165 | + | |
| 166 | + | |
| 152 | 167 | /** |
| 153 | 168 | * redis清除在线车辆 |
| 154 | 169 | */ |
| ... | ... | @@ -349,7 +364,6 @@ public class Jt1078OfCarController { |
| 349 | 364 | * @param stream 流唯一标识 |
| 350 | 365 | */ |
| 351 | 366 | public void sendIORequest(String stream) { |
| 352 | - | |
| 353 | 367 | threadPoolExecutor.execute(() -> { |
| 354 | 368 | String msg = null; |
| 355 | 369 | // http://192.168.168.241:8100/device/{0} 指令下发地址 |
| ... | ... | @@ -669,7 +683,7 @@ public class Jt1078OfCarController { |
| 669 | 683 | @PathVariable @NotBlank(message = "channel 不能为空") String channel, |
| 670 | 684 | @PathVariable @NotBlank(message = "开始时间不能为空") String startTime, |
| 671 | 685 | @PathVariable @NotBlank(message = "结束时间不能为空") String endTime, |
| 672 | - String channelMapping, HttpServletRequest request) { | |
| 686 | + @PathVariable String channelMapping, HttpServletRequest request) throws ServiceException { | |
| 673 | 687 | String header = request.getHeader("access-token"); |
| 674 | 688 | JwtUser jwtUser = JwtUtils.verifyToken(header); |
| 675 | 689 | String key = StringUtils.join(new String[]{"history:", sim, "-", channel}); |
| ... | ... | @@ -685,7 +699,6 @@ public class Jt1078OfCarController { |
| 685 | 699 | Integer historyPort = createHistoryPort(channelMapping); |
| 686 | 700 | channelMapping = StringUtils.join(new String[]{channelMapping,"_", String.valueOf(historyPort)}); |
| 687 | 701 | this.redisTemplate.opsForValue().set(key, channelMapping, 1L, TimeUnit.HOURS); |
| 688 | -// PublishManager.getInstance().open(channelMapping); | |
| 689 | 702 | StreamContent streamContent = this.getStreamContentPlayURL(StringUtils.join(new String[]{channelMapping})); |
| 690 | 703 | if (Objects.nonNull(streamContent) && StringUtils.isNotEmpty(streamContent.getWs_flv())) { |
| 691 | 704 | resultMap.put("code", "1"); |
| ... | ... | @@ -698,8 +711,7 @@ public class Jt1078OfCarController { |
| 698 | 711 | String msg = null; |
| 699 | 712 | String url = StringUtils.replace(this.jt1078ConfigBean.getJt1078Url(), "{0}", this.jt1078ConfigBean.getPlayHistoryPort()); |
| 700 | 713 | try { |
| 701 | - Integer httpPort = this.jt1078ConfigBean.getHttpPort(); | |
| 702 | - HttpClientPostEntity entity = this.createServerLister(channelMapping, historyPort, httpPort); | |
| 714 | + HttpClientPostEntity entity = this.createServerLister(channelMapping, historyPort, historyPort); | |
| 703 | 715 | if (Objects.isNull(entity)) { |
| 704 | 716 | resultMap.put("code", "-20"); |
| 705 | 717 | resultMap.put("msg", "新建链接错误,请稍后再试"); |
| ... | ... | @@ -763,7 +775,7 @@ public class Jt1078OfCarController { |
| 763 | 775 | * 遍历Map,寻找第一个不包含指定string的Set<String>, |
| 764 | 776 | * 将该string添加到Set中并返回对应的key,如果没有找到则返回null。 |
| 765 | 777 | */ |
| 766 | - private Integer addStringToFirstNonContainingSet(String targetString) { | |
| 778 | + private Integer addStringToFirstNonContainingSet(String targetString) throws ServiceException { | |
| 767 | 779 | // 使用entrySet()方法直接获取键值对进行迭代,效率更高 |
| 768 | 780 | for (Map.Entry<Integer, Set<String>> entry : map.entrySet()) { |
| 769 | 781 | Set<String> set = entry.getValue(); |
| ... | ... | @@ -774,11 +786,10 @@ public class Jt1078OfCarController { |
| 774 | 786 | String secondDashValue = getSecondDashValue(targetString); |
| 775 | 787 | String findSet = getFindSet(set, secondDashValue); |
| 776 | 788 | set.add(targetString); |
| 777 | - if (secondDashValue != null && findSet == null) { | |
| 778 | - return entry.getKey(); // 立即返回对应的key,不再继续查找 | |
| 779 | - } else { | |
| 789 | + if (secondDashValue == null || findSet != null) { | |
| 780 | 790 | clearMap(String.valueOf(entry.getKey()), findSet); |
| 781 | 791 | } |
| 792 | + return entry.getKey(); // 立即返回对应的key,不再继续查找 | |
| 782 | 793 | } |
| 783 | 794 | return null; // 如果所有Set都包含目标字符串,则返回null |
| 784 | 795 | } |
| ... | ... | @@ -786,7 +797,7 @@ public class Jt1078OfCarController { |
| 786 | 797 | /** |
| 787 | 798 | * 清理map中的值 |
| 788 | 799 | */ |
| 789 | - public void clearMap(String key, String value) { | |
| 800 | + public void clearMap(String key, String value) throws ServiceException { | |
| 790 | 801 | if (StringUtils.isNotBlank(key) && StringUtils.isNotBlank(value)) { |
| 791 | 802 | Set<String> strings = map.get(Integer.valueOf(key)); |
| 792 | 803 | if (strings == null) { |
| ... | ... | @@ -800,7 +811,15 @@ public class Jt1078OfCarController { |
| 800 | 811 | throw new RuntimeException(e); |
| 801 | 812 | } |
| 802 | 813 | String[] split = value.split("-"); |
| 803 | - stopHistory(split[1], split[0]); | |
| 814 | + Map<String, Object> stringObjectMap = stopHistory(split[1], split[0]); | |
| 815 | + while (true){ | |
| 816 | + if (stringObjectMap.get("code").equals("1")){ | |
| 817 | + log.info("{} 历史视频断流成功",value); | |
| 818 | + break; | |
| 819 | + }else { | |
| 820 | + throw new ServiceException(String.format(" %s 历史视频断流失败",value)); | |
| 821 | + } | |
| 822 | + } | |
| 804 | 823 | strings.remove(value); |
| 805 | 824 | } |
| 806 | 825 | } else { |
| ... | ... | @@ -813,7 +832,7 @@ public class Jt1078OfCarController { |
| 813 | 832 | * |
| 814 | 833 | * @param key 通道唯一值 |
| 815 | 834 | */ |
| 816 | - public Integer createHistoryPort(String key) { | |
| 835 | + public Integer createHistoryPort(String key) throws ServiceException { | |
| 817 | 836 | Integer port = addStringToFirstNonContainingSet(key); |
| 818 | 837 | if (port == null) { |
| 819 | 838 | throw new RuntimeException(String.format("[ %s ]通道观看人数太多,请等待 !!!", key)); |
| ... | ... | @@ -879,7 +898,6 @@ public class Jt1078OfCarController { |
| 879 | 898 | |
| 880 | 899 | /** |
| 881 | 900 | * 获取视频播放地址 |
| 882 | - * | |
| 883 | 901 | * @param stream 流名称 |
| 884 | 902 | * @return 流信息 |
| 885 | 903 | */ |
| ... | ... | @@ -1007,7 +1025,6 @@ public class Jt1078OfCarController { |
| 1007 | 1025 | } |
| 1008 | 1026 | |
| 1009 | 1027 | private void chooseEntity(HttpClientPostEntity entity, String url, boolean flag) { |
| 1010 | - Map<String, Object> result = new HashMap(); | |
| 1011 | 1028 | if (Objects.isNull(entity)) { |
| 1012 | 1029 | throw new ControllerException(ErrorCode.ERROR301); |
| 1013 | 1030 | } else { | ... | ... |
src/main/java/com/genersoft/iot/vmp/vmanager/jt1078/platform/config/FtpConfigBean.java
| ... | ... | @@ -15,35 +15,37 @@ import org.springframework.context.annotation.Configuration; |
| 15 | 15 | @Configuration |
| 16 | 16 | @ConfigurationProperties(prefix = "ftp") |
| 17 | 17 | public class FtpConfigBean { |
| 18 | - | |
| 19 | - private String basePath; | |
| 18 | + /** | |
| 19 | + * 基础地址 | |
| 20 | + */ | |
| 21 | + private String basePath = "/wvp-local"; | |
| 20 | 22 | /** |
| 21 | 23 | * ftp地址 |
| 22 | 24 | */ |
| 23 | - private String host; | |
| 24 | - private String httpPath; | |
| 25 | + private String host = "192.168.169.100"; | |
| 26 | + private String httpPath = "ftp://192.168.169.100"; | |
| 25 | 27 | /** |
| 26 | 28 | * |
| 27 | 29 | */ |
| 28 | - private String filePathPrefix; | |
| 30 | + private String filePathPrefix = "http://192.168.169.100:10021/wvp-local"; | |
| 29 | 31 | /** |
| 30 | 32 | * 密码 |
| 31 | 33 | */ |
| 32 | - private String password; | |
| 34 | + private String password = "ftp@123"; | |
| 33 | 35 | /** |
| 34 | 36 | * 端口 |
| 35 | 37 | */ |
| 36 | - private Integer port; | |
| 38 | + private Integer port = 10021; | |
| 37 | 39 | /** |
| 38 | 40 | * 用户名 |
| 39 | 41 | */ |
| 40 | - private String username; | |
| 42 | + private String username = "ftpadmin"; | |
| 41 | 43 | /** |
| 42 | 44 | * 失败重试次数 -1为一直重试 |
| 43 | 45 | */ |
| 44 | - private Integer retryTimes; | |
| 46 | + private Integer retryTimes = 5; | |
| 45 | 47 | /** |
| 46 | 48 | * 失败重试间隔时间 |
| 47 | 49 | */ |
| 48 | - private Integer retryWaitTimes; | |
| 50 | + private Integer retryWaitTimes = 3000; | |
| 49 | 51 | } | ... | ... |
src/main/java/com/genersoft/iot/vmp/vmanager/jt1078/platform/config/Jt1078ConfigBean.java
| 1 | -package com.genersoft.iot.vmp.vmanager.jt1078.platform.config; import com.genersoft.iot.vmp.vmanager.jt1078.platform.Jt1078OfCarController; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.util.*; @Component public class Jt1078ConfigBean { @Value("${tuohua.bsth.jt1078.url}") private String jt1078Url; @Value("${tuohua.bsth.jt1078.sendPort}") private String jt1078SendPort; @Value("${tuohua.bsth.jt1078.stopSendPort}") private String stopSendPort; @Value("${tuohua.bsth.jt1078.historyListPort}") private String historyListPort; @Value("${tuohua.bsth.jt1078.playHistoryPort}") private String playHistoryPort; @Value("${tuohua.bsth.jt1078.ports}") private String portsOf1078; @Value("${tuohua.bsth.jt1078.pushURL}") private String pushURL; @Value("${tuohua.bsth.jt1078.stopPushURL}") private String stopPUshURL; private Integer start1078Port; private Integer end1078Port; @Value("${tuohua.bsth.jt1078.get.url}") private String getURL; @Value("${tuohua.bsth.jt1078.addPortVal}") private Integer addPort; @Value("${tuohua.bsth.jt1078.ws}") private String ws; @Value("${tuohua.bsth.jt1078.wss}") private String wss; @Value("${tuohua.bsth.jt1078.downloadFLV}") private String downloadFlv; @Value("${tuohua.bsth.jt1078.port}") private Integer port; @Value("${tuohua.bsth.jt1078.httpPort}") private Integer httpPort; @Value("${spring.profiles.active}") private String profilesActive; @Value("${media.pushKey}") private String pushKey; @Resource private RedisTemplate<String, Integer> redisTemplate; public Integer getPort() { if (port == null) { return 30000; } return port; } public Integer getHttpPort() { if (httpPort == null) { return 30000; } return httpPort; } private Integer getIntPort() { return profilesActive.equals("wx-local") ? 10000 : 0; } @PostConstruct public void initMap() { Set<String> historyPortKeys = redisTemplate.keys("history:port:*"); Set<String> keys = redisTemplate.keys("tag:*"); Set<String> patrolKeys = redisTemplate.keys("patrol:stream:*"); if (!historyPortKeys.isEmpty()) { keys.addAll(historyPortKeys); } if (!patrolKeys.isEmpty()) { keys.addAll(patrolKeys); } if (keys != null) { redisTemplate.delete(keys); } Map<Integer, Set<String>> hashMap = new HashMap<>(); for (int number = getStart1078Port(); number <= getEnd1078Port(); number++) { hashMap.put(number, new HashSet<>()); } Jt1078OfCarController.map.putAll(hashMap); } private static final String SEND_IO_MESSAGE_RTSP = "{ \"messageId\": 37121, \"properties\": 0, \"clientId\": \"{clientId}\", \"serialNo\": \"1\", \"ip\": \"{ip}\", \"tcpPort\": \"{tcpPort}\", \"udpPort\": \"{udpPort}\", \"channelNo\": \"{channelNo}\", \"mediaType\": \"1\", \"streamType\": \"1\"}"; private static final String SEND_IO_MESSAGE_RTSP_STOP = "{\"messageId\": 37122,\"properties\": 0,\"clientId\": \"{clientId}\",\"serialNo\": \"1\",\"channelNo\": \"{channelNo}\",\"command\": \"0\",\"closeType\": \"0\",\"streamType\": \"1\"}"; private static final String SEND_IO_HISTORY_RTSP = "{\"msgid\":37381,\"clientId\":\"{clientId}\",\"startTime\":\"{startTime}\",\"endTime\":\"{endTime}\",\"mediaType\":0,\"streamType\":0,\"storageType\":0,\"channelId\":{channelNo}}"; private static final String SEND_IO_PLAY_RTSP = "{\"ip\":\"{ip}\",\"tcpPort\":{tcpPort},\"udpPort\":{udpPort},\"channelNo\":\"{channelNo}\",\"mediaType\":0,\"streamType\":0,\"storageType\":0,\"playbackType\":0,\"playbackSpeed\":1,\"startTime\":\"{startTime}\",\"endTime\":\"{endTime}\",\"clientId\":\"{sim}\",\"messageId\":37377}"; public String formatMessageId(String sim, String channel, RtspConfigBean configBean, Integer port) { String msg = StringUtils.replace("{ \"messageId\": 37121, \"properties\": 0, \"clientId\": \"{clientId}\", \"serialNo\": \"1\", \"ip\": \"{ip}\", \"tcpPort\": \"{tcpPort}\", \"udpPort\": \"{udpPort}\", \"channelNo\": \"{channelNo}\", \"mediaType\": \"1\", \"streamType\": \"1\"}", "{clientId}", sim); msg = StringUtils.replace(msg, "{tcpPort}", (port.intValue() + getIntPort() + getAddPort()) + ""); msg = StringUtils.replace(msg, "{udpPort}", (port.intValue() + getIntPort() + getAddPort()) + ""); msg = StringUtils.replace(msg, "{channelNo}", channel); return StringUtils.replace(msg, "{ip}", configBean.getRtspIp()); } public String formatMessageStop(String sim, String channel) { String msg = StringUtils.replace("{\"messageId\": 37122,\"properties\": 0,\"clientId\": \"{clientId}\",\"serialNo\": \"1\",\"channelNo\": \"{channelNo}\",\"command\": \"0\",\"closeType\": \"0\",\"streamType\": \"1\"}", "{clientId}", sim); return StringUtils.replace(msg, "{channelNo}", channel); } public String formatMessageHistoryListRTSP(String sim, String channel, String startTime, String endTime) { String msg = StringUtils.replace("{\"msgid\":37381,\"clientId\":\"{clientId}\",\"startTime\":\"{startTime}\",\"endTime\":\"{endTime}\",\"mediaType\":0,\"streamType\":1,\"storageType\":0,\"channelNo\":{channelNo}}", "{clientId}", sim); msg = StringUtils.replace(msg, "{startTime}", startTime); msg = StringUtils.replace(msg, "{endTime}", endTime); return StringUtils.replace(msg, "{channelNo}", channel); } public String formatMessageHistoryPlayRTSP(String sim, String channel, String startTime, String endTime, RtspConfigBean configBean, Integer port) { String msg = StringUtils.replace("{\"ip\":\"{ip}\",\"tcpPort\":{tcpPort},\"udpPort\":{udpPort},\"channelNo\":\"{channelNo}\",\"mediaType\":0,\"streamType\":0,\"storageType\":0,\"playbackType\":0,\"playbackSpeed\":1,\"startTime\":\"{startTime}\",\"endTime\":\"{endTime}\",\"clientId\":\"{sim}\",\"messageId\":37377}", "{clientId}", sim); msg = StringUtils.replace(msg, "{startTime}", startTime); msg = StringUtils.replace(msg, "{endTime}", endTime); msg = StringUtils.replace(msg, "{channelNo}", channel); msg = StringUtils.replace(msg, "{tcpPort}", (port.intValue() + getIntPort() +getAddPort()) + ""); msg = StringUtils.replace(msg, "{udpPort}", (port.intValue() + getIntPort() + getAddPort()) + ""); msg = StringUtils.replace(msg, "{sim}", sim); return StringUtils.replace(msg, "{ip}", configBean.getRtspIp()); } public String formatMessageHistoryStopRTSP(String sim, String channel, RtspConfigBean configBean) { String msg = StringUtils.replace("{\"playbackMode\":2,\"channelNo\":{channelNo},\"playbackSpeed\":0,\"clientId\":\"{sim}\"}", "{sim}", sim); return StringUtils.replace(msg, "{channelNo}", channel); } public String formatPushURL(String pushKey, int port, int httpPort) { String msg = StringUtils.replace(this.pushURL, "{pushKey}", pushKey); msg = StringUtils.replace(msg, "{port}", String.valueOf(port)); return StringUtils.replace(msg, "{httpPort}", String.valueOf(httpPort)); } public String formatStopPushURL(String pushKey, int port, int httpPort) { String msg = StringUtils.replace(this.stopPUshURL, "{pushKey}", pushKey); msg = StringUtils.replace(msg, "{port}", String.valueOf(port)); return StringUtils.replace(msg, "{httpPort}", String.valueOf(httpPort)); } public String formatVideoURL(String stream) { String url = StringUtils.replace(getGetURL(), "{stream}", stream); if (!StringUtils.endsWith(url, ".flv")) { url = url + ".flv"; } return url; } public String getJt1078Url() { return this.jt1078Url; } public String getJt1078SendPort() { return this.jt1078SendPort; } public String getStopSendPort() { return this.stopSendPort; } public String getHistoryListPort() { return this.historyListPort; } public String getPlayHistoryPort() { return this.playHistoryPort; } public String getPushURL() { return this.pushURL; } public Integer getStart1078Port() { if (Objects.isNull(this.start1078Port)) this.start1078Port = Integer.valueOf(Integer.parseInt(StringUtils.substringBefore(this.portsOf1078, ","))); return this.start1078Port; } public Integer getEnd1078Port() { if (Objects.isNull(this.end1078Port)) this.end1078Port = Integer.valueOf(Integer.parseInt(StringUtils.substringAfter(this.portsOf1078, ","))); return this.end1078Port; } public String getPushKey(){ if (Objects.isNull(this.pushKey)){ this.pushKey = "?callId=41db35390ddad33f83944f44b8b75ded"; } return "?callId="+this.pushKey; } public String getStopPUshURL() { return this.stopPUshURL; } public String getGetURL() { return this.getURL; } public Integer getAddPort() { return this.addPort; } public String getWs() { return this.ws; } public String getWss() { return this.wss; } public String getDownloadFlv() { return downloadFlv; } public String getPortsOf1078() { return portsOf1078; } } | |
| 2 | 1 | \ No newline at end of file |
| 2 | +package com.genersoft.iot.vmp.vmanager.jt1078.platform.config; import com.genersoft.iot.vmp.vmanager.jt1078.platform.Jt1078OfCarController; import lombok.Data; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.util.*; @Data @Component public class Jt1078ConfigBean { @Value("${tuohua.bsth.jt1078.url}") private String jt1078Url; @Value("${tuohua.bsth.jt1078.sendPort}") private String jt1078SendPort; @Value("${tuohua.bsth.jt1078.stopSendPort}") private String stopSendPort; @Value("${tuohua.bsth.jt1078.historyListPort}") private String historyListPort; @Value("${tuohua.bsth.jt1078.history_upload}") private String historyUpload = "9206"; @Value("${tuohua.bsth.jt1078.playHistoryPort}") private String playHistoryPort; @Value("${tuohua.bsth.jt1078.ports}") private String portsOf1078; @Value("${tuohua.bsth.jt1078.pushURL}") private String pushURL; @Value("${tuohua.bsth.jt1078.stopPushURL}") private String stopPUshURL; private Integer start1078Port; private Integer end1078Port; @Value("${tuohua.bsth.jt1078.get.url}") private String getURL; @Value("${tuohua.bsth.jt1078.addPortVal}") private Integer addPort; @Value("${tuohua.bsth.jt1078.ws}") private String ws; @Value("${tuohua.bsth.jt1078.wss}") private String wss; @Value("${tuohua.bsth.jt1078.downloadFLV}") private String downloadFlv; @Value("${tuohua.bsth.jt1078.port}") private Integer port; @Value("${tuohua.bsth.jt1078.httpPort}") private Integer httpPort; @Value("${spring.profiles.active}") private String profilesActive; @Value("${media.pushKey}") private String pushKey; @Resource private RedisTemplate<String, Integer> redisTemplate; @Resource private FtpConfigBean ftpConfigBean; public Integer getPort() { if (port == null) { return 30000; } return port; } public Integer getHttpPort() { if (httpPort == null) { return 30000; } return httpPort; } private Integer getIntPort() { return profilesActive.equals("wx-local") ? 10000 : 0; } @PostConstruct public void initMap() { Set<String> historyPortKeys = redisTemplate.keys("history:port:*"); Set<String> keys = redisTemplate.keys("tag:*"); Set<String> patrolKeys = redisTemplate.keys("patrol:stream:*"); if (!historyPortKeys.isEmpty()) { keys.addAll(historyPortKeys); } if (!patrolKeys.isEmpty()) { keys.addAll(patrolKeys); } if (keys != null) { redisTemplate.delete(keys); } Map<Integer, Set<String>> hashMap = new HashMap<>(); for (int number = getStart1078Port(); number <= getEnd1078Port(); number++) { hashMap.put(number, new HashSet<>()); } Jt1078OfCarController.map.putAll(hashMap); } private static final String SEND_IO_MESSAGE_RTSP = "{ \"messageId\": 37121, \"properties\": 0, \"clientId\": \"{clientId}\", \"serialNo\": \"1\", \"ip\": \"{ip}\", \"tcpPort\": \"{tcpPort}\", \"udpPort\": \"{udpPort}\", \"channelNo\": \"{channelNo}\", \"mediaType\": \"1\", \"streamType\": \"1\"}"; private static final String SEND_IO_MESSAGE_RTSP_STOP = "{\"messageId\": 37122,\"properties\": 0,\"clientId\": \"{clientId}\",\"serialNo\": \"1\",\"channelNo\": \"{channelNo}\",\"command\": \"0\",\"closeType\": \"0\",\"streamType\": \"1\"}"; private static final String SEND_IO_HISTORY_RTSP = "{\"msgid\":37381,\"clientId\":\"{clientId}\",\"startTime\":\"{startTime}\",\"endTime\":\"{endTime}\",\"mediaType\":0,\"streamType\":0,\"storageType\":0,\"channelId\":{channelNo}}"; private static final String SEND_IO_PLAY_RTSP = "{\"ip\":\"{ip}\",\"tcpPort\":{tcpPort},\"udpPort\":{udpPort},\"channelNo\":\"{channelNo}\",\"mediaType\":0,\"streamType\":0,\"storageType\":0,\"playbackType\":0,\"playbackSpeed\":1,\"startTime\":\"{startTime}\",\"endTime\":\"{endTime}\",\"clientId\":\"{sim}\",\"messageId\":37377}"; public String formatMessageId(String sim, String channel, RtspConfigBean configBean, Integer port) { String msg = StringUtils.replace("{ \"messageId\": 37121, \"properties\": 0, \"clientId\": \"{clientId}\", \"serialNo\": \"1\", \"ip\": \"{ip}\", \"tcpPort\": \"{tcpPort}\", \"udpPort\": \"{udpPort}\", \"channelNo\": \"{channelNo}\", \"mediaType\": \"1\", \"streamType\": \"1\"}", "{clientId}", sim); msg = StringUtils.replace(msg, "{tcpPort}", (port.intValue() + getIntPort() + getAddPort()) + ""); msg = StringUtils.replace(msg, "{udpPort}", (port.intValue() + getIntPort() + getAddPort()) + ""); msg = StringUtils.replace(msg, "{channelNo}", channel); return StringUtils.replace(msg, "{ip}", configBean.getRtspIp()); } public String formatMessageStop(String sim, String channel) { String msg = StringUtils.replace("{\"messageId\": 37122,\"properties\": 0,\"clientId\": \"{clientId}\",\"serialNo\": \"1\",\"channelNo\": \"{channelNo}\",\"command\": \"0\",\"closeType\": \"0\",\"streamType\": \"1\"}", "{clientId}", sim); return StringUtils.replace(msg, "{channelNo}", channel); } public String formatMessageHistoryListRTSP(String sim, String channel, String startTime, String endTime) { String msg = StringUtils.replace("{\"msgid\":37381,\"clientId\":\"{clientId}\",\"startTime\":\"{startTime}\",\"endTime\":\"{endTime}\",\"mediaType\":0,\"streamType\":1,\"storageType\":0,\"channelNo\":{channelNo}}", "{clientId}", sim); msg = StringUtils.replace(msg, "{startTime}", startTime); msg = StringUtils.replace(msg, "{endTime}", endTime); return StringUtils.replace(msg, "{channelNo}", channel); } public String formatMessageHistoryPlayRTSP(String sim, String channel, String startTime, String endTime, RtspConfigBean configBean, Integer port) { String msg = StringUtils.replace("{\"ip\":\"{ip}\",\"tcpPort\":{tcpPort},\"udpPort\":{udpPort},\"channelNo\":\"{channelNo}\",\"mediaType\":0,\"streamType\":0,\"storageType\":0,\"playbackType\":0,\"playbackSpeed\":1,\"startTime\":\"{startTime}\",\"endTime\":\"{endTime}\",\"clientId\":\"{sim}\",\"messageId\":37377}", "{clientId}", sim); msg = StringUtils.replace(msg, "{startTime}", startTime); msg = StringUtils.replace(msg, "{endTime}", endTime); msg = StringUtils.replace(msg, "{channelNo}", channel); msg = StringUtils.replace(msg, "{tcpPort}", (port.intValue() + getIntPort() +getAddPort()) + ""); msg = StringUtils.replace(msg, "{udpPort}", (port.intValue() + getIntPort() + getAddPort()) + ""); msg = StringUtils.replace(msg, "{sim}", sim); return StringUtils.replace(msg, "{ip}", configBean.getRtspIp()); } public String formatMessageHistoryUpload(String stream) { if (StringUtils.isBlank(stream)) { throw new RuntimeException("上传参数不能为空"); } String[] split = stream.split("_"); if (split.length < 4){ throw new RuntimeException("上传参数异常, 请联系管理员"); } String sim = split[0]; String channel = split[1]; String startTime = split[2]; String endTime = split[3]; String msg = StringUtils.replace("{\n" + " \"clientId\": \"{clientId}\",\n" + " \"ip\": \"{ip}\",\n" + " \"port\": {port},\n" + " \"username\": \"{username}\",\n" + " \"password\": \"{password}\",\n" + " \"path\": \"{path}\",\n" + " \"channelNo\": {channel},\n" + " \"startTime\": \"{startTime}\",\n" + " \"endTime\": \"{endTime}\",\n" + " \"mediaType\": 0,\n" + " \"streamType\": 1,\n" + " \"storageType\": 1,\n" + " \"condition\": 6\n" + "}","{clientId}",sim); msg = StringUtils.replace(msg, "{ip}", ftpConfigBean.getHost()); msg = StringUtils.replace(msg, "{port}", ftpConfigBean.getPort().toString()); msg = StringUtils.replace(msg, "{username}", channel); msg = StringUtils.replace(msg, "{password}", ftpConfigBean.getPassword()); msg = StringUtils.replace(msg, "{path}", StringUtils.join(ftpConfigBean.getBasePath(),"/",sim,"/channel_",channel)); msg = StringUtils.replace(msg, "{channelNo}", channel); msg = StringUtils.replace(msg, "{startTime}", startTime); return StringUtils.replace(msg, "{endTime}", endTime); } public String formatMessageHistoryStopRTSP(String sim, String channel, RtspConfigBean configBean) { String msg = StringUtils.replace("{\"playbackMode\":2,\"channelNo\":{channelNo},\"playbackSpeed\":0,\"clientId\":\"{sim}\"}", "{sim}", sim); return StringUtils.replace(msg, "{channelNo}", channel); } public String formatPushURL(String pushKey, int port, int httpPort) { String msg = StringUtils.replace(this.pushURL, "{pushKey}", pushKey); msg = StringUtils.replace(msg, "{port}", String.valueOf(port)); return StringUtils.replace(msg, "{httpPort}", String.valueOf(httpPort)); } public String formatStopPushURL(String pushKey, int port, int httpPort) { String msg = StringUtils.replace(this.stopPUshURL, "{pushKey}", pushKey); msg = StringUtils.replace(msg, "{port}", String.valueOf(port)); return StringUtils.replace(msg, "{httpPort}", String.valueOf(httpPort)); } public String formatVideoURL(String stream) { String url = StringUtils.replace(getGetURL(), "{stream}", stream); if (!StringUtils.endsWith(url, ".flv")) { url = url + ".flv"; } return url; } public String getJt1078Url() { return this.jt1078Url; } public String getJt1078SendPort() { return this.jt1078SendPort; } public String getStopSendPort() { return this.stopSendPort; } public String getHistoryListPort() { return this.historyListPort; } public String getPlayHistoryPort() { return this.playHistoryPort; } public String getPushURL() { return this.pushURL; } public Integer getStart1078Port() { if (Objects.isNull(this.start1078Port)) this.start1078Port = Integer.valueOf(Integer.parseInt(StringUtils.substringBefore(this.portsOf1078, ","))); return this.start1078Port; } public Integer getEnd1078Port() { if (Objects.isNull(this.end1078Port)) this.end1078Port = Integer.valueOf(Integer.parseInt(StringUtils.substringAfter(this.portsOf1078, ","))); return this.end1078Port; } public String getPushKey(){ if (Objects.isNull(this.pushKey)){ this.pushKey = "?callId=41db35390ddad33f83944f44b8b75ded"; } return "?callId="+this.pushKey; } public String getStopPUshURL() { return this.stopPUshURL; } public String getGetURL() { return this.getURL; } public Integer getAddPort() { return this.addPort; } public String getWs() { return this.ws; } public String getWss() { return this.wss; } public String getDownloadFlv() { return downloadFlv; } public String getPortsOf1078() { return portsOf1078; } } | |
| 3 | 3 | \ No newline at end of file | ... | ... |
src/main/java/com/genersoft/iot/vmp/vmanager/jt1078/platform/config/TuohuaConfigBean.java
| ... | ... | @@ -159,14 +159,18 @@ public class TuohuaConfigBean { |
| 159 | 159 | } |
| 160 | 160 | return (List<HashMap>) JSON.parseArray(postEntity.getResultStr(), HashMap.class); |
| 161 | 161 | } |
| 162 | - | |
| 162 | + /** | |
| 163 | + * 修改测试号 | |
| 164 | + * @param json | |
| 165 | + */ | |
| 163 | 166 | public void setMap(String json){ |
| 164 | 167 | List<CarData> carData = JSON.parseArray(json, CarData.class); |
| 165 | 168 | int count = 1; |
| 166 | 169 | if (CollectionUtils.isNotEmpty(carData)) { |
| 167 | 170 | if (StringUtils.equals(profileActive, "wx-local")) { |
| 168 | 171 | CarData value = carData.get(0); |
| 169 | - value.setSim("123456789011"); | |
| 172 | + value.setSim("13800009998"); | |
| 173 | +// value.setSim("123456789011"); | |
| 170 | 174 | map.put(value.getSim(), value); |
| 171 | 175 | }else { |
| 172 | 176 | for (CarData carDatum : carData) { |
| ... | ... | @@ -315,10 +319,9 @@ public class TuohuaConfigBean { |
| 315 | 319 | hashMap.put("abnormalStatus",abnormalStatus); |
| 316 | 320 | |
| 317 | 321 | if (StringUtils.equals(profileActive, "wx-local")) { |
| 318 | - hashMap.put("sim","123456789011"); | |
| 319 | -// hashMap.put("sim", "122223333444"); | |
| 322 | + hashMap.put("sim","13800009998"); | |
| 323 | +// hashMap.put("sim", "123456789011"); | |
| 320 | 324 | } |
| 321 | -// | |
| 322 | 325 | return hashMap; |
| 323 | 326 | } |
| 324 | 327 | ... | ... |
src/main/java/com/genersoft/iot/vmp/vmanager/jt1078/platform/service/impl/Jt1078OfServiceImpl.java
| ... | ... | @@ -32,8 +32,8 @@ public class Jt1078OfServiceImpl implements Jt1078OfService { |
| 32 | 32 | @Override |
| 33 | 33 | public List<CarTreeData> getCarTreeData() { |
| 34 | 34 | try { |
| 35 | - String lineJson = tohuaConfigBean.requestLine(httpClientUtil, String.valueOf(100)); | |
| 36 | - String carJson = tohuaConfigBean.requestCars(httpClientUtil, String.valueOf(100)); | |
| 35 | +// String lineJson = tohuaConfigBean.requestLine(httpClientUtil, String.valueOf(100)); | |
| 36 | +// String carJson = tohuaConfigBean.requestCars(httpClientUtil, String.valueOf(100)); | |
| 37 | 37 | } catch (Exception e) { |
| 38 | 38 | throw new RuntimeException(e); |
| 39 | 39 | } | ... | ... |
src/main/java/com/genersoft/iot/vmp/vmanager/streamProxy/StreamProxyController.java
| ... | ... | @@ -71,7 +71,6 @@ public class StreamProxyController { |
| 71 | 71 | @RequestParam(required = false)Integer count, |
| 72 | 72 | @RequestParam(required = false)String query, |
| 73 | 73 | @RequestParam(required = false)Boolean online ){ |
| 74 | - | |
| 75 | 74 | return streamProxyService.getAll(page, count); |
| 76 | 75 | } |
| 77 | 76 | ... | ... |
src/main/java/com/genersoft/iot/vmp/vmanager/util/FTPUtils.java deleted
100644 → 0
| 1 | -package com.genersoft.iot.vmp.vmanager.util; | |
| 2 | - | |
| 3 | -import com.genersoft.iot.vmp.vmanager.jt1078.platform.config.FtpConfigBean; | |
| 4 | -import lombok.extern.log4j.Log4j2; | |
| 5 | -import org.apache.commons.net.ftp.FTPClient; | |
| 6 | -import org.apache.commons.net.ftp.FTPReply; | |
| 7 | -import org.springframework.stereotype.Component; | |
| 8 | - | |
| 9 | -import javax.annotation.Resource; | |
| 10 | -import java.io.IOException; | |
| 11 | - | |
| 12 | -/** | |
| 13 | - * FTP工具类 | |
| 14 | - * | |
| 15 | - * @Author WangXin | |
| 16 | - * @Data 2025/2/11 | |
| 17 | - * @Version 1.0.0 | |
| 18 | - */ | |
| 19 | -@Log4j2 | |
| 20 | -@Component | |
| 21 | -public class FTPUtils { | |
| 22 | - | |
| 23 | - @Resource | |
| 24 | - private FtpConfigBean ftpConfigBean; | |
| 25 | - | |
| 26 | - private FTPClient connectFtpServer() { | |
| 27 | - FTPClient ftpClient = new FTPClient(); | |
| 28 | - ftpClient.setConnectTimeout(1000 * 60); | |
| 29 | - ftpClient.setControlEncoding("utf-8"); | |
| 30 | - ftpClient.enterLocalPassiveMode(); | |
| 31 | - | |
| 32 | - int retryTimes = ftpConfigBean.getRetryTimes(); // 假设getRetryTimes方法返回int类型的重试次数,-1表示无限重试 | |
| 33 | - boolean isConnected = false; | |
| 34 | - int attempts = 0; | |
| 35 | - | |
| 36 | - while (!isConnected && (retryTimes == -1 || attempts < retryTimes)) { | |
| 37 | - try { | |
| 38 | - int replyCode; | |
| 39 | - ftpClient.connect(ftpConfigBean.getHost()); | |
| 40 | - ftpClient.login(ftpConfigBean.getUsername(), ftpConfigBean.getPassword()); | |
| 41 | - replyCode = ftpClient.getReplyCode(); | |
| 42 | - | |
| 43 | - if (!FTPReply.isPositiveCompletion(replyCode)) { | |
| 44 | - log.info("连接FTP服务器 {} 失败", ftpConfigBean.getHost()); | |
| 45 | - ftpClient.disconnect(); | |
| 46 | - attempts++; | |
| 47 | - if (retryTimes != -1) { | |
| 48 | - log.info("第 {} 次尝试连接失败, 将重新连接", attempts); | |
| 49 | - } | |
| 50 | - continue; // 连接不成功,继续循环 | |
| 51 | - } | |
| 52 | - isConnected = true; | |
| 53 | - log.info("replyCode:{}", replyCode); | |
| 54 | - } catch (IOException e) { | |
| 55 | - log.error("连接失败: {}", e.toString()); | |
| 56 | - attempts++; | |
| 57 | - if (retryTimes != -1) { | |
| 58 | - log.info("第 {} 次尝试连接失败, 错误信息: {}", attempts, e.getMessage()); | |
| 59 | - } | |
| 60 | - try { | |
| 61 | - // 等待一段时间再重试 | |
| 62 | - Thread.sleep(ftpConfigBean.getRetryWaitTimes()); | |
| 63 | - } catch (InterruptedException ie) { | |
| 64 | - Thread.currentThread().interrupt(); | |
| 65 | - } | |
| 66 | - } | |
| 67 | - } | |
| 68 | - if (!isConnected) { | |
| 69 | - log.error("无法连接到FTP服务器,已达到最大重试次数"); | |
| 70 | - return null; | |
| 71 | - } | |
| 72 | - return ftpClient; | |
| 73 | - } | |
| 74 | -} |
src/main/java/com/genersoft/iot/vmp/vmanager/util/FtpUtils.java
0 → 100644
| 1 | +package com.genersoft.iot.vmp.vmanager.util; | |
| 2 | + | |
| 3 | +import cn.hutool.extra.ftp.FtpException; | |
| 4 | +import com.genersoft.iot.vmp.vmanager.jt1078.platform.config.FtpConfigBean; | |
| 5 | +import lombok.RequiredArgsConstructor; | |
| 6 | +import lombok.extern.log4j.Log4j2; | |
| 7 | +import org.apache.commons.lang3.StringUtils; | |
| 8 | +import org.apache.commons.net.ftp.FTPClient; | |
| 9 | +import org.apache.commons.net.ftp.FTPFile; | |
| 10 | +import org.apache.commons.net.ftp.FTPReply; | |
| 11 | +import org.springframework.stereotype.Component; | |
| 12 | + | |
| 13 | +import java.io.IOException; | |
| 14 | +import java.io.InputStream; | |
| 15 | +import java.net.SocketException; | |
| 16 | +import java.util.LinkedList; | |
| 17 | +import java.util.List; | |
| 18 | + | |
| 19 | +/** | |
| 20 | + * FTP服务工具类 | |
| 21 | + */ | |
| 22 | +@Log4j2 | |
| 23 | +@Component | |
| 24 | +@RequiredArgsConstructor | |
| 25 | +public class FtpUtils { | |
| 26 | + | |
| 27 | + private final FtpConfigBean ftpConfigBean; | |
| 28 | + | |
| 29 | + /** | |
| 30 | + * 获取 FTPClient对象 | |
| 31 | + * @return FTPClient对象 | |
| 32 | + */ | |
| 33 | + private FTPClient getFTPClient() { | |
| 34 | + /** | |
| 35 | + * 创建 FTPClient对象(对于连接ftp服务器,以及上传和上传都必须要用到一个对象) | |
| 36 | + */ | |
| 37 | + try { | |
| 38 | + FTPClient ftpClient = new FTPClient(); | |
| 39 | + /** | |
| 40 | + * 连接 FTP服务 | |
| 41 | + */ | |
| 42 | + // 设置编码 | |
| 43 | + ftpClient.setControlEncoding("UTF-8"); | |
| 44 | + // 设置连接超时时间(单位:毫秒) | |
| 45 | + ftpClient.setConnectTimeout(10 * 1000); | |
| 46 | + // 连接 | |
| 47 | + ftpClient.connect(ftpConfigBean.getHost(), ftpConfigBean.getPort()); | |
| 48 | + // 登录 | |
| 49 | + ftpClient.login(ftpConfigBean.getUsername(), ftpConfigBean.getPassword()); | |
| 50 | + /** | |
| 51 | + * ftpClient.getReplyCode():接受状态码(如果成功,返回230,如果失败返回503) | |
| 52 | + * FTPReply.isPositiveCompletion():如果连接成功返回true,否则返回false | |
| 53 | + */ | |
| 54 | + if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) { | |
| 55 | + log.error("未连接到FTP服务,用户名或密码错误"); | |
| 56 | + // 连接失败,断开连接 | |
| 57 | + ftpClient.disconnect(); | |
| 58 | + return null; | |
| 59 | + } else { | |
| 60 | + log.info("连接到FTP服务成功"); | |
| 61 | + // 设置二进制方式传输文件 | |
| 62 | + ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); | |
| 63 | + // 设置被动工作模式,文件传输端口设置,否则文件上传不成功,也不报错 | |
| 64 | + ftpClient.enterLocalPassiveMode(); | |
| 65 | + } | |
| 66 | + return ftpClient; | |
| 67 | + } catch (SocketException e) { | |
| 68 | + log.error("FTP的IP地址错误,请正确配置。"); | |
| 69 | + throw new FtpException("FTP的IP地址错误,请正确配置。"); | |
| 70 | + } catch (IOException e) { | |
| 71 | + log.error("FTP的端口错误,请正确配置。"); | |
| 72 | + throw new FtpException("FTP的端口错误,请正确配置。"); | |
| 73 | + } catch (Exception e) { | |
| 74 | + log.error("获取ftp客户端异常"); | |
| 75 | + throw new FtpException("获取ftp客户端异常"); | |
| 76 | + } | |
| 77 | + } | |
| 78 | + | |
| 79 | + /** | |
| 80 | + * 断开 FTPClient对象 | |
| 81 | + */ | |
| 82 | + private void closeConnect(FTPClient ftpClient) { | |
| 83 | + try { | |
| 84 | + if (ftpClient != null && ftpClient.isConnected()) { | |
| 85 | + ftpClient.logout(); | |
| 86 | + // 断开ftp的连接 | |
| 87 | + ftpClient.disconnect(); | |
| 88 | + log.info("关闭ftp客户端成功"); | |
| 89 | + } | |
| 90 | + } catch (Exception e) { | |
| 91 | + log.error("关闭ftp客户端异常"); | |
| 92 | + throw new FtpException("关闭ftp客户端异常"); | |
| 93 | + } | |
| 94 | + } | |
| 95 | + | |
| 96 | + /** | |
| 97 | + * 创建文件夹 | |
| 98 | + * @param ftpBasePath FTP用户上传的根目录 | |
| 99 | + * @param dirPath 需要创建的文件夹,多层使用/隔开 | |
| 100 | + * @return | |
| 101 | + */ | |
| 102 | + public boolean createDirectory(String ftpBasePath, String dirPath) { | |
| 103 | + FTPClient ftpClient = getFTPClient(); | |
| 104 | + try { | |
| 105 | + /** | |
| 106 | + * 切换到ftp的服务器路径。 | |
| 107 | + * FTP服务为FTP虚拟用户默认了根目录,所以我们可以切换也可以不切换,结果是一样的,都会到用户的根目录下。推荐显示指定。 | |
| 108 | + * FTP服务会判断文件夹已存在,不会创建,不存在,则会创建。 | |
| 109 | + */ | |
| 110 | + ftpClient.changeWorkingDirectory(ftpBasePath); | |
| 111 | + if (StringUtils.isBlank(dirPath)) { | |
| 112 | + return false; | |
| 113 | + } | |
| 114 | + | |
| 115 | + String[] dirPathArr = dirPath.split("/"); | |
| 116 | + for (String dir : dirPathArr) { | |
| 117 | + if (StringUtils.isNotBlank(dir)) { | |
| 118 | + ftpClient.makeDirectory(dir); | |
| 119 | + // 切换到ftp的创建目录 | |
| 120 | + ftpClient.changeWorkingDirectory(dir); | |
| 121 | + } | |
| 122 | + } | |
| 123 | + return true; | |
| 124 | + } catch (IOException e) { | |
| 125 | + log.error("创建文件夹异常"); | |
| 126 | + throw new FtpException("创建文件夹异常"); | |
| 127 | + } finally { | |
| 128 | + closeConnect(ftpClient); | |
| 129 | + } | |
| 130 | + } | |
| 131 | + | |
| 132 | + /** | |
| 133 | + * 查询指定路径下的所有文件的文件名 | |
| 134 | + * @param dirPath 查询指定路径 | |
| 135 | + * @return | |
| 136 | + */ | |
| 137 | + public List<String> listFileName(String dirPath) { | |
| 138 | + if (StringUtils.isBlank(dirPath)) { | |
| 139 | + return null; | |
| 140 | + } | |
| 141 | + FTPClient ftpClient = getFTPClient(); | |
| 142 | + | |
| 143 | + // 获得指定目录下所有文件名 | |
| 144 | + FTPFile[] ftpFiles = null; | |
| 145 | + try { | |
| 146 | + //ftpClient.enterLocalPassiveMode(); // 列出路径下的所有文件的文件名 | |
| 147 | + ftpFiles = ftpClient.listFiles(dirPath); | |
| 148 | + } catch (IOException e) { | |
| 149 | + log.info("获取文件列表失败"); | |
| 150 | + throw new FtpException("获取文件列表失败"); | |
| 151 | + } finally { | |
| 152 | + closeConnect(ftpClient); | |
| 153 | + } | |
| 154 | + List<String> fileNameList = new LinkedList<>(); | |
| 155 | + for (int i = 0; ftpFiles != null && i < ftpFiles.length; i++) { | |
| 156 | + FTPFile file = ftpFiles[i]; | |
| 157 | + if (file.isFile()) { | |
| 158 | + fileNameList.add(file.getName()); | |
| 159 | + } | |
| 160 | + } | |
| 161 | + return fileNameList; | |
| 162 | + } | |
| 163 | + | |
| 164 | + /** | |
| 165 | + * 上传文件到ftp服务 | |
| 166 | + * @param ftpBasePath FTP用户上传的根目录 | |
| 167 | + * @param fileDirPath 上传的文件存储目录 | |
| 168 | + * @param fileName 上传的文件名 | |
| 169 | + * @param is 上传的文件输入流 | |
| 170 | + */ | |
| 171 | + public boolean uploadFileToFtp(String ftpBasePath, String fileDirPath, String fileName, InputStream is) { | |
| 172 | + FTPClient ftpClient = getFTPClient(); | |
| 173 | + boolean result = false; | |
| 174 | + try { | |
| 175 | + // 创建文件存储目录 | |
| 176 | + createDirectory(ftpBasePath, fileDirPath); | |
| 177 | + // 切换到ftp的文件目录,即文件上传目录 | |
| 178 | + ftpClient.changeWorkingDirectory(fileDirPath); | |
| 179 | + ftpClient.setControlEncoding("UTF-8"); | |
| 180 | + ftpClient.setBufferSize(1024 * 10); | |
| 181 | + // 设置文件类型为二进制方式传输文件 | |
| 182 | + ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); | |
| 183 | + ftpClient.enterLocalPassiveMode(); | |
| 184 | + ftpClient.setDefaultTimeout(18000); | |
| 185 | + ftpClient.setConnectTimeout(6000); | |
| 186 | + ftpClient.setSoTimeout(6000); | |
| 187 | + result = ftpClient.storeFile(fileName, is); | |
| 188 | + } catch (IOException e) { | |
| 189 | + log.error("上传文件到ftp服务失败:{}", e.getMessage()); | |
| 190 | + throw new FtpException("上传文件到ftp服务失败:{}", e.getMessage()); | |
| 191 | + } finally { | |
| 192 | + closeConnect(ftpClient); | |
| 193 | + } | |
| 194 | + return result; | |
| 195 | + } | |
| 196 | + | |
| 197 | + /** | |
| 198 | + * 从FTP中获取文件的输入流 | |
| 199 | + * @param ftpFilePath ftp文件路径,根目录开始 | |
| 200 | + * @return | |
| 201 | + */ | |
| 202 | + public InputStream getInputStreamOfFtpFile(String ftpFilePath) { | |
| 203 | + FTPClient ftpClient = getFTPClient(); | |
| 204 | + | |
| 205 | + InputStream is = null; | |
| 206 | + try { | |
| 207 | + is = ftpClient.retrieveFileStream(ftpFilePath); | |
| 208 | + } catch (IOException e) { | |
| 209 | + log.error("获取文件输入流异常"); | |
| 210 | + throw new FtpException("获取文件输入流异常"); | |
| 211 | + } finally { | |
| 212 | + closeConnect(ftpClient); | |
| 213 | + } | |
| 214 | + return is; | |
| 215 | + } | |
| 216 | + | |
| 217 | + /** | |
| 218 | + * 删除ftp文件 | |
| 219 | + * @param ftpFilePath ftp文件路径,根目录开始 | |
| 220 | + * @return | |
| 221 | + */ | |
| 222 | + public boolean deleteFtpFile(String ftpFilePath) { | |
| 223 | + FTPClient ftpClient = getFTPClient(); | |
| 224 | + boolean result = false; | |
| 225 | + try { | |
| 226 | + result = ftpClient.deleteFile(ftpFilePath); | |
| 227 | + } catch (IOException e) { | |
| 228 | + log.error("删除ftp文件失败:{}", e.getMessage()); | |
| 229 | + throw new FtpException("删除ftp文件失败:{}", e.getMessage()); | |
| 230 | + } finally { | |
| 231 | + closeConnect(ftpClient); | |
| 232 | + } | |
| 233 | + return result; | |
| 234 | + } | |
| 235 | + | |
| 236 | +} | |
| 237 | + | ... | ... |
src/main/resources/application-dev100.yml
| ... | ... | @@ -141,7 +141,7 @@ tuohua: |
| 141 | 141 | historyUdpPort: 9999 |
| 142 | 142 | ip : 61.169.120.202 |
| 143 | 143 | jt1078: |
| 144 | - ports: 49101,49200 | |
| 144 | + ports: 49101,49101 | |
| 145 | 145 | port: 9100 |
| 146 | 146 | httpPort: 3333 |
| 147 | 147 | addPortVal: 0 |
| ... | ... | @@ -155,7 +155,7 @@ tuohua: |
| 155 | 155 | stopSendPort: 9102 |
| 156 | 156 | ws: ws://61.169.120.202:1909/schedule/{stream}.live.flv |
| 157 | 157 | wss: wss://61.169.120.202:2930/schedule/{stream}.live.flv |
| 158 | - downloadFLV: http://118.113.164.50:1909/schedule/{stream}.live.flv | |
| 158 | + downloadFLV: http://61.169.120.202:1909/schedule/{stream}.live.flv | |
| 159 | 159 | get: |
| 160 | 160 | url: http://192.168.169.100:3333/video/{stream}.flv |
| 161 | 161 | playURL: /play/wasm/ws%3A%2F%2F{ip}%3A{port}%2Fschedule%2F{sim}-{channel}.live.flv%3FcallId%{publickey} |
| ... | ... | @@ -165,9 +165,9 @@ ftp: |
| 165 | 165 | host: 192.168.169.100 |
| 166 | 166 | httpPath: ftp://192.168.169.100 |
| 167 | 167 | filePathPrefix: http://192.168.169.100:10021/wvp-local |
| 168 | - password: ftpadmin | |
| 168 | + password: ftp@123 | |
| 169 | 169 | port: 21 |
| 170 | - username: ftp@123 | |
| 170 | + username: ftpadmin | |
| 171 | 171 | retryTimes: 5 |
| 172 | 172 | retryWaitTimes: 3000 |
| 173 | 173 | ... | ... |
src/main/resources/application-local.yml
| ... | ... | @@ -152,7 +152,7 @@ tuohua: |
| 152 | 152 | historyUdpPort: 9999 |
| 153 | 153 | ip : 61.169.120.202 |
| 154 | 154 | jt1078: |
| 155 | - ports: 9000,9500 | |
| 155 | + ports: 9000,9000 | |
| 156 | 156 | addPortVal: 30000 |
| 157 | 157 | pushURL: http://192.168.169.100:3333/new/server/{pushKey}/{port}/{httpPort} |
| 158 | 158 | stopPushURL: http://192.168.169.100:3333/stop/channel/{pushKey}/{port}/{httpPort} | ... | ... |
web_src/src/components/HistoricalRecord.vue
| ... | ... | @@ -160,13 +160,15 @@ export default { |
| 160 | 160 | items[i].channel = channel |
| 161 | 161 | items[i].name = items[i].startTime + '-' + items[i].endTime; |
| 162 | 162 | } |
| 163 | - this.historyData = items | |
| 164 | - console.log(this.historyData) | |
| 163 | + this.historyData = items; | |
| 165 | 164 | this.loading = false |
| 166 | 165 | } else if (res && res.data && res.data.data && res.data.data.msg) { |
| 167 | 166 | this.$message.error(res.data.data.msg); |
| 168 | 167 | this.loading = false |
| 169 | - } else { | |
| 168 | + } else if (items === undefined) { | |
| 169 | + this.historyData = []; | |
| 170 | + this.loading = false | |
| 171 | + }else { | |
| 170 | 172 | this.loading = false |
| 171 | 173 | } |
| 172 | 174 | }).cache(res => { | ... | ... |