|  |  | 
 |  |  | package com.genersoft.iot.vmp.vmanager.gb28181.device; | 
 |  |  |  | 
 |  |  | import com.alibaba.fastjson.JSONObject; | 
 |  |  | import com.alibaba.fastjson2.JSONObject; | 
 |  |  | import com.genersoft.iot.vmp.conf.DynamicTask; | 
 |  |  | import com.genersoft.iot.vmp.conf.exception.ControllerException; | 
 |  |  | import com.genersoft.iot.vmp.gb28181.bean.Device; | 
 |  |  | import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; | 
 |  |  | import com.genersoft.iot.vmp.gb28181.bean.SubscribeHolder; | 
 |  |  | import com.genersoft.iot.vmp.gb28181.bean.SyncStatus; | 
 |  |  | import com.genersoft.iot.vmp.gb28181.task.ISubscribeTask; | 
 |  |  | import com.genersoft.iot.vmp.gb28181.task.impl.CatalogSubscribeTask; | 
 |  |  | 
 |  |  | import io.swagger.v3.oas.annotations.Parameter; | 
 |  |  | import io.swagger.v3.oas.annotations.tags.Tag; | 
 |  |  | import org.apache.commons.compress.utils.IOUtils; | 
 |  |  | import org.apache.http.HttpResponse; | 
 |  |  | import org.slf4j.Logger; | 
 |  |  | import org.slf4j.LoggerFactory; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | 
 |  |  | import org.springframework.http.MediaType; | 
 |  |  | import org.springframework.http.ResponseEntity; | 
 |  |  | import org.springframework.util.ObjectUtils; | 
 |  |  | import org.springframework.util.StringUtils; | 
 |  |  | import org.springframework.web.bind.annotation.*; | 
 |  |  | import org.springframework.web.context.request.async.DeferredResult; | 
 |  |  |  | 
 |  |  | import javax.servlet.http.HttpServletResponse; | 
 |  |  | import javax.sip.DialogState; | 
 |  |  | import javax.sip.InvalidArgumentException; | 
 |  |  | import javax.sip.SipException; | 
 |  |  | import java.io.*; | 
 |  |  | import java.io.File; | 
 |  |  | import java.io.IOException; | 
 |  |  | import java.io.InputStream; | 
 |  |  | import java.nio.file.Files; | 
 |  |  | import java.text.ParseException; | 
 |  |  | import java.util.*; | 
 |  |  | 
 |  |  |    @Autowired | 
 |  |  |    private DynamicTask dynamicTask; | 
 |  |  |  | 
 |  |  |    @Autowired | 
 |  |  |    private SubscribeHolder subscribeHolder; | 
 |  |  |  | 
 |  |  |    /** | 
 |  |  |     * 使用ID查询国标设备 | 
 |  |  |     * @param deviceId 国标ID | 
 |  |  | 
 |  |  |    @GetMapping("/devices") | 
 |  |  |    public PageInfo<Device> devices(int page, int count){ | 
 |  |  |        | 
 |  |  |       return storager.queryVideoDeviceList(page, count); | 
 |  |  |       return storager.queryVideoDeviceList(page, count,null); | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    /** | 
 |  |  | 
 |  |  |     */ | 
 |  |  |    @Operation(summary = "同步设备通道") | 
 |  |  |    @Parameter(name = "deviceId", description = "设备国标编号", required = true) | 
 |  |  |    @PostMapping("/devices/{deviceId}/sync") | 
 |  |  |    @GetMapping("/devices/{deviceId}/sync") | 
 |  |  |    public WVPResult<SyncStatus> devicesSync(@PathVariable String deviceId){ | 
 |  |  |        | 
 |  |  |       if (logger.isDebugEnabled()) { | 
 |  |  | 
 |  |  |       } | 
 |  |  |  | 
 |  |  |       // 清除redis记录 | 
 |  |  |       boolean isSuccess = storager.delete(deviceId); | 
 |  |  |       boolean isSuccess = deviceService.delete(deviceId); | 
 |  |  |       if (isSuccess) { | 
 |  |  |          redisCatchStorage.clearCatchByDeviceId(deviceId); | 
 |  |  |          // 停止此设备的订阅更新 | 
 |  |  | 
 |  |  |    @Parameter(name = "online", description = "是否在线") | 
 |  |  |    @Parameter(name = "channelType", description = "设备/子目录-> false/true") | 
 |  |  |    @GetMapping("/sub_channels/{deviceId}/{channelId}/channels") | 
 |  |  |    public ResponseEntity<PageInfo> subChannels(@PathVariable String deviceId, | 
 |  |  |    public PageInfo subChannels(@PathVariable String deviceId, | 
 |  |  |                                       @PathVariable String channelId, | 
 |  |  |                                       int page, | 
 |  |  |                                       int count, | 
 |  |  | 
 |  |  |       DeviceChannel deviceChannel = storager.queryChannel(deviceId,channelId); | 
 |  |  |       if (deviceChannel == null) { | 
 |  |  |          PageInfo<DeviceChannel> deviceChannelPageResult = new PageInfo<>(); | 
 |  |  |          return new ResponseEntity<>(deviceChannelPageResult,HttpStatus.OK); | 
 |  |  |          return deviceChannelPageResult; | 
 |  |  |       } | 
 |  |  |  | 
 |  |  |       PageInfo pageResult = storager.querySubChannels(deviceId, channelId, query, channelType, online, page, count); | 
 |  |  |       return new ResponseEntity<>(pageResult,HttpStatus.OK); | 
 |  |  |       return pageResult; | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    /** | 
 |  |  | 
 |  |  |    @Parameter(name = "deviceId", description = "设备国标编号", required = true) | 
 |  |  |    @Parameter(name = "channel", description = "通道信息", required = true) | 
 |  |  |    @PostMapping("/channel/update/{deviceId}") | 
 |  |  |    public ResponseEntity updateChannel(@PathVariable String deviceId,DeviceChannel channel){ | 
 |  |  |    public void updateChannel(@PathVariable String deviceId,DeviceChannel channel){ | 
 |  |  |       deviceChannelService.updateChannel(deviceId, channel); | 
 |  |  |       return new ResponseEntity<>(null,HttpStatus.OK); | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    /** | 
 |  |  | 
 |  |  |    @Parameter(name = "streamMode", description = "数据流传输模式, 取值:" + | 
 |  |  |          "UDP(udp传输),TCP-ACTIVE(tcp主动模式,暂不支持),TCP-PASSIVE(tcp被动模式)", required = true) | 
 |  |  |    @PostMapping("/transport/{deviceId}/{streamMode}") | 
 |  |  |    public ResponseEntity updateTransport(@PathVariable String deviceId, @PathVariable String streamMode){ | 
 |  |  |       Device device = storager.queryVideoDevice(deviceId); | 
 |  |  |    public void updateTransport(@PathVariable String deviceId, @PathVariable String streamMode){ | 
 |  |  |       Device device = deviceService.getDevice(deviceId); | 
 |  |  |       device.setStreamMode(streamMode); | 
 |  |  |       deviceService.updateDevice(device); | 
 |  |  |       return new ResponseEntity<>(null,HttpStatus.OK); | 
 |  |  |       deviceService.updateCustomDevice(device); | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    /** | 
 |  |  |     * 添加设备信息 | 
 |  |  |     * @param device 设备信息 | 
 |  |  |     * @return | 
 |  |  |     */ | 
 |  |  |    @Operation(summary = "添加设备信息") | 
 |  |  |    @Parameter(name = "device", description = "设备", required = true) | 
 |  |  |    @PostMapping("/device/add/") | 
 |  |  |    public void addDevice(Device device){ | 
 |  |  |  | 
 |  |  |       if (device == null || device.getDeviceId() == null) { | 
 |  |  |          throw new ControllerException(ErrorCode.ERROR400); | 
 |  |  |       } | 
 |  |  |  | 
 |  |  |       // 查看deviceId是否存在 | 
 |  |  |       boolean exist = deviceService.isExist(device.getDeviceId()); | 
 |  |  |       if (exist) { | 
 |  |  |          throw new ControllerException(ErrorCode.ERROR100.getCode(), "设备编号已存在"); | 
 |  |  |       } | 
 |  |  |       deviceService.addDevice(device); | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    /** | 
 |  |  | 
 |  |  |    @Operation(summary = "更新设备信息") | 
 |  |  |    @Parameter(name = "device", description = "设备", required = true) | 
 |  |  |    @PostMapping("/device/update/") | 
 |  |  |    public ResponseEntity<WVPResult<String>> updateDevice(Device device){ | 
 |  |  |    public void updateDevice(Device device){ | 
 |  |  |  | 
 |  |  |       if (device != null && device.getDeviceId() != null) { | 
 |  |  |          deviceService.updateDevice(device); | 
 |  |  |          deviceService.updateCustomDevice(device); | 
 |  |  |       } | 
 |  |  |       WVPResult<String> result = new WVPResult<>(); | 
 |  |  |       result.setCode(0); | 
 |  |  |       result.setMsg("success"); | 
 |  |  |       return new ResponseEntity<>(result,HttpStatus.OK); | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    /** |