From 1335ac25bedf2ee2f79dca26707542b87242883f Mon Sep 17 00:00:00 2001 From: ‘liusuyi’ <1951119284@qq.com> Date: 星期五, 27 十月 2023 14:31:59 +0800 Subject: [PATCH] 增加井和相机批量导入 --- ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/lib/ExceptionCallBack.java | 10 ard-work/src/main/resources/templates/test.html | 555 +++++++++++++++++++++++++++------------ ard-work/src/main/java/com/ruoyi/alarmpoints/well/service/IArdAlarmpointsWellService.java | 10 ard-work/src/main/java/com/ruoyi/device/camera/controller/ArdCamerasController.java | 23 + ard-work/src/main/java/com/ruoyi/device/camera/service/IArdCamerasService.java | 25 + ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DhClientServiceImpl.java | 4 ard-work/src/main/resources/mapper/alarmpoints/ArdAlarmpointsWellMapper.xml | 30 ++ ard-work/src/main/java/com/ruoyi/alarmpoints/well/controller/ArdAlarmpointsWellController.java | 4 ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikClientServiceImpl.java | 15 ard-work/src/main/java/com/ruoyi/alarmpoints/tube/controller/ArdTubesDetailsController.java | 1 ard-work/src/main/java/com/ruoyi/alarmpoints/well/mapper/ArdAlarmpointsWellMapper.java | 8 ard-work/src/main/java/com/ruoyi/alarmpoints/well/service/impl/ArdAlarmpointsWellServiceImpl.java | 19 ard-work/src/main/java/com/ruoyi/device/camera/service/impl/ArdCamerasServiceImpl.java | 88 ++++++ 13 files changed, 589 insertions(+), 203 deletions(-) diff --git a/ard-work/src/main/java/com/ruoyi/alarmpoints/tube/controller/ArdTubesDetailsController.java b/ard-work/src/main/java/com/ruoyi/alarmpoints/tube/controller/ArdTubesDetailsController.java index 2d2f9c3..d979117 100644 --- a/ard-work/src/main/java/com/ruoyi/alarmpoints/tube/controller/ArdTubesDetailsController.java +++ b/ard-work/src/main/java/com/ruoyi/alarmpoints/tube/controller/ArdTubesDetailsController.java @@ -120,6 +120,7 @@ String message = ardTubesDetailsService.importArdTubesDetails(tubesDetailsList, updateSupport, operName,tubeId); return success(message); } + @PostMapping("/importTemplate") @ApiOperation(value = "绠$嚎璇︽儏妯℃澘涓嬭浇鎺ュ彛") public void importTemplate(HttpServletResponse response) diff --git a/ard-work/src/main/java/com/ruoyi/alarmpoints/well/controller/ArdAlarmpointsWellController.java b/ard-work/src/main/java/com/ruoyi/alarmpoints/well/controller/ArdAlarmpointsWellController.java index 4df23f5..340b055 100644 --- a/ard-work/src/main/java/com/ruoyi/alarmpoints/well/controller/ArdAlarmpointsWellController.java +++ b/ard-work/src/main/java/com/ruoyi/alarmpoints/well/controller/ArdAlarmpointsWellController.java @@ -152,9 +152,9 @@ @ApiOperation("瀵煎叆浜�") public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception { ExcelUtil<ArdAlarmpointsWell> util = new ExcelUtil<ArdAlarmpointsWell>(ArdAlarmpointsWell.class); - List<ArdAlarmpointsWell> userList = util.importExcel(file.getInputStream()); + List<ArdAlarmpointsWell> wellList = util.importExcel(file.getInputStream()); String operName = getUsername(); - String message = ardAlarmpointsWellService.importUser(userList, updateSupport, operName); + String message = ardAlarmpointsWellService.importWell(wellList, updateSupport, operName); return success(message); } diff --git a/ard-work/src/main/java/com/ruoyi/alarmpoints/well/mapper/ArdAlarmpointsWellMapper.java b/ard-work/src/main/java/com/ruoyi/alarmpoints/well/mapper/ArdAlarmpointsWellMapper.java index d48d616..87e7bd6 100644 --- a/ard-work/src/main/java/com/ruoyi/alarmpoints/well/mapper/ArdAlarmpointsWellMapper.java +++ b/ard-work/src/main/java/com/ruoyi/alarmpoints/well/mapper/ArdAlarmpointsWellMapper.java @@ -62,7 +62,13 @@ * @return 缁撴灉 */ public int updateArdAlarmpointsWell(ArdAlarmpointsWell ardAlarmpointsWell); - + /** + * 淇敼浜曠鐞嗘寜浜曞彿 + * + * @param ardAlarmpointsWell 浜曠鐞� + * @return 缁撴灉 + */ + public int updateArdAlarmpointsWellByWellId(ArdAlarmpointsWell ardAlarmpointsWell); /** * 鍒犻櫎浜曠鐞� * diff --git a/ard-work/src/main/java/com/ruoyi/alarmpoints/well/service/IArdAlarmpointsWellService.java b/ard-work/src/main/java/com/ruoyi/alarmpoints/well/service/IArdAlarmpointsWellService.java index a002a4d..ae2d433 100644 --- a/ard-work/src/main/java/com/ruoyi/alarmpoints/well/service/IArdAlarmpointsWellService.java +++ b/ard-work/src/main/java/com/ruoyi/alarmpoints/well/service/IArdAlarmpointsWellService.java @@ -60,7 +60,13 @@ * @return 缁撴灉 */ public int updateArdAlarmpointsWell(ArdAlarmpointsWell ardAlarmpointsWell); - + /** + * 淇敼浜曠鐞嗘寜浜曞彿 + * + * @param ardAlarmpointsWell 浜曠鐞� + * @return 缁撴灉 + */ + public int updateArdAlarmpointsWellByWellId(ArdAlarmpointsWell ardAlarmpointsWell); /** * 鎵归噺鍒犻櫎浜曠鐞� * @@ -84,7 +90,7 @@ * @param operName 鎿嶄綔鐢ㄦ埛 * @return 缁撴灉 */ - public String importUser(List<ArdAlarmpointsWell> ardAlarmpointsWellList, Boolean isUpdateSupport, String operName); + public String importWell(List<ArdAlarmpointsWell> ardAlarmpointsWellList, Boolean isUpdateSupport, String operName); /** * 鏍¢獙鐢ㄦ埛鏄惁鏈夋暟鎹潈闄� * diff --git a/ard-work/src/main/java/com/ruoyi/alarmpoints/well/service/impl/ArdAlarmpointsWellServiceImpl.java b/ard-work/src/main/java/com/ruoyi/alarmpoints/well/service/impl/ArdAlarmpointsWellServiceImpl.java index b2c5e8a..70182f0 100644 --- a/ard-work/src/main/java/com/ruoyi/alarmpoints/well/service/impl/ArdAlarmpointsWellServiceImpl.java +++ b/ard-work/src/main/java/com/ruoyi/alarmpoints/well/service/impl/ArdAlarmpointsWellServiceImpl.java @@ -126,7 +126,13 @@ ardAlarmpointsWell.setUpdateTime(DateUtils.getNowDate()); return ardAlarmpointsWellMapper.updateArdAlarmpointsWell(ardAlarmpointsWell); } - + @Override + @Transactional + public int updateArdAlarmpointsWellByWellId(ArdAlarmpointsWell ardAlarmpointsWell) { + ardAlarmpointsWell.setUpdateBy(SecurityUtils.getUsername()); + ardAlarmpointsWell.setUpdateTime(DateUtils.getNowDate()); + return ardAlarmpointsWellMapper.updateArdAlarmpointsWellByWellId(ardAlarmpointsWell); + } /** * 鎵归噺鍒犻櫎浜曠鐞� * @@ -150,7 +156,7 @@ } @Override - public String importUser(List<ArdAlarmpointsWell> ardAlarmpointsWellList, Boolean isUpdateSupport, String operName) { + public String importWell(List<ArdAlarmpointsWell> ardAlarmpointsWellList, Boolean isUpdateSupport, String operName) { if (StringUtils.isNull(ardAlarmpointsWellList) || ardAlarmpointsWellList.size() == 0) { throw new ServiceException("瀵煎叆浜曟暟鎹笉鑳戒负绌猴紒"); } @@ -163,9 +169,9 @@ //鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛id String userId = SecurityUtils.getUserId(); well.setUserId(userId); - // 楠岃瘉鏄惁瀛樺湪杩欎釜鐢ㄦ埛 - ArdAlarmpointsWell u = ardAlarmpointsWellMapper.selectArdAlarmpointsWellByWellId(well.getWellId()); - if (StringUtils.isNull(u)) { + // 楠岃瘉鏄惁瀛樺湪杩欎釜浜� + ArdAlarmpointsWell w = ardAlarmpointsWellMapper.selectArdAlarmpointsWellByWellId(well.getWellId()); + if (StringUtils.isNull(w)) { BeanValidators.validateWithException(validator, well); well.setCreateBy(operName); this.insertArdAlarmpointsWell(well); @@ -173,10 +179,9 @@ successMsg.append("<br/>" + successNum + "銆佷簳鍙� " + well.getWellId() + " 瀵煎叆鎴愬姛"); } else if (isUpdateSupport) { BeanValidators.validateWithException(validator, well); - checkWellAllowed(well); checkWellDataScope(well.getUserId()); well.setUpdateBy(operName); - this.updateArdAlarmpointsWell(well); + this.updateArdAlarmpointsWellByWellId(well); successNum++; successMsg.append("<br/>" + successNum + "銆佷簳鍙� " + well.getWellId() + " 鏇存柊鎴愬姛"); } else { diff --git a/ard-work/src/main/java/com/ruoyi/device/camera/controller/ArdCamerasController.java b/ard-work/src/main/java/com/ruoyi/device/camera/controller/ArdCamerasController.java index 8c103db..9a28677 100644 --- a/ard-work/src/main/java/com/ruoyi/device/camera/controller/ArdCamerasController.java +++ b/ard-work/src/main/java/com/ruoyi/device/camera/controller/ArdCamerasController.java @@ -3,6 +3,7 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import com.ruoyi.alarmpoints.well.domain.ArdAlarmpointsWell; import com.ruoyi.common.constant.CameraConstants; import com.ruoyi.device.camera.domain.ArdCameras; import com.ruoyi.device.camera.domain.CameraCmd; @@ -27,6 +28,7 @@ import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.core.page.TableDataInfo; +import org.springframework.web.multipart.MultipartFile; import java.util.*; @@ -137,6 +139,27 @@ return toAjax(ardCamerasService.deleteArdCamerasByIds(ids)); } + @Log(title = "瀵煎叆鐩告満璁惧", businessType = BusinessType.IMPORT) + @PreAuthorize("@ss.hasPermi('device:cameras:import')") + @PostMapping("/importData") + @ApiOperation("瀵煎叆鐩告満璁惧") + public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception { + ExcelUtil<ArdCameras> util = new ExcelUtil<ArdCameras>(ArdCameras.class); + List<ArdCameras> camerasList = util.importExcel(file.getInputStream()); + String operName = getUsername(); + String message = ardCamerasService.importCameras(camerasList, updateSupport, operName); + return success(message); + } + + @PostMapping("/importTemplate") + @ApiOperation("鐩告満璁惧瀵煎叆妯℃澘") + public void importTemplate(HttpServletResponse response) { + ExcelUtil<ArdCameras> util = new ExcelUtil<ArdCameras>(ArdCameras.class); + util.importTemplateExcel(response, "鐩告満璁惧鏁版嵁"); + } + + + @GetMapping("/options") @ApiOperation("閫夋嫨鐩告満鏁版嵁") public List options(ArdCameras ardCameras) { diff --git a/ard-work/src/main/java/com/ruoyi/device/camera/service/IArdCamerasService.java b/ard-work/src/main/java/com/ruoyi/device/camera/service/IArdCamerasService.java index b36ac59..cdacba2 100644 --- a/ard-work/src/main/java/com/ruoyi/device/camera/service/IArdCamerasService.java +++ b/ard-work/src/main/java/com/ruoyi/device/camera/service/IArdCamerasService.java @@ -5,6 +5,7 @@ import java.util.Map; import java.util.TreeMap; +import com.ruoyi.alarmpoints.well.domain.ArdAlarmpointsWell; import com.ruoyi.device.camera.domain.ArdCameras; import com.ruoyi.device.camera.domain.CameraCmd; import com.ruoyi.scheduling.domian.SchedulingParam; @@ -71,6 +72,30 @@ */ public int deleteArdCamerasById(String id); + + /** + * 瀵煎叆鐩告満璁惧淇℃伅 + * + * @param ardCamerasList 鐩告満璁惧鏁版嵁鍒楄〃 + * @param isUpdateSupport 鏄惁鏇存柊鏀寔锛屽鏋滃凡瀛樺湪锛屽垯杩涜鏇存柊鏁版嵁 + * @param operName 鎿嶄綔鐢ㄦ埛 + * @return 缁撴灉 + */ + public String importCameras(List<ArdCameras> ardCamerasList, Boolean isUpdateSupport, String operName); + /** + * 鏍¢獙鐩告満鏄惁鍏佽鎿嶄綔 + * + * @param ardCameras 鐩告満淇℃伅 + */ + public void checkCameraAllowed(ArdCameras ardCameras); + /** + * 鏍¢獙鐢ㄦ埛鏄惁鏈夋暟鎹潈闄� + * + * @param userId 鐢ㄦ埛id + */ + public void checkCameraDataScope(String userId); + + public List findOptions(ArdCameras ardCameras); /** * @鎻忚堪 鑾峰彇鏈儴闂ㄤ互涓嬬殑鎵�鏈夌浉鏈哄拰閮ㄩ棬 diff --git a/ard-work/src/main/java/com/ruoyi/device/camera/service/impl/ArdCamerasServiceImpl.java b/ard-work/src/main/java/com/ruoyi/device/camera/service/impl/ArdCamerasServiceImpl.java index 1ef2e1a..a8265ea 100644 --- a/ard-work/src/main/java/com/ruoyi/device/camera/service/impl/ArdCamerasServiceImpl.java +++ b/ard-work/src/main/java/com/ruoyi/device/camera/service/impl/ArdCamerasServiceImpl.java @@ -3,13 +3,18 @@ import java.util.*; import java.util.stream.Collectors; +import com.ruoyi.alarmpoints.well.domain.ArdAlarmpointsWell; import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.constant.CameraConstants; import com.ruoyi.common.core.domain.entity.SysDept; +import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.bean.BeanValidators; +import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.common.utils.uuid.IdUtils; import com.ruoyi.device.camera.domain.CameraCmd; import com.ruoyi.device.channel.domain.ArdChannel; @@ -25,10 +30,12 @@ import com.ruoyi.system.mapper.SysDeptMapper; import com.ruoyi.utils.gis.Point; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; import javax.annotation.Resource; +import javax.validation.Validator; /** * 鐩告満璁惧Service涓氬姟灞傚鐞� @@ -50,7 +57,8 @@ private ArdChannelMapper ardChannelMapper; @Resource private IVtduService vtduService; - + @Autowired + protected Validator validator; @PostConstruct public void loadCameras() { @@ -200,6 +208,84 @@ return i; } + @Override + public String importCameras(List<ArdCameras> ardCamerasList, Boolean isUpdateSupport, String operName) { + if (StringUtils.isNull(ardCamerasList) || ardCamerasList.size() == 0) { + throw new ServiceException("瀵煎叆浜曟暟鎹笉鑳戒负绌猴紒"); + } + int successNum = 0; + int failureNum = 0; + StringBuilder successMsg = new StringBuilder(); + StringBuilder failureMsg = new StringBuilder(); + for (ArdCameras camera : ardCamerasList) { + try { + //鑾峰彇褰撳墠鐧诲綍鐢ㄦ埛id + String userId = SecurityUtils.getUserId(); + camera.setUserId(userId); + // 楠岃瘉鏄惁瀛樺湪杩欎釜鐢ㄦ埛 + ArdCameras u = ardCamerasMapper.selectArdCamerasById(camera.getId()); + if (StringUtils.isNull(u)) { + BeanValidators.validateWithException(validator, camera); + camera.setCreateBy(operName); + this.insertArdCameras(camera); + successNum++; + successMsg.append("<br/>" + successNum + "銆佺浉鏈篒D " + camera.getId() + " 瀵煎叆鎴愬姛"); + } else if (isUpdateSupport) { + BeanValidators.validateWithException(validator, camera); + checkCameraDataScope(camera.getUserId()); + camera.setUpdateBy(operName); + this.updateArdCameras(camera); + successNum++; + successMsg.append("<br/>" + successNum + "銆佺浉鏈篒D " + camera.getId() + " 鏇存柊鎴愬姛"); + } else { + failureNum++; + failureMsg.append("<br/>" + failureNum + "銆佺浉鏈篒D " + camera.getId() + " 宸插瓨鍦�"); + } + } catch (Exception e) { + failureNum++; + String msg = "<br/>" + failureNum + "銆佺浉鏈篒D " + camera.getId() + " 瀵煎叆澶辫触锛�"; + failureMsg.append(msg + e.getMessage()); + log.error(msg, e); + } + } + if (failureNum > 0) { + failureMsg.insert(0, "寰堟姳姝夛紝瀵煎叆澶辫触锛佸叡 " + failureNum + " 鏉℃暟鎹牸寮忎笉姝g‘锛岄敊璇涓嬶細"); + throw new ServiceException(failureMsg.toString()); + } else { + successMsg.insert(0, "鎭枩鎮紝鏁版嵁宸插叏閮ㄥ鍏ユ垚鍔燂紒鍏� " + successNum + " 鏉★紝鏁版嵁濡備笅锛�"); + } + return successMsg.toString(); + } + + /** + * 鏍¢獙鐩告満鏄惁鍏佽鎿嶄綔 + * + * @param ardCameras 鐩告満淇℃伅 + */ + @Override + public void checkCameraAllowed(ArdCameras ardCameras) { + if (StringUtils.isNotNull(ardCameras.getId())) { + throw new ServiceException("涓嶅厑璁告搷浣滀簳"); + } + } + + /** + * 鏍¢獙鐢ㄦ埛鏄惁鏈夋暟鎹潈闄� + * + * @param userId 鐢ㄦ埛id + */ + @Override + public void checkCameraDataScope(String userId) { + if (!SysUser.isAdmin(SecurityUtils.getUserId())) { + ArdCameras camera = new ArdCameras(); + camera.setUserId(userId); + List<ArdCameras> cameras = SpringUtils.getAopProxy(this).selectArdCamerasList(camera); + if (StringUtils.isEmpty(cameras)) { + throw new ServiceException("娌℃湁鏉冮檺璁块棶浜曟暟鎹紒"); + } + } + } + public List findOptions(ArdCameras ardCameras) { List<ArdCameras> options = ardCamerasMapper.findOptions(ardCameras); for (ArdCameras camera : diff --git a/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DhClientServiceImpl.java b/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DhClientServiceImpl.java index 2b62b12..ccb5b6a 100644 --- a/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DhClientServiceImpl.java +++ b/ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DhClientServiceImpl.java @@ -896,7 +896,7 @@ // 璁惧鏂嚎鍥炶皟: 褰撹澶囧嚭鐜版柇绾挎椂锛孲DK浼氳皟鐢ㄨ鍑芥暟 private static class DisConnect implements NetSDKLib.fDisConnect { public void invoke(LLong m_hLoginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) { - log.warn("Device[" + pchDVRIP + "] Port[" + nDVRPort + "] DisConnect!"); + log.warn("Device[" + pchDVRIP + ":" + nDVRPort + "] DisConnect!"); } } @@ -904,7 +904,7 @@ private static class HaveReConnect implements NetSDKLib.fHaveReConnect { @Override public void invoke(LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) { - log.warn("ReConnect Device[" + pchDVRIP + "] Port[" + nDVRPort + "]"); + log.warn("ReConnect Device[" + pchDVRIP + ":" + nDVRPort + "]"); } } diff --git a/ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/lib/ExceptionCallBack.java b/ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/lib/ExceptionCallBack.java index 70b0678..4558212 100644 --- a/ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/lib/ExceptionCallBack.java +++ b/ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/lib/ExceptionCallBack.java @@ -22,19 +22,19 @@ Integer port = camera.getPort(); switch (dwType) { case EXCEPTION_EXCHANGE: - log.warn("Device[" + ip + "] Port[" + port + "]鐢ㄦ埛浜や簰鏃跺紓甯�"); + log.warn("Device[" + ip + ":" + port + "]鐢ㄦ埛浜や簰鏃跺紓甯�"); break; case EXCEPTION_PREVIEW: - log.warn("Device[" + ip + "] Port[" + port + "]缃戠粶棰勮寮傚父"); + log.warn("Device[" + ip + ":" + port + "]缃戠粶棰勮寮傚父"); break; case EXCEPTION_RECONNECT: - log.warn("Device[" + ip + "] Port[" + port + "]棰勮鏃堕噸杩�"); + log.warn("Device[" + ip + ":" + port + "]棰勮鏃堕噸杩�"); break; case RELOGIN_SUCCESS: - log.warn("Device[" + ip + "] Port[" + port + "]鐢ㄦ埛閲嶇櫥闄嗘垚鍔�"); + log.warn("Device[" + ip + ":" + port + "]鐢ㄦ埛閲嶇櫥闄嗘垚鍔�"); break; case EXCEPTION_RELOGIN: - log.warn("Device[" + ip + "] Port[" + port + "]鐢ㄦ埛閲嶇櫥闄�"); + log.warn("Device[" + ip + ":" + port + "]鐢ㄦ埛閲嶇櫥闄�"); break; } } diff --git a/ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikClientServiceImpl.java b/ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikClientServiceImpl.java index b1d9d82..3d09337 100644 --- a/ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikClientServiceImpl.java +++ b/ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikClientServiceImpl.java @@ -1094,7 +1094,7 @@ public boolean controlInfrarecfg(CameraCmd cmd) { String cameraId = cmd.getCameraId(); boolean enable = cmd.isEnable(); - Integer channelNum = cmd.getChanNo(); + Integer chanNo = cmd.getChanNo(); if (!GlobalVariable.loginMap.containsKey(cameraId)) { return false; } @@ -1102,17 +1102,17 @@ NET_DVR_CAMERAPARAMCFG_EX struDayNigh = new NET_DVR_CAMERAPARAMCFG_EX(); Pointer point = struDayNigh.getPointer(); IntByReference ibrBytesReturned = new IntByReference(0); - boolean b_GetCameraParam = hCNetSDK.NET_DVR_GetDVRConfig(userId, NET_DVR_GET_CCDPARAMCFG_EX, channelNum, point, struDayNigh.size(), ibrBytesReturned); + boolean b_GetCameraParam = hCNetSDK.NET_DVR_GetDVRConfig(userId, NET_DVR_GET_CCDPARAMCFG_EX, chanNo, point, struDayNigh.size(), ibrBytesReturned); if (!b_GetCameraParam) { log.error("鑾峰彇鍓嶇鍙傛暟澶辫触锛岄敊璇爜锛�" + hCNetSDK.NET_DVR_GetLastError()); } struDayNigh.read(); - log.debug("鏄惁寮�鍚瑙嗭細" + struDayNigh.struDayNight.byDayNightFilterType); + String current = struDayNigh.struDayNight.byDayNightFilterType == 1 ? "寮�鍚�" : "鍏抽棴"; + log.debug("褰撳墠鐘舵��:" + current); NET_DVR_DAYNIGHT daynight = new NET_DVR_DAYNIGHT(); if (enable) { daynight.byDayNightFilterType = 1;//澶滄櫄 - } else { daynight.byDayNightFilterType = 0;//鐧藉ぉ } @@ -1120,12 +1120,15 @@ daynight.byDayNightFilterTime = 60; struDayNigh.struDayNight = daynight; struDayNigh.write(); - boolean bool = hCNetSDK.NET_DVR_SetDVRConfig(userId, NET_DVR_SET_CCDPARAMCFG_EX, channelNum, point, struDayNigh.size()); + boolean bool = hCNetSDK.NET_DVR_SetDVRConfig(userId, NET_DVR_SET_CCDPARAMCFG_EX, chanNo, point, struDayNigh.size()); if (!bool) { int code = hCNetSDK.NET_DVR_GetLastError(); log.error("璁剧疆澶滆澶辫触,璇风◢鍚庨噸璇�" + code); } - log.debug("璁剧疆澶滆鎴愬姛"); + else { + log.debug("璁剧疆澶滆鎴愬姛"); + } + return bool; } diff --git a/ard-work/src/main/resources/mapper/alarmpoints/ArdAlarmpointsWellMapper.xml b/ard-work/src/main/resources/mapper/alarmpoints/ArdAlarmpointsWellMapper.xml index 7fbd1d1..3e5dea9 100644 --- a/ard-work/src/main/resources/mapper/alarmpoints/ArdAlarmpointsWellMapper.xml +++ b/ard-work/src/main/resources/mapper/alarmpoints/ArdAlarmpointsWellMapper.xml @@ -185,7 +185,35 @@ </trim> where id = #{id} </update> - + <update id="updateArdAlarmpointsWellByWellId" parameterType="ArdAlarmpointsWell"> + update ard_alarmpoints_well + <trim prefix="SET" suffixOverrides=","> + <if test="wellId != null">well_id = #{wellId},</if> + <if test="wellNumber != null">well_number = #{wellNumber},</if> + <if test="oilProduction != null">oil_production = #{oilProduction},</if> + <if test="wellBlock != null">well_block = #{wellBlock},</if> + <if test="productionDate != null">production_date = #{productionDate},</if> + <if test="displacementMode != null">displacement_mode = #{displacementMode},</if> + <if test="surroundingEnvironment != null">surrounding_environment = #{surroundingEnvironment},</if> + <if test="wellType != null">well_type = #{wellType},</if> + <if test="installedLoad != null">installed_load = #{installedLoad},</if> + <if test="meteringStation != null">metering_station = #{meteringStation},</if> + <if test="transferStation != null">transfer_station = #{transferStation},</if> + <if test="dehydrationStation != null">dehydration_station = #{dehydrationStation},</if> + <if test="runStatus != null">run_status = #{runStatus},</if> + <if test="longitude != null">longitude = #{longitude},</if> + <if test="latitude != null">latitude = #{latitude},</if> + <if test="altitude != null">altitude = #{altitude},</if> + <if test="deptId != null">dept_id = #{deptId},</if> + <if test="userId != null">user_id = #{userId},</if> + <if test="createBy != null">create_by = #{createBy},</if> + <if test="createTime != null">create_time = #{createTime},</if> + <if test="updateBy != null">update_by = #{updateBy},</if> + <if test="updateTime != null">update_time = #{updateTime},</if> + <if test="cameraId != null">camera_id = #{cameraId},</if> + </trim> + where well_id = #{wellId} + </update> <delete id="deleteArdAlarmpointsWellById" parameterType="String"> delete from ard_alarmpoints_well diff --git a/ard-work/src/main/resources/templates/test.html b/ard-work/src/main/resources/templates/test.html index 8c81faf..38e86f4 100644 --- a/ard-work/src/main/resources/templates/test.html +++ b/ard-work/src/main/resources/templates/test.html @@ -4,133 +4,139 @@ <meta charset="UTF-8"> <title>娴嬭瘯椤�</title> <script th:src="@{/js/jquery-3.6.4.min.js}"></script> - <script th:src="@{/js/adapter.min.js}"></script> - <script th:src="@{/js/webrtcstreamer.js}"></script> <link rel="stylesheet" th:href="@{/css/bootstrap.css}"/> <script th:src="@{/js/bootstrap.js}"></script> <style> .top-buffer { margin-top: 10px; } + + .container { + border: 2px solid #1b6d85; + padding: 20px; + } </style> <body> <div class="container"> <div class="row "> - <div class="dropdown"> - 鐩告満id锛�<select id="select"> + <div class="col-md-12"> + 鐩告満id锛�<select id="select" style="width: 330px;"> </select> </div> </div> - <div class="row top-buffer"> - <div class="col-md-1 col-md-offset-1"> - <button id="up" type="button" class="btn btn-primary">涓�</button> - </div> - <div class="col-md-4 col-md-offset-3"> - <div class="btn-group" role="group"> - <button id="controlZoomIn" type="button" class="btn btn-primary">璋冪劍-</button> - <button id="controlZoomOut" type="button" class="btn btn-primary">璋冪劍+</button> - </div> - </div> - </div> - <div class="row "> - <div class="col-md-1"> - <button id="left" type="button" class="btn btn-primary">宸�</button> - </div> - <div class="col-md-1 col-md-offset-1"> - <button id="right" type="button" class="btn btn-primary">鍙�</button> - </div> - <div class="col-md-4 col-md-offset-2"> - <div class="btn-group" role="group"> - <button id="controlFocusNear" type="button" class="btn btn-primary">鑱氱劍-</button> - <button id="controlFocusFar" type="button" class="btn btn-primary">鑱氱劍+</button> - </div> - </div> - </div> - <div class="row "> - <div class="col-md-1 col-md-offset-1"> - <button id="down" type="button" class="btn btn-primary">涓�</button> - </div> - <div class="col-md-4 col-md-offset-3"> - <div class="btn-group" role="group"> - <button id="controlIrisOpen" type="button" class="btn btn-primary">鍏夊湀-</button> - <button id="controlIrisClose" type="button" class="btn btn-primary">鍏夊湀+</button> - </div> - </div> - </div> <div class="row"> - <div class="col-md-6"> - <div class="row top-buffer"> - <div class="input-group"> - <span class="input-group-addon">鐩殑鍧愭爣鍊硷細</span> - <input id="targetPostion" class="form-control" placeholder="鐩殑鍧愭爣"/> - <button id="setTargetPostion" type="button" class="btn btn-default">鎸囧悜鍧愭爣</button> - </div> - <div class="input-group"> - <span class="input-group-addon">P鍊硷細</span> - <input id="p" class="form-control" placeholder="璇疯緭鍏鍊�"/> - </div> - <div class="input-group"> - <span class="input-group-addon">T鍊硷細</span> - <input id="t" class="form-control" placeholder="璇疯緭鍏鍊�"/> - </div> - <div class="input-group"> - <span class="input-group-addon">Z鍊硷細</span> - <input id="z" class="form-control" placeholder="璇疯緭鍏鍊�"/> - </div> - </div> - <div class="row top-buffer"> - <div class="btn-group" role="group"> - <button id="getPTZ" type="button" class="btn btn-default">鑾峰彇ptz</button> - <button id="setPTZ" type="button" class="btn btn-default">璁剧疆ptz</button> - <button id="setPreset" type="button" class="btn btn-default">璁鹃缃偣</button> - <button id="gotoPreset" type="button" class="btn btn-default">璋冮缃偣</button> - <button id="getZeroPTZ" type="button" class="btn btn-default">璋冪敤闆舵柟浣嶈</button> - <button id="setZeroPTZ" type="button" class="btn btn-default">璁剧疆闆舵柟浣嶈</button> - </div> - </div> - <div class="row top-buffer"> - <div class="btn-group" role="group"> - <button id="FocusMode" type="button" class="btn btn-default">鎵嬪姩鑱氱劍</button> - <div id="focusDiv" class="input-group"> - <span class="input-group-addon">鑱氱劍鍊硷細</span> - <input id="focus" class="form-control" placeholder="鑱氱劍鍊�"/> - </div> - <button id="getFocusPos" type="button" class="btn btn-default">鑾峰彇鑱氱劍鍊�</button> - <button id="setFocusPos" type="button" class="btn btn-default">璁剧疆鑱氱劍鍊�</button> - </div> - </div> - <div class="row top-buffer"> - <div class="btn-group" role="group"> - <button id="WiperPwron" type="button" class="btn btn-default">寮�鍚洦鍒�</button> - <button id="Defogcfg" type="button" class="btn btn-default">寮�鍚�忛浘</button> - <button id="Infrarecfg" type="button" class="btn btn-default">寮�鍚孩澶�</button> - <button id="HeateRpwron" type="button" class="btn btn-default">寮�鍚簯鍙板姞鐑�</button> - <button id="CameraDeicing" type="button" class="btn btn-default">寮�鍚暅澶村姞鐑�</button> - </div> - </div> - <div class="row top-buffer"> - <div class="btn-group" role="group"> - <button id="voice" type="button" class="btn btn-default">寮�濮嬭闊冲璁�</button> - <button id="record" type="button" class="btn btn-default">寮�濮嬪綍鍍�</button> - <button id="realCutPic" type="button" class="btn btn-default">瀹炴椂鎶撳浘</button> - <button id="saveCutPic" type="button" class="btn btn-default">瀛樺偍鎶撳浘</button> - </div> - </div> - <div class="row top-buffer"> - <div class="col-md-6"> - <img class="thumbnail" id="imgContainer" style="width: 500px; height: 300px;"/> - </div> - </div> - </div> - <div class="col-md-1"/> <div class="col-md-5"> <div class="row top-buffer"> - <video id="video" muted autoplay loop controls style="width: 800px; height: 100%; object-fit: fill;"/> + <div class="col-md-1 col-md-offset-1"> + <button id="up" type="button" class="btn btn-primary">涓�</button> + </div> + <div class="col-md-6 col-md-offset-2"> + <div class="btn-group" role="group"> + <button id="controlZoomIn" type="button" class="btn btn-primary">璋冪劍-</button> + <button id="controlZoomOut" type="button" class="btn btn-primary">璋冪劍+</button> + </div> + </div> + </div> + <div class="row "> + <div class="col-md-1"> + <button id="left" type="button" class="btn btn-primary">宸�</button> + </div> + <div class="col-md-1 col-md-offset-1"> + <button id="right" type="button" class="btn btn-primary">鍙�</button> + </div> + <div class="col-md-6 col-md-offset-1"> + <div class="btn-group" role="group"> + <button id="controlFocusNear" type="button" class="btn btn-primary">鑱氱劍-</button> + <button id="controlFocusFar" type="button" class="btn btn-primary">鑱氱劍+</button> + </div> + </div> + </div> + <div class="row "> + <div class="col-md-1 col-md-offset-1"> + <button id="down" type="button" class="btn btn-primary">涓�</button> + </div> + <div class="col-md-6 col-md-offset-2"> + <div class="btn-group" role="group"> + <button id="controlIrisOpen" type="button" class="btn btn-primary">鍏夊湀-</button> + <button id="controlIrisClose" type="button" class="btn btn-primary">鍏夊湀+</button> + </div> + </div> + </div> + <div class="row "> + <div class="col-md-10"> + <div class="row top-buffer"> + <div class="input-group"> + <span class="input-group-addon">鐩殑鍧愭爣鍊硷細</span> + <input id="targetPostion" class="form-control" placeholder="鐩殑鍧愭爣"/> + <button id="setTargetPostion" type="button" class="btn btn-default">鎸囧悜鍧愭爣</button> + </div> + <div class="input-group"> + <span class="input-group-addon">P鍊硷細</span> + <input id="p" class="form-control" placeholder="璇疯緭鍏鍊�"/> + </div> + <div class="input-group"> + <span class="input-group-addon">T鍊硷細</span> + <input id="t" class="form-control" placeholder="璇疯緭鍏鍊�"/> + </div> + <div class="input-group"> + <span class="input-group-addon">Z鍊硷細</span> + <input id="z" class="form-control" placeholder="璇疯緭鍏鍊�"/> + </div> + </div> + <div class="row top-buffer"> + <div class="btn-group" role="group"> + <button id="getPTZ" type="button" class="btn btn-default">鑾峰彇ptz</button> + <button id="setPTZ" type="button" class="btn btn-default">璁剧疆ptz</button> + <button id="setPreset" type="button" class="btn btn-default">璁鹃缃偣</button> + <button id="gotoPreset" type="button" class="btn btn-default">璋冮缃偣</button> + <button id="setZeroPTZ" type="button" class="btn btn-default">璁剧疆闆舵柟浣嶈</button> + </div> + </div> + <div class="row top-buffer"> + <div class="btn-group" role="group"> + <button id="FocusMode" type="button" class="btn btn-default">鎵嬪姩鑱氱劍</button> + <div id="focusDiv" class="input-group"> + <span class="input-group-addon">鑱氱劍鍊硷細</span> + <input id="focus" class="form-control" placeholder="鑱氱劍鍊�"/> + </div> + <button id="getFocusPos" type="button" class="btn btn-default">鑾峰彇鑱氱劍鍊�</button> + <button id="setFocusPos" type="button" class="btn btn-default">璁剧疆鑱氱劍鍊�</button> + </div> + </div> + <div class="row top-buffer"> + <div class="btn-group" role="group"> + <button id="WiperPwron" type="button" class="btn btn-default">寮�鍚洦鍒�</button> + <button id="Defogcfg" type="button" class="btn btn-default">寮�鍚�忛浘</button> + <button id="Infrarecfg" type="button" class="btn btn-default">寮�鍚孩澶�</button> + <button id="HeateRpwron" type="button" class="btn btn-default">寮�鍚簯鍙板姞鐑�</button> + <button id="CameraDeicing" type="button" class="btn btn-default">寮�鍚暅澶村姞鐑�</button> + </div> + </div> + <div class="row top-buffer"> + <div class="btn-group" role="group"> + <button id="voice" type="button" class="btn btn-default">寮�濮嬭闊冲璁�</button> + <button id="record" type="button" class="btn btn-default">寮�濮嬪綍鍍�</button> + <button id="saveCutPic" type="button" class="btn btn-default">瀛樺偍鎶撳浘</button> + </div> + </div> + </div> + </div> + </div> + <div class="col-md-6"> + <div class="row"> + <div class="row top-buffer"> + <video id="video" muted autoplay loop controls + style="width: 100%; height: 360px; object-fit: fill; border: 2px solid #3498db;"/> + </div> + <div class="row"> + <img class="thumbnail" id="imgContainer" + style="width: 100%; height: 360px; border: 2px solid #3498db;"/> + </div> </div> </div> </div> </div> -<script th:inline="javascript" th:type="module"> +<script th:inline="javascript"> var cameraId, opt, optOpen, optClose, token; window.onload = function () { @@ -175,7 +181,6 @@ dataType: "json", data: JSON.stringify(opt), success: function (data) { - console.log(data); token = data.token; } }) @@ -589,20 +594,20 @@ cameraId = $('#select option:selected').val(); opt = {"cameraId": cameraId, "chanNo": 1}; $.ajax({ - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/json', - 'Authorization': token - }, - url: "../cameraSdk/getFocusPos", - type: "post", - dataType: "json", - data: JSON.stringify(opt), - success: function (datas) { - console.log(datas); - $("#focus").val(datas.data); - } - }) + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + 'Authorization': token + }, + url: "../cameraSdk/getFocusPos", + type: "post", + dataType: "json", + data: JSON.stringify(opt), + success: function (datas) { + console.log(datas); + $("#focus").val(datas.data); + } + }) }) var heateRpwronflag = true; $("#HeateRpwron").click(function () { @@ -656,7 +661,8 @@ $.ajax({ headers: { 'Accept': 'application/json', - 'Content-Type': 'application/json' + 'Content-Type': 'application/json', + 'Authorization': token }, url: "../cameraSdk/cameraDeicing", type: "post", @@ -721,7 +727,7 @@ console.log(data.data); setTimeout(() => { $('#imgContainer').attr('src', data.data); - }, 1000 ) + }, 1000) } }) @@ -790,67 +796,264 @@ }) } - let webRtcServer = null; - let videoMap = new Map(); $('video').click(function (e) { - let ID = e.target.id;//鑾峰彇褰撳墠鐐瑰嚮浜嬩欢鐨勫厓绱� - console.log(ID); - if (videoMap.get(ID) != null) { - closeVideo(ID, videoMap.get(ID)); - } else { - var cameraId = $('#select option:selected').val(); - let camera = cameraMap.get(cameraId); - console.log(camera); - if (camera.factory == "3") { - realViewYs("127.0.0.1", ID, camera.username, camera.password, camera.ipaddr, camera.port); - } else if (camera.factory == "2") { - realViewDh("127.0.0.1", ID, camera.username, camera.password, camera.ipaddr, camera.port); - } else { - realViewHik("127.0.0.1", ID, camera.username, camera.password, camera.ipaddr, camera.port); + var cameraId = $('#select option:selected').val(); + $.ajax({ + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + 'Authorization': token + }, + url: "../vtdu/media/" + cameraId + "_" + 1, + type: "get", + dataType: "json", + success: function (data) { + realView(data.data.webrtcUrl + "/", e.target.id); } - } + }) }); - //棰勮娴峰悍鐩告満 - function realViewHik(serverip, elem, username, password, ipaddr, port) { - // webRtcServer = new WebRtcStreamer(elem, "http://" + serverip + ":8000"); - webRtcServer = new WebRtcStreamer(elem, "http://192.168.1.227:8000"); - let rtspUrl = "rtsp://" + username + ":" + password + "@" + ipaddr + ":" + port + "/ch1/main/av_stream"; - let option = "rtptransport=tcp"; - console.log("rtsp鍦板潃锛�" + rtspUrl); - webRtcServer.connect(rtspUrl, null, option, null); - videoMap.set(elem, webRtcServer); + let webrtcClient; + //whep鎿嶄綔鏂规硶 + const restartPause = 2000; + const unquoteCredential = (v) => ( + JSON.parse(`"${v}"`) + ); + const linkToIceServers = (links) => ( + (links !== null) ? links.split(', ').map((link) => { + const m = link.match(/^<(.+?)>; rel="ice-server"(; username="(.*?)"; credential="(.*?)"; credential-type="password")?/i); + const ret = { + urls: [m[1]], + }; + + if (m[3] !== undefined) { + ret.username = unquoteCredential(m[3]); + ret.credential = unquoteCredential(m[4]); + ret.credentialType = "password"; + } + + return ret; + }) : [] + ); + const parseOffer = (offer) => { + const ret = { + iceUfrag: '', + icePwd: '', + medias: [], + }; + + for (const line of offer.split('\r\n')) { + if (line.startsWith('m=')) { + ret.medias.push(line.slice('m='.length)); + } else if (ret.iceUfrag === '' && line.startsWith('a=ice-ufrag:')) { + ret.iceUfrag = line.slice('a=ice-ufrag:'.length); + } else if (ret.icePwd === '' && line.startsWith('a=ice-pwd:')) { + ret.icePwd = line.slice('a=ice-pwd:'.length); + } + } + + return ret; + }; + const generateSdpFragment = (offerData, candidates) => { + const candidatesByMedia = {}; + for (const candidate of candidates) { + const mid = candidate.sdpMLineIndex; + if (candidatesByMedia[mid] === undefined) { + candidatesByMedia[mid] = []; + } + candidatesByMedia[mid].push(candidate); + } + + let frag = 'a=ice-ufrag:' + offerData.iceUfrag + '\r\n' + + 'a=ice-pwd:' + offerData.icePwd + '\r\n'; + + let mid = 0; + + for (const media of offerData.medias) { + if (candidatesByMedia[mid] !== undefined) { + frag += 'm=' + media + '\r\n' + + 'a=mid:' + mid + '\r\n'; + + for (const candidate of candidatesByMedia[mid]) { + frag += 'a=' + candidate.candidate + '\r\n'; + } + } + mid++; + } + + return frag; } - //棰勮澶у崕鐩告満 - function realViewDh(serverip, elem, username, password, ipaddr, port) { - webRtcServer = new WebRtcStreamer(elem, "http://" + serverip + ":8000"); - let rtspUrl = "rtsp://" + username + ":" + password + "@" + ipaddr + ":" + port + "/cam/realmonitor?channel=1&subtype=0"; - let option = "rtptransport=tcp"; - console.log("rtsp鍦板潃锛�" + rtspUrl); + class WHEPClient { + constructor(whepUrl, videoId) { + this.video = videoId; + this.wurl = new URL('whep', whepUrl); + this.pc = null; + this.restartTimeout = null; + this.eTag = ''; + this.queuedCandidates = []; + this.start(); + } - webRtcServer.connect(rtspUrl, null, option, null); - videoMap.set(elem, webRtcServer); + start() { + console.log("requesting ICE servers"); + fetch(this.wurl, { + method: 'OPTIONS', + }) + .then((res) => this.onIceServers(res)) + .catch((err) => { + console.log('error: ' + err); + this.scheduleRestart(); + }); + } + + onIceServers(res) { + this.pc = new RTCPeerConnection({ + iceServers: linkToIceServers(res.headers.get('Link')), + }); + + const direction = "sendrecv"; + this.pc.addTransceiver("video", {direction}); + this.pc.addTransceiver("audio", {direction}); + + this.pc.onicecandidate = (evt) => this.onLocalCandidate(evt); + this.pc.oniceconnectionstatechange = () => this.onConnectionState(); + + this.pc.ontrack = (evt) => { + console.log("new track:", evt.track.kind); + document.getElementById(this.video).srcObject = evt.streams[0]; + }; + + this.pc.createOffer() + .then((offer) => this.onLocalOffer(offer)); + } + + onLocalOffer(offer) { + this.offerData = parseOffer(offer.sdp); + this.pc.setLocalDescription(offer); + + console.log("sending offer"); + console.log(this.wurl); + fetch(this.wurl, { + method: 'POST', + headers: { + 'Content-Type': 'application/sdp', + }, + body: offer.sdp, + }) + .then((res) => { + if (res.status !== 201) { + throw new Error('bad status code'); + } + // this.eTag = res.headers.get('ETag'); + this.eTag = res.headers.get("ETag") || res.headers.get('E-Tag'); + return res.text(); + }) + .then((sdp) => this.onRemoteAnswer(new RTCSessionDescription({ + type: 'answer', + sdp, + }))) + .catch((err) => { + console.log('error: ' + err); + this.scheduleRestart(); + }); + } + + onConnectionState() { + if (this.restartTimeout !== null) { + return; + } + + console.log("peer connection state:", this.pc.iceConnectionState); + + switch (this.pc.iceConnectionState) { + case "disconnected": + this.scheduleRestart(); + } + } + + onRemoteAnswer(answer) { + if (this.restartTimeout !== null) { + return; + } + + this.pc.setRemoteDescription(new RTCSessionDescription(answer)); + + if (this.queuedCandidates.length !== 0) { + this.sendLocalCandidates(this.queuedCandidates); + this.queuedCandidates = []; + } + } + + onLocalCandidate(evt) { + if (this.restartTimeout !== null) { + return; + } + + if (evt.candidate !== null) { + if (this.eTag === '') { + this.queuedCandidates.push(evt.candidate); + } else { + this.sendLocalCandidates([evt.candidate]) + } + } + } + + sendLocalCandidates(candidates) { + fetch(this.wurl, { + method: 'PATCH', + headers: { + 'Content-Type': 'application/trickle-ice-sdpfrag', + 'If-Match': this.eTag, + }, + + body: generateSdpFragment(this.offerData, candidates), + }) + .then((res) => { + if (res.status !== 204) { + throw new Error('bad status code'); + } + }) + .catch((err) => { + console.log('error: ' + err); + this.scheduleRestart(); + }); + } + + scheduleRestart() { + if (this.restartTimeout !== null) { + return; + } + + if (this.pc !== null) { + this.pc.close(); + this.pc = null; + } + + this.restartTimeout = window.setTimeout(() => { + this.restartTimeout = null; + this.start(); + }, restartPause); + + this.eTag = ''; + this.queuedCandidates = []; + } + + stop() { + if (this.pc) { + try { + this.pc.close(); + } catch (e) { + console.log("Failure close peer connection:" + e); + } + this.pc = null; + } + } } - //棰勮瀹囪鐩告満 - function realViewYs(serverip, elem, username, password, ipaddr, port) { - webRtcServer = new WebRtcStreamer(elem, "http://" + serverip + ":8000"); - let rtspUrl = "rtsp://" + username + ":" + password + "@" + ipaddr + ":" + port + "/media/video1/multicast"; - console.log("rtsp鍦板潃锛�" + rtspUrl); - let option = "rtptransport=tcp"; - webRtcServer.connect(rtspUrl, null, option, null); - videoMap.set(elem, webRtcServer); - } - - function closeVideo(id, webrtc) { - webrtc.disconnect(); - videoMap.delete(id); - } - - //椤甸潰閫�鍑烘椂閿�姣� - window.onbeforeunload = function () { - webRtcServer.disconnect(); + function realView(whepUrl, videoId) { + console.log(whepUrl) + webrtcClient = new WHEPClient(whepUrl, videoId); } </script> </body> -- Gitblit v1.9.3