old mode 100644
new mode 100755
 |  |  | 
 |  |  | 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.conf.security.JwtUtils; | 
 |  |  | 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 com.genersoft.iot.vmp.gb28181.transmit.cmd.impl.SIPCommander; | 
 |  |  | import com.genersoft.iot.vmp.service.IDeviceChannelService; | 
 |  |  | import com.genersoft.iot.vmp.service.IDeviceService; | 
 |  |  | import com.genersoft.iot.vmp.service.IInviteStreamService; | 
 |  |  | import com.genersoft.iot.vmp.storager.IRedisCatchStorage; | 
 |  |  | import com.genersoft.iot.vmp.storager.IVideoManagerStorage; | 
 |  |  | import com.genersoft.iot.vmp.vmanager.bean.BaseTree; | 
 |  |  | 
 |  |  | import com.github.pagehelper.PageInfo; | 
 |  |  | import io.swagger.v3.oas.annotations.Operation; | 
 |  |  | import io.swagger.v3.oas.annotations.Parameter; | 
 |  |  | import io.swagger.v3.oas.annotations.security.SecurityRequirement; | 
 |  |  | import io.swagger.v3.oas.annotations.tags.Tag; | 
 |  |  | import org.apache.commons.compress.utils.IOUtils; | 
 |  |  | import org.apache.http.HttpResponse; | 
 |  |  | import org.apache.ibatis.annotations.Options; | 
 |  |  | 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.ServletOutputStream; | 
 |  |  | 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.*; | 
 |  |  |  | 
 |  |  | @Tag(name  = "国标设备查询", description = "国标设备查询") | 
 |  |  | @SuppressWarnings("rawtypes") | 
 |  |  | @CrossOrigin | 
 |  |  |  | 
 |  |  | @RestController | 
 |  |  | @RequestMapping("/api/device/query") | 
 |  |  | public class DeviceQuery { | 
 |  |  | 
 |  |  |  | 
 |  |  |    @Autowired | 
 |  |  |    private IRedisCatchStorage redisCatchStorage; | 
 |  |  |  | 
 |  |  |    @Autowired | 
 |  |  |    private IInviteStreamService inviteStreamService; | 
 |  |  |     | 
 |  |  |    @Autowired | 
 |  |  |    private SIPCommander cmder; | 
 |  |  | 
 |  |  |     * @param deviceId 国标ID | 
 |  |  |     * @return 国标设备 | 
 |  |  |     */ | 
 |  |  |    @Operation(summary = "查询国标设备") | 
 |  |  |    @Operation(summary = "查询国标设备", security = @SecurityRequirement(name = JwtUtils.HEADER)) | 
 |  |  |    @Parameter(name = "deviceId", description = "设备国标编号", required = true) | 
 |  |  |    @GetMapping("/devices/{deviceId}") | 
 |  |  |    public Device devices(@PathVariable String deviceId){ | 
 |  |  | 
 |  |  |     * @param count 每页查询数量 | 
 |  |  |     * @return 分页国标列表 | 
 |  |  |     */ | 
 |  |  |    @Operation(summary = "分页查询国标设备") | 
 |  |  |    @Operation(summary = "分页查询国标设备", security = @SecurityRequirement(name = JwtUtils.HEADER)) | 
 |  |  |    @Parameter(name = "page", description = "当前页", required = true) | 
 |  |  |    @Parameter(name = "count", description = "每页查询数量", required = true) | 
 |  |  |    @GetMapping("/devices") | 
 |  |  |    @Options() | 
 |  |  |    public PageInfo<Device> devices(int page, int count){ | 
 |  |  | 		 | 
 |  |  |       return storager.queryVideoDeviceList(page, count); | 
 |  |  | //      if (page == null) page = 0; | 
 |  |  | //      if (count == null) count = 20; | 
 |  |  |       return storager.queryVideoDeviceList(page, count,null); | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    /** | 
 |  |  | 
 |  |  |     * @return 通道列表 | 
 |  |  |     */ | 
 |  |  |    @GetMapping("/devices/{deviceId}/channels") | 
 |  |  |    @Operation(summary = "分页查询通道") | 
 |  |  |    @Operation(summary = "分页查询通道", security = @SecurityRequirement(name = JwtUtils.HEADER)) | 
 |  |  |    @Parameter(name = "deviceId", description = "设备国标编号", required = true) | 
 |  |  |    @Parameter(name = "page", description = "当前页", required = true) | 
 |  |  |    @Parameter(name = "count", description = "每页查询数量", required = true) | 
 |  |  | 
 |  |  |    @Parameter(name = "online", description = "是否在线") | 
 |  |  |    @Parameter(name = "channelType", description = "设备/子目录-> false/true") | 
 |  |  |    @Parameter(name = "catalogUnderDevice", description = "是否直属与设备的目录") | 
 |  |  |    public PageInfo channels(@PathVariable String deviceId, | 
 |  |  |    public PageInfo<DeviceChannel> channels(@PathVariable String deviceId, | 
 |  |  |                                     int page, int count, | 
 |  |  |                                     @RequestParam(required = false) String query, | 
 |  |  |                                     @RequestParam(required = false) Boolean online, | 
 |  |  | 
 |  |  |     * @param deviceId 设备id | 
 |  |  |     * @return | 
 |  |  |     */ | 
 |  |  |    @Operation(summary = "同步设备通道") | 
 |  |  |    @Operation(summary = "同步设备通道", security = @SecurityRequirement(name = JwtUtils.HEADER)) | 
 |  |  |    @Parameter(name = "deviceId", description = "设备国标编号", required = true) | 
 |  |  |    @PostMapping("/devices/{deviceId}/sync") | 
 |  |  |    @GetMapping("/devices/{deviceId}/sync") | 
 |  |  |    public WVPResult<SyncStatus> devicesSync(@PathVariable String deviceId){ | 
 |  |  |        | 
 |  |  |       if (logger.isDebugEnabled()) { | 
 |  |  | 
 |  |  |     * @param deviceId 设备id | 
 |  |  |     * @return | 
 |  |  |     */ | 
 |  |  |    @Operation(summary = "移除设备") | 
 |  |  |    @Operation(summary = "移除设备", security = @SecurityRequirement(name = JwtUtils.HEADER)) | 
 |  |  |    @Parameter(name = "deviceId", description = "设备国标编号", required = true) | 
 |  |  |    @DeleteMapping("/devices/{deviceId}/delete") | 
 |  |  |    public String delete(@PathVariable String deviceId){ | 
 |  |  | 
 |  |  |       // 清除redis记录 | 
 |  |  |       boolean isSuccess = deviceService.delete(deviceId); | 
 |  |  |       if (isSuccess) { | 
 |  |  |          redisCatchStorage.clearCatchByDeviceId(deviceId); | 
 |  |  |          inviteStreamService.clearInviteInfo(deviceId); | 
 |  |  |          // 停止此设备的订阅更新 | 
 |  |  |          Set<String> allKeys = dynamicTask.getAllKeys(); | 
 |  |  |          for (String key : allKeys) { | 
 |  |  | 
 |  |  |     * @param channelType 通道类型 | 
 |  |  |     * @return 子通道列表 | 
 |  |  |     */ | 
 |  |  |    @Operation(summary = "分页查询子目录通道") | 
 |  |  |    @Operation(summary = "分页查询子目录通道", security = @SecurityRequirement(name = JwtUtils.HEADER)) | 
 |  |  |    @Parameter(name = "deviceId", description = "设备国标编号", required = true) | 
 |  |  |    @Parameter(name = "channelId", description = "通道国标编号", required = true) | 
 |  |  |    @Parameter(name = "page", description = "当前页", required = true) | 
 |  |  | 
 |  |  |    @Parameter(name = "online", description = "是否在线") | 
 |  |  |    @Parameter(name = "channelType", description = "设备/子目录-> false/true") | 
 |  |  |    @GetMapping("/sub_channels/{deviceId}/{channelId}/channels") | 
 |  |  |    public PageInfo subChannels(@PathVariable String deviceId, | 
 |  |  |    public PageInfo<DeviceChannel> subChannels(@PathVariable String deviceId, | 
 |  |  |                                       @PathVariable String channelId, | 
 |  |  |                                       int page, | 
 |  |  |                                       int count, | 
 |  |  | 
 |  |  |          return deviceChannelPageResult; | 
 |  |  |       } | 
 |  |  |  | 
 |  |  |       PageInfo pageResult = storager.querySubChannels(deviceId, channelId, query, channelType, online, page, count); | 
 |  |  |       return pageResult; | 
 |  |  |       return storager.querySubChannels(deviceId, channelId, query, channelType, online, page, count); | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    /** | 
 |  |  | 
 |  |  |     * @param channel 通道 | 
 |  |  |     * @return | 
 |  |  |     */ | 
 |  |  |    @Operation(summary = "更新通道信息") | 
 |  |  |    @Operation(summary = "更新通道信息", security = @SecurityRequirement(name = JwtUtils.HEADER)) | 
 |  |  |    @Parameter(name = "deviceId", description = "设备国标编号", required = true) | 
 |  |  |    @Parameter(name = "channel", description = "通道信息", required = true) | 
 |  |  |    @PostMapping("/channel/update/{deviceId}") | 
 |  |  | 
 |  |  |     * @param streamMode 数据流传输模式 | 
 |  |  |     * @return | 
 |  |  |     */ | 
 |  |  |    @Operation(summary = "修改数据流传输模式") | 
 |  |  |    @Operation(summary = "修改数据流传输模式", security = @SecurityRequirement(name = JwtUtils.HEADER)) | 
 |  |  |    @Parameter(name = "deviceId", description = "设备国标编号", required = true) | 
 |  |  |    @Parameter(name = "streamMode", description = "数据流传输模式, 取值:" + | 
 |  |  |          "UDP(udp传输),TCP-ACTIVE(tcp主动模式,暂不支持),TCP-PASSIVE(tcp被动模式)", required = true) | 
 |  |  | 
 |  |  |     * @param device 设备信息 | 
 |  |  |     * @return | 
 |  |  |     */ | 
 |  |  |    @Operation(summary = "添加设备信息") | 
 |  |  |    @Operation(summary = "添加设备信息", security = @SecurityRequirement(name = JwtUtils.HEADER)) | 
 |  |  |    @Parameter(name = "device", description = "设备", required = true) | 
 |  |  |    @PostMapping("/device/add/") | 
 |  |  |    public void addDevice(Device device){ | 
 |  |  | 
 |  |  |     * @param device 设备信息 | 
 |  |  |     * @return | 
 |  |  |     */ | 
 |  |  |    @Operation(summary = "更新设备信息") | 
 |  |  |    @Operation(summary = "更新设备信息", security = @SecurityRequirement(name = JwtUtils.HEADER)) | 
 |  |  |    @Parameter(name = "device", description = "设备", required = true) | 
 |  |  |    @PostMapping("/device/update/") | 
 |  |  |    public void updateDevice(Device device){ | 
 |  |  | 
 |  |  |     *  | 
 |  |  |     * @param deviceId 设备id | 
 |  |  |     */ | 
 |  |  |    @Operation(summary = "设备状态查询") | 
 |  |  |    @Operation(summary = "设备状态查询", security = @SecurityRequirement(name = JwtUtils.HEADER)) | 
 |  |  |    @Parameter(name = "deviceId", description = "设备国标编号", required = true) | 
 |  |  |    @GetMapping("/devices/{deviceId}/status") | 
 |  |  |    public DeferredResult<ResponseEntity<String>> deviceStatusApi(@PathVariable String deviceId) { | 
 |  |  | 
 |  |  |     * @param endTime      报警发生终止时间(可选) | 
 |  |  |     * @return            true = 命令发送成功 | 
 |  |  |     */ | 
 |  |  |    @Operation(summary = "设备状态查询") | 
 |  |  |    @Operation(summary = "设备报警查询", security = @SecurityRequirement(name = JwtUtils.HEADER)) | 
 |  |  |    @Parameter(name = "deviceId", description = "设备国标编号", required = true) | 
 |  |  |    @Parameter(name = "startPriority", description = "报警起始级别") | 
 |  |  |    @Parameter(name = "endPriority", description = "报警终止级别") | 
 |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  |    @GetMapping("/{deviceId}/sync_status") | 
 |  |  |    @Operation(summary = "获取通道同步进度") | 
 |  |  |    @Operation(summary = "获取通道同步进度", security = @SecurityRequirement(name = JwtUtils.HEADER)) | 
 |  |  |    @Parameter(name = "deviceId", description = "设备国标编号", required = true) | 
 |  |  |    public WVPResult<SyncStatus> getSyncStatus(@PathVariable String deviceId) { | 
 |  |  |       SyncStatus channelSyncStatus = deviceService.getChannelSyncStatus(deviceId); | 
 |  |  | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    @GetMapping("/{deviceId}/subscribe_info") | 
 |  |  |    @Operation(summary = "获取设备的订阅状态") | 
 |  |  |    @Operation(summary = "获取设备的订阅状态", security = @SecurityRequirement(name = JwtUtils.HEADER)) | 
 |  |  |    @Parameter(name = "deviceId", description = "设备国标编号", required = true) | 
 |  |  |    public WVPResult<Map<String, Integer>> getSubscribeInfo(@PathVariable String deviceId) { | 
 |  |  |       Set<String> allKeys = dynamicTask.getAllKeys(); | 
 |  |  | 
 |  |  |    @Operation(summary = "请求截图") | 
 |  |  |    @Parameter(name = "deviceId", description = "设备国标编号", required = true) | 
 |  |  |    @Parameter(name = "channelId", description = "通道国标编号", required = true) | 
 |  |  |    public void getSnap(HttpServletResponse resp, @PathVariable String deviceId, @PathVariable String channelId) { | 
 |  |  |    @Parameter(name = "mark", description = "标识", required = false) | 
 |  |  |    public void getSnap(HttpServletResponse resp, @PathVariable String deviceId, @PathVariable String channelId, @RequestParam(required = false) String mark) { | 
 |  |  |  | 
 |  |  |       try { | 
 |  |  |          final InputStream in = Files.newInputStream(new File("snap" + File.separator + deviceId + "_" + channelId + ".jpg").toPath()); | 
 |  |  |          final InputStream in = Files.newInputStream(new File("snap" + File.separator + deviceId + "_" + channelId + (mark == null? ".jpg": ("_" + mark + ".jpg"))).toPath()); | 
 |  |  |          resp.setContentType(MediaType.IMAGE_PNG_VALUE); | 
 |  |  |          ServletOutputStream outputStream = resp.getOutputStream(); | 
 |  |  |          IOUtils.copy(in, resp.getOutputStream()); | 
 |  |  |          in.close(); | 
 |  |  |          outputStream.close(); | 
 |  |  |       } catch (IOException e) { | 
 |  |  |          resp.setStatus(HttpServletResponse.SC_NOT_FOUND); | 
 |  |  |       } |