package com.sandu.ximon.admin.service; import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.sandu.common.execption.BusinessException; import com.sandu.common.service.impl.BaseServiceImpl; import com.sandu.ximon.admin.param.MonitorParam; import com.sandu.ximon.dao.domain.Monitor; import com.sandu.ximon.dao.domain.YSY_AccessTokenDto; import com.sandu.ximon.dao.domain.YSY_MonitorDto; import com.sandu.ximon.dao.mapper.MonitorMapper; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.List; import java.util.Map; @Service @AllArgsConstructor public class MonitorService extends BaseServiceImpl { private final MonitorMapper monitorMapper; //萤石云AppKey private static final String AppKey = "51a534ebadf54c31a0848dc575dfa206"; //萤石云 AppKey Secret private static final String Secret = "8c32c67a73c87b9e461b2e3bdf58967a"; //萤石云地址 private static final String YSY_URL = "https://open.ys7.com/api/lapp"; //获取萤石云accessToken地址 private static final String ACCESSTOKEN_URL = "/token/get"; //添加萤石云摄像头 private static final String ADD_DEVICE_URL = "/device/add"; //删除萤石云摄像头 private static final String DELETE_DEVICE_URL = "/device/delete"; //获取萤石云单个设备信息 private static final String GET_DEVICE_URL = "/device/info"; //获取萤石云摄像头播放地址URL private static final String GET_VEDIO_URL = "/v2/live/address/get"; /** * 查询全部摄像头 */ public List listMonitor() { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(Monitor.class); List list = list(wrapper); return list; } /** * 模糊查询 */ public List listMonitorByKeyword(MonitorParam monitorParam) { //设备状态:在线/离线/全部 int equipmentState1; int equipmentState2; if (2 == monitorParam.getEquipmentState()) { //在线 equipmentState1 = 1; //离线 equipmentState2 = 0; } else { equipmentState1 = monitorParam.getEquipmentState(); equipmentState2 = monitorParam.getEquipmentState(); } //绑定状态:已绑定/未绑定/全部 int bindingState1; int bindingState2; if (2 == monitorParam.getBindingState()) { //已绑定 bindingState1 = 1; //未绑定 bindingState2 = 0; } else { bindingState1 = monitorParam.getBindingState(); bindingState2 = monitorParam.getBindingState(); } return monitorMapper.listMonitorByKeyword(monitorParam.getKeyword(), equipmentState1, equipmentState2, bindingState1, bindingState2); } /** * 删除摄像头 * * @param Id * @return */ public boolean deleteMonitor(Long Id) { Monitor monitor = getById(Id); if (monitor == null) { throw new BusinessException("找不到摄像头"); } return removeById(Id); } /** * 获取萤石云accessToken */ public String getAccessToken() { Map paramMap = new HashMap<>(); paramMap.put("appKey", AppKey); paramMap.put("appSecret", Secret); String s = HttpUtil.post(YSY_URL + ACCESSTOKEN_URL, paramMap); YSY_AccessTokenDto accessTokenDto = JSON.parseObject(s, YSY_AccessTokenDto.class); return accessTokenDto.getData().getAccessToken(); } /** * 添加萤石云摄像头 * * @param accessToken 授权过程获取的access_token * @param deviceSerial 设备序列号,存在英文字母的设备序列号,字母需为大写 * @param validateCode 设备验证码,设备机身上的六位大写字母 */ public YSY_MonitorDto addYSYMonitor(String accessToken, String deviceSerial, String validateCode) { Map paramMap = new HashMap<>(); paramMap.put("accessToken", accessToken); paramMap.put("deviceSerial", deviceSerial); paramMap.put("validateCode", validateCode); String s = HttpUtil.post(YSY_URL + ADD_DEVICE_URL, paramMap); System.out.println(s); YSY_MonitorDto monitorDto = JSON.parseObject(s, YSY_MonitorDto.class); return monitorDto; } /** * 删除萤石云摄像头 * * @param accessToken 授权过程获取的access_token * @param deviceSerial 设备序列号,存在英文字母的设备序列号,字母需为大写 */ public YSY_MonitorDto deleteYSYMonitor(String accessToken, String deviceSerial) { Map paramMap = new HashMap<>(); paramMap.put("accessToken", accessToken); paramMap.put("deviceSerial", deviceSerial); String s = HttpUtil.post(YSY_URL + DELETE_DEVICE_URL, paramMap); System.out.println(s); YSY_MonitorDto monitorDto = JSON.parseObject(s, YSY_MonitorDto.class); return monitorDto; } /** * 获取萤石云摄像头单个设备信息 * * @param accessToken 授权过程获取的access_token * @param deviceSerial 设备序列号,存在英文字母的设备序列号,字母需为大写 */ public YSY_MonitorDto getYSYMonitorInfo(String accessToken, String deviceSerial) { Map paramMap = new HashMap<>(); paramMap.put("accessToken", accessToken); paramMap.put("deviceSerial", deviceSerial); String s = HttpUtil.post(YSY_URL + GET_DEVICE_URL, paramMap); System.out.println(s); YSY_MonitorDto monitor = JSON.parseObject(s, YSY_MonitorDto.class); return monitor; } /** * 将摄像头设备相关信息存储到数据库 * * @param monitor 摄像头对象 * @return */ public boolean addMonitorInfoToTable(Monitor monitor) { Monitor one = getOne(Wrappers.lambdaQuery(Monitor.class).eq(Monitor::getDeviceSerial, monitor.getDeviceSerial())); if (one == null) { return save(monitor); } else { monitor.setId(one.getId()); return updateById(monitor); } } /** * 将摄像头设备相关信息更新到数据库 * * @param monitor 摄像头对象 * @return */ public boolean upDateMonitorInfo(Monitor monitor) { if (monitor.getId() == null) { throw new BusinessException("缺少摄像头相关ID参数"); } Monitor info = getById(monitor.getId()); if (info == null) { throw new BusinessException("找不到相关摄像头"); } if (!monitor.getDevicesCode().equals(info.getDevicesCode()) || !monitor.getDeviceSerial().equals(info.getDeviceSerial())) { throw new BusinessException("监控序列号或监控验证码不正确"); } return updateById(monitor); } /** * 返回摄像头实时画面播放地址 * * @param accessToken * @param deviceSerial * @return */ public String getMonitorVideoUrl(String accessToken, String deviceSerial, int protocol) { Map paramMap = new HashMap<>(); paramMap.put("accessToken", accessToken); paramMap.put("deviceSerial", deviceSerial); paramMap.put("protocol", protocol); String s = HttpUtil.post(YSY_URL + GET_VEDIO_URL, paramMap); System.out.println(s); YSY_MonitorDto monitor = JSON.parseObject(s, YSY_MonitorDto.class); if ("200".equals(monitor.getCode())) { return monitor.getData().getUrl(); } else { throw new BusinessException(monitor.getMsg()); } } }