时间显示优化
This commit is contained in:
parent
8b1ecd7b9d
commit
cdb2bc5f87
|
@ -16,6 +16,6 @@ public class PeopleRecognize {
|
||||||
private String channelName;
|
private String channelName;
|
||||||
private String picUrl;
|
private String picUrl;
|
||||||
private Integer personNum;
|
private Integer personNum;
|
||||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
|
||||||
private Date pushTime;
|
private Date insertTime;
|
||||||
}
|
}
|
||||||
|
|
|
@ -208,6 +208,453 @@ public class MonitorService {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Scheduled(cron = "0 0 8 1/1 * ?")
|
||||||
|
public void construction() {
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
log.info("[monitor-capture]: start capture1");
|
||||||
|
|
||||||
|
List<ChannelLabelDto> labels = cameraChannelMapper.selectLabelAndChannel("1009,1008");
|
||||||
|
labels.forEach(label -> {
|
||||||
|
String channelCode = label.getChannelCode();
|
||||||
|
try {
|
||||||
|
BufferedImage bufferedImage = capturecreenshot(channelCode);
|
||||||
|
String fileName = channelCode + ".jpg";
|
||||||
|
ImageIO.write(bufferedImage, "jpg", new File(fileDir + "/images/" + fileName));
|
||||||
|
|
||||||
|
String picUrl = picHost + "/images/" + fileName;
|
||||||
|
|
||||||
|
ChannelPicture picture = new ChannelPicture();
|
||||||
|
picture.setChannelCode(channelCode);
|
||||||
|
picture.setPicUrl(picUrl);
|
||||||
|
/*picture.setInsertTime(new Date());
|
||||||
|
channelPictureMapper.insert(picture);*/
|
||||||
|
if (channelCode == null){
|
||||||
|
channelPictureMapper.insert(picture);
|
||||||
|
}else {
|
||||||
|
QueryWrapper<ChannelPicture> queryWrapper = new QueryWrapper<>();
|
||||||
|
queryWrapper.eq("channel_code", channelCode);
|
||||||
|
picture.setInsertTime(new Date());
|
||||||
|
channelPictureMapper.update(picture, queryWrapper);
|
||||||
|
}
|
||||||
|
}catch (Exception e){
|
||||||
|
|
||||||
|
log.info( "[monitor-capture] " +channelCode + " 截图图片失败 " + e.getMessage());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
log.info("[monitor-capture]: end capture1");
|
||||||
|
}catch (Exception exception){
|
||||||
|
exception.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Scheduled(cron = "0 0 8/1 * * ?")
|
||||||
|
public void scenicSpotAndBathing() {
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
log.info("[monitor-capture]: start capture");
|
||||||
|
|
||||||
|
List<ChannelLabelDto> labels = cameraChannelMapper.selectLabelAndChannel("1006,1004");
|
||||||
|
labels.forEach(label -> {
|
||||||
|
String channelCode = label.getChannelCode();
|
||||||
|
try {
|
||||||
|
BufferedImage bufferedImage = capturecreenshot(channelCode);
|
||||||
|
String fileName = channelCode + ".jpg";
|
||||||
|
ImageIO.write(bufferedImage, "jpg", new File(fileDir + "/images/" + fileName));
|
||||||
|
|
||||||
|
String picUrl = picHost + "/images/" + fileName;
|
||||||
|
|
||||||
|
ChannelPicture picture = new ChannelPicture();
|
||||||
|
picture.setChannelCode(channelCode);
|
||||||
|
picture.setPicUrl(picUrl);
|
||||||
|
/*picture.setInsertTime(new Date());
|
||||||
|
channelPictureMapper.insert(picture);*/
|
||||||
|
if (channelCode == null){
|
||||||
|
channelPictureMapper.insert(picture);
|
||||||
|
}else {
|
||||||
|
QueryWrapper<ChannelPicture> queryWrapper = new QueryWrapper<>();
|
||||||
|
queryWrapper.eq("channel_code", channelCode);
|
||||||
|
picture.setInsertTime(new Date());
|
||||||
|
channelPictureMapper.update(picture, queryWrapper);
|
||||||
|
}
|
||||||
|
}catch (Exception e){
|
||||||
|
|
||||||
|
log.info( "[monitor-capture] " +channelCode + " 截图图片失败 " + e.getMessage());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
log.info("[monitor-capture]: end capture");
|
||||||
|
}catch (Exception exception){
|
||||||
|
exception.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 海水浴场人群图片算法识别
|
||||||
|
*/
|
||||||
|
public void bathingBeach () {
|
||||||
|
try {
|
||||||
|
|
||||||
|
log.info("[monitor-capture]: start capture");
|
||||||
|
|
||||||
|
List<ChannelLabelDto> labels = cameraChannelMapper.selectLabelAndChannel("1006");
|
||||||
|
labels.forEach(label -> {
|
||||||
|
String channelCode = label.getChannelCode();
|
||||||
|
try {
|
||||||
|
BufferedImage bufferedImage = capturecreenshot(channelCode);
|
||||||
|
String fileName = channelCode + ".jpg";
|
||||||
|
ImageIO.write(bufferedImage, "jpg", new File(fileDir + "/images/" + fileName));
|
||||||
|
String picUrl = picHost + "/images/" + fileName;
|
||||||
|
//人流识别
|
||||||
|
String personNumUrl = "http://15.72.184.10:8003/cshi_rpc/v1.0/person";
|
||||||
|
Map personImage = new HashMap<>();
|
||||||
|
ByteArrayOutputStream stream = new ByteArrayOutputStream();
|
||||||
|
ImageIO.write(bufferedImage, "png", stream);
|
||||||
|
String imgBase64 = Base64Utils.encodeToString(stream.toByteArray());
|
||||||
|
stream.flush();
|
||||||
|
stream.close();
|
||||||
|
personImage.put("img_base64", imgBase64);
|
||||||
|
ResponseEntity<HashMap> responseEntity = restTemplate.postForEntity(personNumUrl, personImage, HashMap.class);
|
||||||
|
HashMap body = responseEntity.getBody();
|
||||||
|
if (body != null && (Integer) body.get("code") == 200){
|
||||||
|
Map data = (Map) body.get("data");
|
||||||
|
log.info(picUrl);
|
||||||
|
log.info("人流识别算法" + data);
|
||||||
|
}
|
||||||
|
}catch (Exception e){
|
||||||
|
log.info( "[monitor-capture] " +channelCode + " 截图图片失败 " + e.getMessage());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
log.info("[monitor-capture]: end capture");
|
||||||
|
}catch (Exception exception){
|
||||||
|
exception.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 安保区域人群图片算法识别并保存到数据库
|
||||||
|
*/
|
||||||
|
@Scheduled(cron = "0 0 8/2 * * ?")
|
||||||
|
public void peopleRecognize() {
|
||||||
|
try {
|
||||||
|
log.info("[monitor-capture]: start capture");
|
||||||
|
|
||||||
|
List<ChannelLabelDto> labels = cameraChannelMapper.selectLabelAndChannel("1042");
|
||||||
|
labels.forEach(label -> {
|
||||||
|
String channelCode = label.getChannelCode();
|
||||||
|
try {
|
||||||
|
BufferedImage bufferedImage = capturecreenshot(channelCode);
|
||||||
|
String fileName = channelCode + ".jpg";
|
||||||
|
ImageIO.write(bufferedImage, "jpg", new File(fileDir + "/images/" + fileName));
|
||||||
|
String picUrl = picHost + "/images/" + fileName;
|
||||||
|
//人流识别
|
||||||
|
String personNumUrl = "http://15.72.184.10:8003/cshi_rpc/v1.0/person";
|
||||||
|
Map personImage = new HashMap<>();
|
||||||
|
ByteArrayOutputStream stream = new ByteArrayOutputStream();
|
||||||
|
ImageIO.write(bufferedImage, "png", stream);
|
||||||
|
String imgBase64 = Base64Utils.encodeToString(stream.toByteArray());
|
||||||
|
stream.flush();
|
||||||
|
stream.close();
|
||||||
|
personImage.put("img_base64", imgBase64);
|
||||||
|
ResponseEntity<HashMap> responseEntity = restTemplate.postForEntity(personNumUrl, personImage, HashMap.class);
|
||||||
|
HashMap body = responseEntity.getBody();
|
||||||
|
if (body != null && (Integer) body.get("code") == 200){
|
||||||
|
Map data = (Map) body.get("data");
|
||||||
|
Integer personNum = (Integer) data.get("person_num");
|
||||||
|
PeopleRecognize peopleRecognize = new PeopleRecognize();
|
||||||
|
peopleRecognize.setChannelCode(channelCode);
|
||||||
|
peopleRecognize.setChannelName(label.getChannelName());
|
||||||
|
peopleRecognize.setPicUrl(picUrl);
|
||||||
|
peopleRecognize.setPersonNum(personNum);
|
||||||
|
if (channelCode == null){
|
||||||
|
peopleRecognizeMapper.insert(peopleRecognize);
|
||||||
|
}else {
|
||||||
|
QueryWrapper<PeopleRecognize> queryWrapper = new QueryWrapper<>();
|
||||||
|
queryWrapper.eq("channel_code", channelCode);
|
||||||
|
peopleRecognize.setInsertTime(new Date());
|
||||||
|
peopleRecognizeMapper.update(peopleRecognize, queryWrapper);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}catch (Exception e){
|
||||||
|
log.info( "[monitor-capture] " +channelCode + " 截图图片失败 " + e.getMessage());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
log.info("[monitor-capture]: end capture");
|
||||||
|
}catch (Exception exception){
|
||||||
|
exception.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 景区人流量识别
|
||||||
|
*/
|
||||||
|
@Scheduled(cron = "0 0 9 * * ?")
|
||||||
|
public void startScenic() {
|
||||||
|
try {
|
||||||
|
|
||||||
|
log.info("[monitor-capture]: startScenic capture");
|
||||||
|
|
||||||
|
List<Camera> cameras = scenicMapper.selectCamerasInScenic();
|
||||||
|
cameras.forEach(camera -> {
|
||||||
|
String cameraCode = camera.getCode();
|
||||||
|
try {
|
||||||
|
BufferedImage bufferedImage = capturecreenshot(cameraCode);
|
||||||
|
String fileName = cameraCode + ".jpg";
|
||||||
|
ImageIO.write(bufferedImage, "jpg", new File(fileDir + "/images/" + fileName));
|
||||||
|
|
||||||
|
String picUrl = picHost + "/images/" + fileName;
|
||||||
|
camera.setPic(picUrl);
|
||||||
|
camera.setCaptureTime(new Date());
|
||||||
|
cameraMapper.updateById(camera);
|
||||||
|
//人流识别
|
||||||
|
String personNumUrl = "http://15.72.184.10:8003/cshi_rpc/v1.0/person";
|
||||||
|
Map personImage = new HashMap<>();
|
||||||
|
ByteArrayOutputStream stream = new ByteArrayOutputStream();
|
||||||
|
ImageIO.write(bufferedImage, "png", stream);
|
||||||
|
String imgBase64 = Base64Utils.encodeToString(stream.toByteArray());
|
||||||
|
stream.flush();
|
||||||
|
stream.close();
|
||||||
|
personImage.put("img_base64", imgBase64);
|
||||||
|
ResponseEntity<HashMap> responseEntity = restTemplate.postForEntity(personNumUrl, personImage, HashMap.class);
|
||||||
|
HashMap body = responseEntity.getBody();
|
||||||
|
if (body != null && (Integer) body.get("code") == 200){
|
||||||
|
Map data = (Map) body.get("data");
|
||||||
|
Integer personNum = (Integer) data.get("person_num");
|
||||||
|
CameraScenic cameraScenic = new CameraScenic();
|
||||||
|
cameraScenic.setCameraId(cameraCode);
|
||||||
|
cameraScenic.setPersonNum(personNum);
|
||||||
|
|
||||||
|
CameraScenic cs = cameraScenicMapper.selectById(cameraCode);
|
||||||
|
if (cs == null){
|
||||||
|
cameraScenicMapper.insert(cameraScenic);
|
||||||
|
}else {
|
||||||
|
cameraScenicMapper.updateById(cameraScenic);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e){
|
||||||
|
|
||||||
|
log.info( "[monitor-capture] " +cameraCode + " 人流识别失败 " + e.getMessage());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
log.info("[monitor-capture]: startScenic end capture");
|
||||||
|
}catch (Exception exception){
|
||||||
|
exception.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private BufferedImage capturecreenshot(String code) throws IOException {
|
||||||
|
String url = monitorDomain + "/videoService/realmonitor/uri?scheme=HLS&channelId=" + code;
|
||||||
|
|
||||||
|
HttpHeaders headers = new HttpHeaders();
|
||||||
|
headers.add("X-Subject-Token",token);
|
||||||
|
|
||||||
|
ResponseEntity<HashMap> forEntity = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity(headers), HashMap.class );
|
||||||
|
|
||||||
|
HashMap body = forEntity.getBody();
|
||||||
|
|
||||||
|
String file = (String) body.get("url");
|
||||||
|
|
||||||
|
log.debug("开始抓流:" + file);
|
||||||
|
|
||||||
|
FFmpegFrameGrabber grabber = FFmpegFrameGrabber.createDefault(file);
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
grabber.setOption("stimoout", "10*1000*1000");
|
||||||
|
grabber.setOption("timeout", "10*1000*1000");
|
||||||
|
grabber.start();
|
||||||
|
|
||||||
|
log.debug("grabber启动成功");
|
||||||
|
|
||||||
|
int frameIndex = 60;
|
||||||
|
Java2DFrameConverter converter = new Java2DFrameConverter();
|
||||||
|
while (true){
|
||||||
|
Frame frame = grabber.grabImage();
|
||||||
|
if (frame != null) {
|
||||||
|
log.debug("grabber 跳帧:" + frameIndex);
|
||||||
|
if (frameIndex-- > 0) continue;
|
||||||
|
BufferedImage bufferedImage = converter.getBufferedImage(frame);
|
||||||
|
return bufferedImage;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}catch (Exception e){
|
||||||
|
throw e;
|
||||||
|
}finally {
|
||||||
|
grabber.stop();
|
||||||
|
grabber.release();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取路径返回给前端
|
||||||
|
* @param code
|
||||||
|
* @return
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public String fileCode(String code)throws IOException{
|
||||||
|
String url = monitorDomain + "/videoService/realmonitor/uri?scheme=HLS&channelId=" + code;
|
||||||
|
|
||||||
|
HttpHeaders headers = new HttpHeaders();
|
||||||
|
headers.add("X-Subject-Token",token);
|
||||||
|
|
||||||
|
System.out.println(token);
|
||||||
|
|
||||||
|
ResponseEntity<HashMap> forEntity = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity(headers), HashMap.class );
|
||||||
|
|
||||||
|
HashMap body = forEntity.getBody();
|
||||||
|
|
||||||
|
String file = (String) body.get("url");
|
||||||
|
|
||||||
|
|
||||||
|
return file;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static public List cameras = new LinkedList<Map>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 调用接口获取摄像头和组织
|
||||||
|
* @param parentId
|
||||||
|
* @param path
|
||||||
|
* @throws IOException
|
||||||
|
* @throws InterruptedException
|
||||||
|
*/
|
||||||
|
public void videoService(String parentId, String path) throws IOException, InterruptedException {
|
||||||
|
|
||||||
|
String url = monitorDomain + "/videoService/devicesManager/deviceTree?nodeType=1&typeCode=01;0;ALL;ALL&id=" + parentId;
|
||||||
|
|
||||||
|
HttpHeaders headers = new HttpHeaders();
|
||||||
|
|
||||||
|
headers.add("X-Subject-Token",token);
|
||||||
|
|
||||||
|
ResponseEntity<List> forEntity = null;
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
try {
|
||||||
|
forEntity = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity(headers), List.class );
|
||||||
|
break;
|
||||||
|
}catch (Exception e){
|
||||||
|
log.error("重试次数:{} url:{}",i,url);
|
||||||
|
log.error(e);
|
||||||
|
Thread.sleep(5*1000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (forEntity == null) return;
|
||||||
|
List<Map> results = forEntity.getBody();
|
||||||
|
|
||||||
|
// log.debug("response {}", JSONObject.toJSONString(results));
|
||||||
|
String sep = "->";
|
||||||
|
|
||||||
|
for (Map result : results) {
|
||||||
|
Boolean isParent = (Boolean) result.get("isParent");
|
||||||
|
|
||||||
|
if (isParent){
|
||||||
|
CameraOrganization cameraOrganization = JSONObject.parseObject(JSONObject.toJSONString(result), CameraOrganization.class);
|
||||||
|
|
||||||
|
cameraOrgenMapper.insert(cameraOrganization);
|
||||||
|
|
||||||
|
videoService((String) result.get("id"),path + sep + result.get("name"));
|
||||||
|
}else {
|
||||||
|
if (result.get("channelId") != null){
|
||||||
|
CameraChannel cameraChannel = JSONObject.parseObject(JSONObject.toJSONString(result), CameraChannel.class);
|
||||||
|
|
||||||
|
String id = (String)result.get("orgCode");
|
||||||
|
|
||||||
|
if (path != null && path.startsWith(sep)) {
|
||||||
|
path = path.substring(sep.length());
|
||||||
|
}
|
||||||
|
cameraChannel.setNodeName(path);
|
||||||
|
|
||||||
|
cameraChannel.setParentId(id);
|
||||||
|
|
||||||
|
cameraChannelMapper.insert(cameraChannel);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//查询视频点播巡检结果
|
||||||
|
@Scheduled(cron="0 5 6 * * ?")
|
||||||
|
public Result listChannelPlayStates(){
|
||||||
|
//获取当前时间和前一天的UTC时间
|
||||||
|
Map<String,Object> condition = new HashMap<>();
|
||||||
|
ZonedDateTime endUTC = ZonedDateTime.now(ZoneOffset.UTC);
|
||||||
|
ZonedDateTime startUTC = endUTC.minusDays(60);
|
||||||
|
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmmss'Z'");
|
||||||
|
condition.put("checkStatus",0);
|
||||||
|
condition.put("startTime",dateTimeFormatter.format(startUTC));
|
||||||
|
condition.put("endTime",dateTimeFormatter.format(endUTC));
|
||||||
|
//组装查询条件,经过验证pageSize设置过大也没效果,最大512
|
||||||
|
Map<String,Object> map = new HashMap<>();
|
||||||
|
map.put("condition",condition);
|
||||||
|
map.put("page",1);
|
||||||
|
map.put("pageSize",500);//最多一次512条
|
||||||
|
//查询路径和请求头信息
|
||||||
|
String url = monitorDomain + "/nms/api/channel/play/list";
|
||||||
|
HttpHeaders headers = new HttpHeaders();
|
||||||
|
headers.add("X-Subject-Token",token);
|
||||||
|
|
||||||
|
//查询数据的页数
|
||||||
|
int pageCount = 0;
|
||||||
|
//查询结果
|
||||||
|
List<Map> list = new ArrayList<>();
|
||||||
|
|
||||||
|
HttpEntity<Map<String,Object>> request = new HttpEntity<>(map,headers);
|
||||||
|
ResponseEntity<JSONObject> responseEntity = restTemplate.exchange(url, HttpMethod.POST, request, JSONObject.class );
|
||||||
|
JSONObject entityBody = responseEntity.getBody();
|
||||||
|
if (entityBody.get("i18n") != null && entityBody.get("i18n").toString() == "error"){
|
||||||
|
log.info("{}程序异常{}",entityBody.get("message").toString());
|
||||||
|
}
|
||||||
|
List<Map> results = (List<Map>) entityBody.get("results");
|
||||||
|
if(!results.isEmpty()){
|
||||||
|
list.addAll(results);
|
||||||
|
pageCount = entityBody.getIntValue("totalCount")/500 + 1;
|
||||||
|
}
|
||||||
|
for(int i = 2;i<=pageCount;i++){
|
||||||
|
map.put("page",i);
|
||||||
|
HttpEntity<Map<String,Object>> request2 = new HttpEntity<>(map,headers);
|
||||||
|
ResponseEntity<JSONObject> responseEntity2 = restTemplate.exchange(url, HttpMethod.POST, request2, JSONObject.class );
|
||||||
|
JSONObject entityBody2 = responseEntity2.getBody();
|
||||||
|
List<Map> results2 = (List<Map>) entityBody2.get("results");
|
||||||
|
if(!results2.isEmpty()){
|
||||||
|
list.addAll(results);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// List<CameraCheck> list1 = JSONObject.parseArray(JSONObject.toJSONString(jsonArray),CameraCheck.class);
|
||||||
|
// Map<String, CameraCheck> collect = list.stream().collect(Collectors.groupingBy(
|
||||||
|
// CameraCheck::getChannelCode,
|
||||||
|
// Collectors.collectingAndThen(
|
||||||
|
// Collectors.reducing((c1, c2) -> c1.getCheckTime().compareTo(c2.getCheckTime()) > 0 ? c1 : c2), Optional::get)
|
||||||
|
// )
|
||||||
|
// );
|
||||||
|
//
|
||||||
|
//通过set对channel_code去重
|
||||||
|
Set<String> set = new HashSet<>();
|
||||||
|
|
||||||
|
for(Map m:list){
|
||||||
|
set.add(m.get("channelCode").toString());
|
||||||
|
}
|
||||||
|
List<String> lists = new ArrayList<>(set.size());
|
||||||
|
lists.addAll(set);
|
||||||
|
//根据channel_code对t_camera_channel表的status字段进行更新(0)
|
||||||
|
List<List<String>> listMap = Lists.partition(lists,100);
|
||||||
|
for(List<String> ll:listMap){
|
||||||
|
cameraChannelMapper.updateCameraStatus(ll);
|
||||||
|
}
|
||||||
|
log.info("{} 查询视频点播巡检成功,发现异常数量:{}",LocalDateTime.now(),set.size());
|
||||||
|
return Result.success();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 特定摊点8:20抓图
|
* 特定摊点8:20抓图
|
||||||
*/
|
*/
|
||||||
|
@ -544,451 +991,6 @@ public class MonitorService {
|
||||||
exception.printStackTrace();
|
exception.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@Scheduled(cron = "0 0 8 1/1 * ?")
|
|
||||||
public void construction() {
|
|
||||||
|
|
||||||
try {
|
|
||||||
|
|
||||||
log.info("[monitor-capture]: start capture1");
|
|
||||||
|
|
||||||
List<ChannelLabelDto> labels = cameraChannelMapper.selectLabelAndChannel("1009,1008");
|
|
||||||
labels.forEach(label -> {
|
|
||||||
String channelCode = label.getChannelCode();
|
|
||||||
try {
|
|
||||||
BufferedImage bufferedImage = capturecreenshot(channelCode);
|
|
||||||
String fileName = channelCode + ".jpg";
|
|
||||||
ImageIO.write(bufferedImage, "jpg", new File(fileDir + "/images/" + fileName));
|
|
||||||
|
|
||||||
String picUrl = picHost + "/images/" + fileName;
|
|
||||||
|
|
||||||
ChannelPicture picture = new ChannelPicture();
|
|
||||||
picture.setChannelCode(channelCode);
|
|
||||||
picture.setPicUrl(picUrl);
|
|
||||||
/*picture.setInsertTime(new Date());
|
|
||||||
channelPictureMapper.insert(picture);*/
|
|
||||||
if (channelCode == null){
|
|
||||||
channelPictureMapper.insert(picture);
|
|
||||||
}else {
|
|
||||||
QueryWrapper<ChannelPicture> queryWrapper = new QueryWrapper<>();
|
|
||||||
queryWrapper.eq("channel_code", channelCode);
|
|
||||||
picture.setInsertTime(new Date());
|
|
||||||
channelPictureMapper.update(picture, queryWrapper);
|
|
||||||
}
|
|
||||||
}catch (Exception e){
|
|
||||||
|
|
||||||
log.info( "[monitor-capture] " +channelCode + " 截图图片失败 " + e.getMessage());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
log.info("[monitor-capture]: end capture1");
|
|
||||||
}catch (Exception exception){
|
|
||||||
exception.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Scheduled(cron = "0 0 8/1 * * ?")
|
|
||||||
public void scenicSpotAndBathing() {
|
|
||||||
|
|
||||||
try {
|
|
||||||
|
|
||||||
log.info("[monitor-capture]: start capture");
|
|
||||||
|
|
||||||
List<ChannelLabelDto> labels = cameraChannelMapper.selectLabelAndChannel("1006,1004");
|
|
||||||
labels.forEach(label -> {
|
|
||||||
String channelCode = label.getChannelCode();
|
|
||||||
try {
|
|
||||||
BufferedImage bufferedImage = capturecreenshot(channelCode);
|
|
||||||
String fileName = channelCode + ".jpg";
|
|
||||||
ImageIO.write(bufferedImage, "jpg", new File(fileDir + "/images/" + fileName));
|
|
||||||
|
|
||||||
String picUrl = picHost + "/images/" + fileName;
|
|
||||||
|
|
||||||
ChannelPicture picture = new ChannelPicture();
|
|
||||||
picture.setChannelCode(channelCode);
|
|
||||||
picture.setPicUrl(picUrl);
|
|
||||||
/*picture.setInsertTime(new Date());
|
|
||||||
channelPictureMapper.insert(picture);*/
|
|
||||||
if (channelCode == null){
|
|
||||||
channelPictureMapper.insert(picture);
|
|
||||||
}else {
|
|
||||||
QueryWrapper<ChannelPicture> queryWrapper = new QueryWrapper<>();
|
|
||||||
queryWrapper.eq("channel_code", channelCode);
|
|
||||||
picture.setInsertTime(new Date());
|
|
||||||
channelPictureMapper.update(picture, queryWrapper);
|
|
||||||
}
|
|
||||||
}catch (Exception e){
|
|
||||||
|
|
||||||
log.info( "[monitor-capture] " +channelCode + " 截图图片失败 " + e.getMessage());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
log.info("[monitor-capture]: end capture");
|
|
||||||
}catch (Exception exception){
|
|
||||||
exception.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 海水浴场人群图片算法识别
|
|
||||||
*/
|
|
||||||
public void bathingBeach () {
|
|
||||||
try {
|
|
||||||
|
|
||||||
log.info("[monitor-capture]: start capture");
|
|
||||||
|
|
||||||
List<ChannelLabelDto> labels = cameraChannelMapper.selectLabelAndChannel("1006");
|
|
||||||
labels.forEach(label -> {
|
|
||||||
String channelCode = label.getChannelCode();
|
|
||||||
try {
|
|
||||||
BufferedImage bufferedImage = capturecreenshot(channelCode);
|
|
||||||
String fileName = channelCode + ".jpg";
|
|
||||||
ImageIO.write(bufferedImage, "jpg", new File(fileDir + "/images/" + fileName));
|
|
||||||
String picUrl = picHost + "/images/" + fileName;
|
|
||||||
//人流识别
|
|
||||||
String personNumUrl = "http://15.72.184.10:8003/cshi_rpc/v1.0/person";
|
|
||||||
Map personImage = new HashMap<>();
|
|
||||||
ByteArrayOutputStream stream = new ByteArrayOutputStream();
|
|
||||||
ImageIO.write(bufferedImage, "png", stream);
|
|
||||||
String imgBase64 = Base64Utils.encodeToString(stream.toByteArray());
|
|
||||||
stream.flush();
|
|
||||||
stream.close();
|
|
||||||
personImage.put("img_base64", imgBase64);
|
|
||||||
ResponseEntity<HashMap> responseEntity = restTemplate.postForEntity(personNumUrl, personImage, HashMap.class);
|
|
||||||
HashMap body = responseEntity.getBody();
|
|
||||||
if (body != null && (Integer) body.get("code") == 200){
|
|
||||||
Map data = (Map) body.get("data");
|
|
||||||
log.info(picUrl);
|
|
||||||
log.info("人流识别算法" + data);
|
|
||||||
}
|
|
||||||
}catch (Exception e){
|
|
||||||
log.info( "[monitor-capture] " +channelCode + " 截图图片失败 " + e.getMessage());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
log.info("[monitor-capture]: end capture");
|
|
||||||
}catch (Exception exception){
|
|
||||||
exception.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 安保区域人群图片算法识别并保存到数据库
|
|
||||||
*/
|
|
||||||
@Scheduled(cron = "0 0 8/2 * * ?")
|
|
||||||
public void peopleRecognize() {
|
|
||||||
try {
|
|
||||||
log.info("[monitor-capture]: start capture");
|
|
||||||
|
|
||||||
List<ChannelLabelDto> labels = cameraChannelMapper.selectLabelAndChannel("1042");
|
|
||||||
labels.forEach(label -> {
|
|
||||||
String channelCode = label.getChannelCode();
|
|
||||||
try {
|
|
||||||
BufferedImage bufferedImage = capturecreenshot(channelCode);
|
|
||||||
String fileName = channelCode + ".jpg";
|
|
||||||
ImageIO.write(bufferedImage, "jpg", new File(fileDir + "/images/" + fileName));
|
|
||||||
String picUrl = picHost + "/images/" + fileName;
|
|
||||||
//人流识别
|
|
||||||
String personNumUrl = "http://15.72.184.10:8003/cshi_rpc/v1.0/person";
|
|
||||||
Map personImage = new HashMap<>();
|
|
||||||
ByteArrayOutputStream stream = new ByteArrayOutputStream();
|
|
||||||
ImageIO.write(bufferedImage, "png", stream);
|
|
||||||
String imgBase64 = Base64Utils.encodeToString(stream.toByteArray());
|
|
||||||
stream.flush();
|
|
||||||
stream.close();
|
|
||||||
personImage.put("img_base64", imgBase64);
|
|
||||||
ResponseEntity<HashMap> responseEntity = restTemplate.postForEntity(personNumUrl, personImage, HashMap.class);
|
|
||||||
HashMap body = responseEntity.getBody();
|
|
||||||
if (body != null && (Integer) body.get("code") == 200){
|
|
||||||
Map data = (Map) body.get("data");
|
|
||||||
Integer personNum = (Integer) data.get("person_num");
|
|
||||||
PeopleRecognize peopleRecognize = new PeopleRecognize();
|
|
||||||
peopleRecognize.setChannelCode(channelCode);
|
|
||||||
peopleRecognize.setChannelName(label.getChannelName());
|
|
||||||
peopleRecognize.setPicUrl(picUrl);
|
|
||||||
peopleRecognize.setPersonNum(personNum);
|
|
||||||
peopleRecognize.setPushTime(new Date());
|
|
||||||
PeopleRecognize id = peopleRecognizeMapper.selectById(channelCode);
|
|
||||||
if (id == null){
|
|
||||||
peopleRecognizeMapper.insert(peopleRecognize);
|
|
||||||
}else {
|
|
||||||
peopleRecognizeMapper.updateById(peopleRecognize);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}catch (Exception e){
|
|
||||||
log.info( "[monitor-capture] " +channelCode + " 截图图片失败 " + e.getMessage());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
log.info("[monitor-capture]: end capture");
|
|
||||||
}catch (Exception exception){
|
|
||||||
exception.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 景区人流量识别
|
|
||||||
*/
|
|
||||||
@Scheduled(cron = "0 0 9 * * ?")
|
|
||||||
public void startScenic() {
|
|
||||||
try {
|
|
||||||
|
|
||||||
log.info("[monitor-capture]: startScenic capture");
|
|
||||||
|
|
||||||
List<Camera> cameras = scenicMapper.selectCamerasInScenic();
|
|
||||||
cameras.forEach(camera -> {
|
|
||||||
String cameraCode = camera.getCode();
|
|
||||||
try {
|
|
||||||
BufferedImage bufferedImage = capturecreenshot(cameraCode);
|
|
||||||
String fileName = cameraCode + ".jpg";
|
|
||||||
ImageIO.write(bufferedImage, "jpg", new File(fileDir + "/images/" + fileName));
|
|
||||||
|
|
||||||
String picUrl = picHost + "/images/" + fileName;
|
|
||||||
camera.setPic(picUrl);
|
|
||||||
camera.setCaptureTime(new Date());
|
|
||||||
cameraMapper.updateById(camera);
|
|
||||||
//人流识别
|
|
||||||
String personNumUrl = "http://15.72.184.10:8003/cshi_rpc/v1.0/person";
|
|
||||||
Map personImage = new HashMap<>();
|
|
||||||
ByteArrayOutputStream stream = new ByteArrayOutputStream();
|
|
||||||
ImageIO.write(bufferedImage, "png", stream);
|
|
||||||
String imgBase64 = Base64Utils.encodeToString(stream.toByteArray());
|
|
||||||
stream.flush();
|
|
||||||
stream.close();
|
|
||||||
personImage.put("img_base64", imgBase64);
|
|
||||||
ResponseEntity<HashMap> responseEntity = restTemplate.postForEntity(personNumUrl, personImage, HashMap.class);
|
|
||||||
HashMap body = responseEntity.getBody();
|
|
||||||
if (body != null && (Integer) body.get("code") == 200){
|
|
||||||
Map data = (Map) body.get("data");
|
|
||||||
Integer personNum = (Integer) data.get("person_num");
|
|
||||||
CameraScenic cameraScenic = new CameraScenic();
|
|
||||||
cameraScenic.setCameraId(cameraCode);
|
|
||||||
cameraScenic.setPersonNum(personNum);
|
|
||||||
|
|
||||||
CameraScenic cs = cameraScenicMapper.selectById(cameraCode);
|
|
||||||
if (cs == null){
|
|
||||||
cameraScenicMapper.insert(cameraScenic);
|
|
||||||
}else {
|
|
||||||
cameraScenicMapper.updateById(cameraScenic);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception e){
|
|
||||||
|
|
||||||
log.info( "[monitor-capture] " +cameraCode + " 人流识别失败 " + e.getMessage());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
log.info("[monitor-capture]: startScenic end capture");
|
|
||||||
}catch (Exception exception){
|
|
||||||
exception.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private BufferedImage capturecreenshot(String code) throws IOException {
|
|
||||||
String url = monitorDomain + "/videoService/realmonitor/uri?scheme=HLS&channelId=" + code;
|
|
||||||
|
|
||||||
HttpHeaders headers = new HttpHeaders();
|
|
||||||
headers.add("X-Subject-Token",token);
|
|
||||||
|
|
||||||
ResponseEntity<HashMap> forEntity = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity(headers), HashMap.class );
|
|
||||||
|
|
||||||
HashMap body = forEntity.getBody();
|
|
||||||
|
|
||||||
String file = (String) body.get("url");
|
|
||||||
|
|
||||||
log.debug("开始抓流:" + file);
|
|
||||||
|
|
||||||
FFmpegFrameGrabber grabber = FFmpegFrameGrabber.createDefault(file);
|
|
||||||
|
|
||||||
try {
|
|
||||||
|
|
||||||
grabber.setOption("stimoout", "10*1000*1000");
|
|
||||||
grabber.setOption("timeout", "10*1000*1000");
|
|
||||||
grabber.start();
|
|
||||||
|
|
||||||
log.debug("grabber启动成功");
|
|
||||||
|
|
||||||
int frameIndex = 60;
|
|
||||||
Java2DFrameConverter converter = new Java2DFrameConverter();
|
|
||||||
while (true){
|
|
||||||
Frame frame = grabber.grabImage();
|
|
||||||
if (frame != null) {
|
|
||||||
log.debug("grabber 跳帧:" + frameIndex);
|
|
||||||
if (frameIndex-- > 0) continue;
|
|
||||||
BufferedImage bufferedImage = converter.getBufferedImage(frame);
|
|
||||||
return bufferedImage;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}catch (Exception e){
|
|
||||||
throw e;
|
|
||||||
}finally {
|
|
||||||
grabber.stop();
|
|
||||||
grabber.release();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 获取路径返回给前端
|
|
||||||
* @param code
|
|
||||||
* @return
|
|
||||||
* @throws IOException
|
|
||||||
*/
|
|
||||||
public String fileCode(String code)throws IOException{
|
|
||||||
String url = monitorDomain + "/videoService/realmonitor/uri?scheme=HLS&channelId=" + code;
|
|
||||||
|
|
||||||
HttpHeaders headers = new HttpHeaders();
|
|
||||||
headers.add("X-Subject-Token",token);
|
|
||||||
|
|
||||||
System.out.println(token);
|
|
||||||
|
|
||||||
ResponseEntity<HashMap> forEntity = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity(headers), HashMap.class );
|
|
||||||
|
|
||||||
HashMap body = forEntity.getBody();
|
|
||||||
|
|
||||||
String file = (String) body.get("url");
|
|
||||||
|
|
||||||
|
|
||||||
return file;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
static public List cameras = new LinkedList<Map>();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 调用接口获取摄像头和组织
|
|
||||||
* @param parentId
|
|
||||||
* @param path
|
|
||||||
* @throws IOException
|
|
||||||
* @throws InterruptedException
|
|
||||||
*/
|
|
||||||
public void videoService(String parentId, String path) throws IOException, InterruptedException {
|
|
||||||
|
|
||||||
String url = monitorDomain + "/videoService/devicesManager/deviceTree?nodeType=1&typeCode=01;0;ALL;ALL&id=" + parentId;
|
|
||||||
|
|
||||||
HttpHeaders headers = new HttpHeaders();
|
|
||||||
|
|
||||||
headers.add("X-Subject-Token",token);
|
|
||||||
|
|
||||||
ResponseEntity<List> forEntity = null;
|
|
||||||
for (int i = 0; i < 10; i++) {
|
|
||||||
try {
|
|
||||||
forEntity = restTemplate.exchange(url, HttpMethod.GET, new HttpEntity(headers), List.class );
|
|
||||||
break;
|
|
||||||
}catch (Exception e){
|
|
||||||
log.error("重试次数:{} url:{}",i,url);
|
|
||||||
log.error(e);
|
|
||||||
Thread.sleep(5*1000);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (forEntity == null) return;
|
|
||||||
List<Map> results = forEntity.getBody();
|
|
||||||
|
|
||||||
// log.debug("response {}", JSONObject.toJSONString(results));
|
|
||||||
String sep = "->";
|
|
||||||
|
|
||||||
for (Map result : results) {
|
|
||||||
Boolean isParent = (Boolean) result.get("isParent");
|
|
||||||
|
|
||||||
if (isParent){
|
|
||||||
CameraOrganization cameraOrganization = JSONObject.parseObject(JSONObject.toJSONString(result), CameraOrganization.class);
|
|
||||||
|
|
||||||
cameraOrgenMapper.insert(cameraOrganization);
|
|
||||||
|
|
||||||
videoService((String) result.get("id"),path + sep + result.get("name"));
|
|
||||||
}else {
|
|
||||||
if (result.get("channelId") != null){
|
|
||||||
CameraChannel cameraChannel = JSONObject.parseObject(JSONObject.toJSONString(result), CameraChannel.class);
|
|
||||||
|
|
||||||
String id = (String)result.get("orgCode");
|
|
||||||
|
|
||||||
if (path != null && path.startsWith(sep)) {
|
|
||||||
path = path.substring(sep.length());
|
|
||||||
}
|
|
||||||
cameraChannel.setNodeName(path);
|
|
||||||
|
|
||||||
cameraChannel.setParentId(id);
|
|
||||||
|
|
||||||
cameraChannelMapper.insert(cameraChannel);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//查询视频点播巡检结果
|
|
||||||
@Scheduled(cron="0 5 6 * * ?")
|
|
||||||
public Result listChannelPlayStates(){
|
|
||||||
//获取当前时间和前一天的UTC时间
|
|
||||||
Map<String,Object> condition = new HashMap<>();
|
|
||||||
ZonedDateTime endUTC = ZonedDateTime.now(ZoneOffset.UTC);
|
|
||||||
ZonedDateTime startUTC = endUTC.minusDays(60);
|
|
||||||
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmmss'Z'");
|
|
||||||
condition.put("checkStatus",0);
|
|
||||||
condition.put("startTime",dateTimeFormatter.format(startUTC));
|
|
||||||
condition.put("endTime",dateTimeFormatter.format(endUTC));
|
|
||||||
//组装查询条件,经过验证pageSize设置过大也没效果,最大512
|
|
||||||
Map<String,Object> map = new HashMap<>();
|
|
||||||
map.put("condition",condition);
|
|
||||||
map.put("page",1);
|
|
||||||
map.put("pageSize",500);//最多一次512条
|
|
||||||
//查询路径和请求头信息
|
|
||||||
String url = monitorDomain + "/nms/api/channel/play/list";
|
|
||||||
HttpHeaders headers = new HttpHeaders();
|
|
||||||
headers.add("X-Subject-Token",token);
|
|
||||||
|
|
||||||
//查询数据的页数
|
|
||||||
int pageCount = 0;
|
|
||||||
//查询结果
|
|
||||||
List<Map> list = new ArrayList<>();
|
|
||||||
|
|
||||||
HttpEntity<Map<String,Object>> request = new HttpEntity<>(map,headers);
|
|
||||||
ResponseEntity<JSONObject> responseEntity = restTemplate.exchange(url, HttpMethod.POST, request, JSONObject.class );
|
|
||||||
JSONObject entityBody = responseEntity.getBody();
|
|
||||||
if (entityBody.get("i18n") != null && entityBody.get("i18n").toString() == "error"){
|
|
||||||
log.info("{}程序异常{}",entityBody.get("message").toString());
|
|
||||||
}
|
|
||||||
List<Map> results = (List<Map>) entityBody.get("results");
|
|
||||||
if(!results.isEmpty()){
|
|
||||||
list.addAll(results);
|
|
||||||
pageCount = entityBody.getIntValue("totalCount")/500 + 1;
|
|
||||||
}
|
|
||||||
for(int i = 2;i<=pageCount;i++){
|
|
||||||
map.put("page",i);
|
|
||||||
HttpEntity<Map<String,Object>> request2 = new HttpEntity<>(map,headers);
|
|
||||||
ResponseEntity<JSONObject> responseEntity2 = restTemplate.exchange(url, HttpMethod.POST, request2, JSONObject.class );
|
|
||||||
JSONObject entityBody2 = responseEntity2.getBody();
|
|
||||||
List<Map> results2 = (List<Map>) entityBody2.get("results");
|
|
||||||
if(!results2.isEmpty()){
|
|
||||||
list.addAll(results);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// List<CameraCheck> list1 = JSONObject.parseArray(JSONObject.toJSONString(jsonArray),CameraCheck.class);
|
|
||||||
// Map<String, CameraCheck> collect = list.stream().collect(Collectors.groupingBy(
|
|
||||||
// CameraCheck::getChannelCode,
|
|
||||||
// Collectors.collectingAndThen(
|
|
||||||
// Collectors.reducing((c1, c2) -> c1.getCheckTime().compareTo(c2.getCheckTime()) > 0 ? c1 : c2), Optional::get)
|
|
||||||
// )
|
|
||||||
// );
|
|
||||||
//
|
|
||||||
//通过set对channel_code去重
|
|
||||||
Set<String> set = new HashSet<>();
|
|
||||||
|
|
||||||
for(Map m:list){
|
|
||||||
set.add(m.get("channelCode").toString());
|
|
||||||
}
|
|
||||||
List<String> lists = new ArrayList<>(set.size());
|
|
||||||
lists.addAll(set);
|
|
||||||
//根据channel_code对t_camera_channel表的status字段进行更新(0)
|
|
||||||
List<List<String>> listMap = Lists.partition(lists,100);
|
|
||||||
for(List<String> ll:listMap){
|
|
||||||
cameraChannelMapper.updateCameraStatus(ll);
|
|
||||||
}
|
|
||||||
log.info("{} 查询视频点播巡检成功,发现异常数量:{}",LocalDateTime.now(),set.size());
|
|
||||||
return Result.success();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue