|
@ -1,5 +1,22 @@
|
1
|
1
|
package com.ai.bss.monitorManage.service.impl;
|
2
|
2
|
|
|
3
|
import java.io.File;
|
|
4
|
import java.util.ArrayList;
|
|
5
|
import java.util.HashMap;
|
|
6
|
import java.util.List;
|
|
7
|
import java.util.Map;
|
|
8
|
|
|
9
|
import org.apache.commons.lang.StringUtils;
|
|
10
|
import org.apache.logging.log4j.util.Strings;
|
|
11
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
12
|
import org.springframework.beans.factory.annotation.Value;
|
|
13
|
import org.springframework.kafka.core.KafkaTemplate;
|
|
14
|
import org.springframework.scheduling.annotation.Async;
|
|
15
|
import org.springframework.stereotype.Service;
|
|
16
|
import org.springframework.util.CollectionUtils;
|
|
17
|
import org.springframework.web.multipart.MultipartFile;
|
|
18
|
import org.springframework.web.multipart.commons.CommonsMultipartFile;
|
|
19
|
|
3
|
20
|
import com.ai.bss.components.common.util.ImageBase64Converter;
|
4
|
21
|
import com.ai.bss.components.ebcai.service.EbcAiService;
|
5
|
22
|
import com.ai.bss.monitorManage.constant.MonitorManageConsts;
|
|
@ -10,295 +27,416 @@ import com.ai.bss.monitorManage.service.interfaces.FileManageService;
|
10
|
27
|
import com.ai.bss.monitorManage.service.interfaces.KafkaProcess;
|
11
|
28
|
import com.ai.bss.monitorManage.utils.DateUtils;
|
12
|
29
|
import com.ai.bss.monitorManage.utils.FileUtils;
|
|
30
|
import com.ai.bss.monitorManage.utils.HttpServiceUtil;
|
13
|
31
|
import com.ai.bss.monitorManage.utils.KafkaProducerConfig;
|
14
|
32
|
import com.ai.bss.monitorManage.utils.SecurityProtectionMinioConfig;
|
|
33
|
import com.alibaba.fastjson.JSON;
|
15
|
34
|
import com.alibaba.fastjson.JSONArray;
|
16
|
35
|
import com.alibaba.fastjson.JSONObject;
|
17
|
|
import lombok.extern.slf4j.Slf4j;
|
18
|
|
import org.apache.logging.log4j.util.Strings;
|
19
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
20
|
|
import org.springframework.beans.factory.annotation.Value;
|
21
|
|
import org.springframework.kafka.core.KafkaTemplate;
|
22
|
|
import org.springframework.scheduling.annotation.Async;
|
23
|
|
import org.springframework.stereotype.Service;
|
24
|
|
import org.springframework.web.multipart.MultipartFile;
|
25
|
|
import org.springframework.web.multipart.commons.CommonsMultipartFile;
|
26
|
|
|
27
|
|
import java.io.File;
|
28
|
|
import java.util.*;
|
29
|
36
|
|
|
37
|
import lombok.extern.slf4j.Slf4j;
|
30
|
38
|
|
31
|
39
|
@Slf4j
|
32
|
40
|
@Service
|
33
|
41
|
public class KafkaProcessImpl implements KafkaProcess {
|
34
|
42
|
// EBC设备tcp连接服务地址
|
35
|
|
private static final String HOST = "47.105.130.83";
|
36
|
|
private static final int PORT = 8042;
|
|
43
|
private static final String HOST = "47.105.130.83";
|
|
44
|
private static final int PORT = 8042;
|
37
|
45
|
|
38
|
46
|
// private static String kafkaServers = "47.105.160.21:9090";
|
39
|
|
private static String kafkaServers = "10.19.90.34:9090";
|
40
|
|
|
41
|
|
@Value("${kafka.producer.servers}")
|
42
|
|
private static String servers;
|
|
47
|
private static String kafkaServers = "10.19.90.34:9090";
|
43
|
48
|
|
|
49
|
@Value("${kafka.producer.servers}")
|
|
50
|
private static String servers;
|
44
|
51
|
|
45
|
|
@Value("${camera.filePath}")
|
46
|
|
private String baseFilePath;
|
|
52
|
@Value("${camera.filePath}")
|
|
53
|
private String baseFilePath;
|
47
|
54
|
|
48
|
|
@Value("${kafka.topic.aitask}")
|
49
|
|
private String topicAiTask;
|
|
55
|
@Value("${kafka.topic.aitask}")
|
|
56
|
private String topicAiTask;
|
50
|
57
|
|
51
|
|
@Value("${kafka.topic.aivideo}")
|
52
|
|
private String topicAiVideo;
|
|
58
|
@Value("${kafka.topic.aivideo}")
|
|
59
|
private String topicAiVideo;
|
53
|
60
|
|
54
|
|
@Autowired
|
55
|
|
private EbcAiService ebcAiService;
|
|
61
|
@Value("${ebc.protection.resource-url}")
|
|
62
|
private String protectionResourceUrl;
|
56
|
63
|
|
57
|
|
@Autowired
|
58
|
|
private SecurityProtectionMinioConfig minioConfig;
|
|
64
|
@Autowired
|
|
65
|
private EbcAiService ebcAiService;
|
59
|
66
|
|
|
67
|
@Autowired
|
|
68
|
private SecurityProtectionMinioConfig minioConfig;
|
60
|
69
|
|
61
|
|
@Autowired
|
62
|
|
private FileManageService fileManageService;
|
|
70
|
@Autowired
|
|
71
|
private FileManageService fileManageService;
|
63
|
72
|
|
64
|
|
@Async
|
65
|
|
@Override
|
66
|
|
public void processKafka(String topic,List<String> msgList){
|
|
73
|
@Async
|
|
74
|
@Override
|
|
75
|
public void processKafka(String topic, List<String> msgList) {
|
67
|
76
|
// List<DataPoint> dataPointList = parseDataPoint(mockScenarioDataList,topic0,topic1);
|
68
|
|
try {
|
69
|
|
for (String msg : msgList) {
|
70
|
|
sendKafkaDataPoint(topic,msg);
|
71
|
|
}
|
72
|
|
}catch (Exception e){
|
73
|
|
e.printStackTrace();
|
74
|
|
}
|
75
|
|
}
|
76
|
|
|
77
|
|
@Async
|
78
|
|
@Override
|
79
|
|
public void processKafka(String topic,String msg){
|
80
|
|
try {
|
81
|
|
sendKafkaDataPoint(topic,msg);
|
82
|
|
}catch (Exception e){
|
83
|
|
e.printStackTrace();
|
84
|
|
}
|
85
|
|
}
|
86
|
|
|
87
|
|
|
88
|
|
@Async
|
89
|
|
@Override
|
90
|
|
public void processImageFile(String fileKey,String filePath) throws Exception {
|
91
|
|
Thread.sleep(3000);
|
92
|
|
String deviceCode = "";
|
93
|
|
String fileType = "";
|
94
|
|
String fileName = "";
|
95
|
|
String dateTime = "";
|
96
|
|
String[] keyArr;
|
97
|
|
MultipartFile multipartFile = null;
|
98
|
|
Map<String, String> minioFileMap = null;
|
99
|
|
AiIdenLogDto aiIdenLogDto = null;
|
100
|
|
String time = "";
|
101
|
|
String bucketName = "";
|
102
|
|
keyArr = fileKey.split("~!@");
|
103
|
|
deviceCode = keyArr[0];
|
104
|
|
fileType = keyArr[1];
|
105
|
|
|
106
|
|
aiIdenLogDto = new AiIdenLogDto();
|
107
|
|
fileName = filePath.substring(filePath.lastIndexOf(MonitorManageConsts.getSystemSeparator())+1,filePath.length());
|
108
|
|
if(fileType.equals(MonitorManageConsts.FILE_TYPE_IMG)){
|
109
|
|
bucketName = minioConfig.getBucketAiImage();
|
110
|
|
time = fileName.substring(3,17);
|
111
|
|
dateTime = DateUtils.formatDate(DateUtils.convertDate(time,DateUtils.PURE_DATETIMEHHMM_PATTERN),DateUtils.NORM_DATETIME_PATTERN);
|
112
|
|
aiIdenLogDto.setTaskExecuteTime(DateUtils.getSysDateTime());
|
113
|
|
aiIdenLogDto.setIdenPictureSnapDate(dateTime);
|
114
|
|
}
|
115
|
|
//文件上传到 minio文件服务器
|
116
|
|
multipartFile = new CommonsMultipartFile(FileUtils.createFileItem(new File(filePath),fileName));
|
117
|
|
|
118
|
|
log.info("保存图片文件");
|
119
|
|
minioFileMap = fileManageService.uploadFile(multipartFile,bucketName,deviceCode,null);
|
120
|
|
|
121
|
|
if(fileType.equals(MonitorManageConsts.FILE_TYPE_IMG)){
|
122
|
|
aiIdenLogDto.setIdenVideoUrl("");
|
123
|
|
aiIdenLogDto.setIdenPictureUrl(minioFileMap.get("fileId"));
|
124
|
|
aiIdenLogDto.setResourceToolCode(deviceCode);
|
125
|
|
//安全帽识别
|
126
|
|
aiIdenLogDto.setTopic(topicAiTask);//AI识别TOPICs
|
127
|
|
|
128
|
|
//人体识别
|
129
|
|
boolean isHuman = aiworkHumanDetect(filePath);
|
130
|
|
//AI头盔检查
|
131
|
|
if(isHuman){
|
132
|
|
aiIdenLogDto = aiHelmetDetect(aiIdenLogDto,filePath);
|
133
|
|
}
|
134
|
|
}
|
135
|
|
|
136
|
|
log.info("-------等待任务--------");
|
137
|
|
}
|
138
|
|
|
139
|
|
@Async
|
140
|
|
@Override
|
141
|
|
public void processVideoFile(String fileKey,String filePath) throws Exception {
|
142
|
|
Thread.sleep(70000);
|
143
|
|
String deviceCode = "";
|
144
|
|
String fileType = "";
|
145
|
|
String fileName = "";
|
146
|
|
String dateTime = "";
|
147
|
|
String[] keyArr;
|
148
|
|
MultipartFile multipartFile = null;
|
149
|
|
Map<String, String> minioFileMap = null;
|
150
|
|
MonitorVideoLogDto monitorVideoLogDto = null;
|
151
|
|
String time = "";
|
152
|
|
String bucketName = "";
|
153
|
|
keyArr = fileKey.split("~!@");
|
154
|
|
deviceCode = keyArr[0];
|
155
|
|
fileType = keyArr[1];
|
156
|
|
|
157
|
|
monitorVideoLogDto = new MonitorVideoLogDto();
|
158
|
|
fileName = filePath.substring(filePath.lastIndexOf(MonitorManageConsts.getSystemSeparator())+1,filePath.length());
|
159
|
|
if(fileType.equals(MonitorManageConsts.FILE_TYPE_VIDEO)){
|
160
|
|
bucketName = minioConfig.getBucketAiVideo();
|
161
|
|
time = fileName.substring(5,19);
|
162
|
|
dateTime = DateUtils.formatDate(DateUtils.convertDate(time,DateUtils.PURE_DATETIME_PATTERN),DateUtils.NORM_DATETIME_HHMM_PATTERN);
|
163
|
|
monitorVideoLogDto.setBeginTime(dateTime + ":00");
|
164
|
|
monitorVideoLogDto.setEndTime(dateTime + ":59");
|
165
|
|
|
166
|
|
}
|
167
|
|
//文件上传到 minio文件服务器
|
168
|
|
multipartFile = new CommonsMultipartFile(FileUtils.createFileItem(new File(filePath),fileName));
|
169
|
|
|
170
|
|
log.info("保存文件");
|
171
|
|
minioFileMap = fileManageService.uploadFile(multipartFile,bucketName,deviceCode,null);
|
172
|
|
|
173
|
|
if(fileType.equals(MonitorManageConsts.FILE_TYPE_VIDEO)){
|
174
|
|
monitorVideoLogDto.setTopic(topicAiVideo);//视频历史记录TOPIC
|
175
|
|
monitorVideoLogDto.setVideoUrl(minioFileMap.get("fileId"));
|
176
|
|
monitorVideoLogDto.setResourceToolCode(deviceCode);
|
177
|
|
processKafka(monitorVideoLogDto.getTopic(), JSONObject.toJSONString(monitorVideoLogDto));
|
178
|
|
}
|
179
|
|
log.info("-------等待任务--------");
|
180
|
|
}
|
181
|
|
|
182
|
|
public static void main(String[] args) throws Exception {
|
183
|
|
String filePath = MonitorManageConsts.getSystemSeparator() + "home"+MonitorManageConsts.getSystemSeparator()+"puaiuc"+MonitorManageConsts.getSystemSeparator()+"data"+MonitorManageConsts.getSystemSeparator()
|
184
|
|
+"DAHUA"+MonitorManageConsts.getSystemSeparator()+"5A02296PAKA885B"+MonitorManageConsts.getSystemSeparator()+"videos"+MonitorManageConsts.getSystemSeparator()+"video20201219151941.mp4";
|
185
|
|
String fileName = filePath.substring(filePath.lastIndexOf(MonitorManageConsts.getSystemSeparator())+1,filePath.length());
|
186
|
|
String time = fileName.substring(5,19);
|
187
|
|
String dateTime = DateUtils.formatDate(DateUtils.convertDate(time,DateUtils.PURE_DATETIME_PATTERN),DateUtils.NORM_DATETIME_HHMM_PATTERN);
|
188
|
|
System.out.println(dateTime);
|
189
|
|
}
|
190
|
|
|
191
|
|
|
192
|
|
|
193
|
|
private Map<String, KafkaTemplate> kafkaTemplateMap = new HashMap<>();
|
194
|
|
|
195
|
|
|
196
|
|
private boolean sendKafkaDataPoint(String topic,String msgStr){
|
197
|
|
KafkaTemplate kafkaTemplate = kafkaTemplateMap.get(kafkaServers);
|
198
|
|
if(kafkaTemplate == null){
|
199
|
|
//new 实例
|
200
|
|
KafkaProducerConfig kafkaProducerConfig = new KafkaProducerConfig(kafkaServers);
|
201
|
|
kafkaTemplate = kafkaProducerConfig.kafkaTemplate();
|
202
|
|
kafkaTemplateMap.put(kafkaServers,kafkaTemplate);
|
203
|
|
}
|
204
|
|
|
205
|
|
try {
|
206
|
|
Object result = kafkaTemplate.send(topic, msgStr).get();
|
207
|
|
System.out.println("发送kafka消息:topic="+topic + "msg: "+msgStr);
|
208
|
|
} catch (Exception e) {
|
209
|
|
log.error(e.getMessage());
|
210
|
|
return false;
|
211
|
|
}
|
212
|
|
|
213
|
|
return true;
|
214
|
|
}
|
215
|
|
|
216
|
|
|
217
|
|
/**
|
218
|
|
* AI头盔检查
|
219
|
|
* @param aiIdenLogDto
|
220
|
|
* @return
|
221
|
|
*/
|
222
|
|
private AiIdenLogDto aiHelmetDetect(AiIdenLogDto aiIdenLogDto,String aifilePath){
|
223
|
|
try {
|
224
|
|
log.info("开始AI处理...");
|
225
|
|
//安全帽识别
|
226
|
|
String aiResponseData = ebcAiService.helmetDetect(ImageBase64Converter.convertFileToBase64(aifilePath), Strings.EMPTY, Strings.EMPTY);
|
|
77
|
try {
|
|
78
|
for (String msg : msgList) {
|
|
79
|
sendKafkaDataPoint(topic, msg);
|
|
80
|
}
|
|
81
|
} catch (Exception e) {
|
|
82
|
e.printStackTrace();
|
|
83
|
}
|
|
84
|
}
|
|
85
|
|
|
86
|
@Async
|
|
87
|
@Override
|
|
88
|
public void processKafka(String topic, String msg) {
|
|
89
|
try {
|
|
90
|
sendKafkaDataPoint(topic, msg);
|
|
91
|
} catch (Exception e) {
|
|
92
|
e.printStackTrace();
|
|
93
|
}
|
|
94
|
}
|
|
95
|
|
|
96
|
@Async
|
|
97
|
@Override
|
|
98
|
public void processImageFile(String fileKey, String filePath) throws Exception {
|
|
99
|
Thread.sleep(3000);
|
|
100
|
String deviceCode = "";
|
|
101
|
String fileType = "";
|
|
102
|
String fileName = "";
|
|
103
|
String dateTime = "";
|
|
104
|
String[] keyArr;
|
|
105
|
MultipartFile multipartFile = null;
|
|
106
|
Map<String, String> minioFileMap = null;
|
|
107
|
AiIdenLogDto aiIdenLogDto = null;
|
|
108
|
String time = "";
|
|
109
|
String bucketName = "";
|
|
110
|
keyArr = fileKey.split("~!@");
|
|
111
|
deviceCode = keyArr[0];
|
|
112
|
fileType = keyArr[1];
|
|
113
|
|
|
114
|
aiIdenLogDto = new AiIdenLogDto();
|
|
115
|
fileName = filePath.substring(filePath.lastIndexOf(MonitorManageConsts.getSystemSeparator()) + 1,
|
|
116
|
filePath.length());
|
|
117
|
if (fileType.equals(MonitorManageConsts.FILE_TYPE_IMG)) {
|
|
118
|
bucketName = minioConfig.getBucketAiImage();
|
|
119
|
time = fileName.substring(3, 17);
|
|
120
|
//dateTime = DateUtils.formatDate(DateUtils.convertDate(time, DateUtils.PURE_DATETIMEHHMM_PATTERN),
|
|
121
|
// DateUtils.NORM_DATETIME_PATTERN);
|
|
122
|
// aiIdenLogDto.setTaskExecuteTime(DateUtils.getSysDateTime());
|
|
123
|
dateTime = DateUtils.formatDate(DateUtils.convertDate(time, DateUtils.PURE_DATETIME_PATTERN),
|
|
124
|
DateUtils.NORM_DATETIME_PATTERN);
|
|
125
|
aiIdenLogDto.setTaskExecuteTime(StringUtils.isEmpty(dateTime) ? DateUtils.getSysDateTime() : dateTime);
|
|
126
|
aiIdenLogDto.setIdenPictureSnapDate(dateTime);
|
|
127
|
}
|
|
128
|
// 文件上传到 minio文件服务器
|
|
129
|
multipartFile = new CommonsMultipartFile(FileUtils.createFileItem(new File(filePath), fileName));
|
|
130
|
|
|
131
|
log.info("保存图片文件");
|
|
132
|
minioFileMap = fileManageService.uploadFile(multipartFile, bucketName, deviceCode, null);
|
|
133
|
|
|
134
|
if (fileType.equals(MonitorManageConsts.FILE_TYPE_IMG)) {
|
|
135
|
aiIdenLogDto.setIdenVideoUrl("");
|
|
136
|
aiIdenLogDto.setIdenPictureUrl(minioFileMap.get("fileId"));
|
|
137
|
aiIdenLogDto.setResourceToolCode(deviceCode);
|
|
138
|
|
|
139
|
// 根据监控任务执行AI识别
|
|
140
|
List<Map> resourceToolInfoList = getResourceToolAllInfo(deviceCode);
|
|
141
|
|
|
142
|
for (Map resourceToolInfoMap : resourceToolInfoList) {
|
|
143
|
if (resourceToolInfoMap.get("aiTaskId") != null && aiworkHumanDetect(filePath)) {
|
|
144
|
String aiIdenModel = resourceToolInfoMap.get("aiIdenModel") == null ? ""
|
|
145
|
: resourceToolInfoMap.get("aiIdenModel").toString();
|
|
146
|
|
|
147
|
aiIdenLogDto.setAiTaskId(Long.valueOf(resourceToolInfoMap.get("aiTaskId").toString()));
|
|
148
|
aiIdenLogDto.setAiIdenModel(aiIdenModel);
|
|
149
|
aiIdenLogDto.setOrganizationId(resourceToolInfoMap.get("orgId") == null ? ""
|
|
150
|
: resourceToolInfoMap.get("orgId").toString());
|
|
151
|
aiIdenLogDto.setResourceToolId(resourceToolInfoMap.get("resourceToolId") == null ? ""
|
|
152
|
: resourceToolInfoMap.get("resourceToolId").toString());
|
|
153
|
aiIdenLogDto.setResourceToolName(resourceToolInfoMap.get("resourceToolName") == null ? ""
|
|
154
|
: resourceToolInfoMap.get("resourceToolName").toString());
|
|
155
|
aiIdenLogDto.setTopic(topicAiTask);
|
|
156
|
|
|
157
|
if (MonitorManageConsts.AI_MODEL_FACE.equals(aiIdenModel)) {
|
|
158
|
aiIdenLogDto = faceAiRecog(aiIdenLogDto, filePath);
|
|
159
|
|
|
160
|
} else if (MonitorManageConsts.AI_MODEL_CLOTHING_CODE.equals(aiIdenModel)) {
|
|
161
|
aiIdenLogDto = aiHelmetDetect(aiIdenLogDto, filePath);
|
|
162
|
|
|
163
|
}
|
|
164
|
/*else if (MonitorManageConsts.AI_MODEL_STRANGER.equals(aiIdenModel)) {
|
|
165
|
|
|
166
|
} else {
|
|
167
|
|
|
168
|
}*/
|
|
169
|
}
|
|
170
|
}
|
|
171
|
|
|
172
|
/*// 安全帽识别
|
|
173
|
aiIdenLogDto.setTopic(topicAiTask);// AI识别TOPICs
|
|
174
|
|
|
175
|
// 人体识别
|
|
176
|
boolean isHuman = aiworkHumanDetect(filePath);
|
|
177
|
// AI头盔检查
|
|
178
|
if (isHuman) {
|
|
179
|
aiIdenLogDto = aiHelmetDetect(aiIdenLogDto, filePath);
|
|
180
|
}*/
|
|
181
|
}
|
|
182
|
|
|
183
|
log.info("-------等待任务--------");
|
|
184
|
}
|
|
185
|
|
|
186
|
@Async
|
|
187
|
@Override
|
|
188
|
public void processVideoFile(String fileKey, String filePath) throws Exception {
|
|
189
|
Thread.sleep(70000);
|
|
190
|
String deviceCode = "";
|
|
191
|
String fileType = "";
|
|
192
|
String fileName = "";
|
|
193
|
String dateTime = "";
|
|
194
|
String[] keyArr;
|
|
195
|
MultipartFile multipartFile = null;
|
|
196
|
Map<String, String> minioFileMap = null;
|
|
197
|
MonitorVideoLogDto monitorVideoLogDto = null;
|
|
198
|
String time = "";
|
|
199
|
String bucketName = "";
|
|
200
|
keyArr = fileKey.split("~!@");
|
|
201
|
deviceCode = keyArr[0];
|
|
202
|
fileType = keyArr[1];
|
|
203
|
|
|
204
|
monitorVideoLogDto = new MonitorVideoLogDto();
|
|
205
|
fileName = filePath.substring(filePath.lastIndexOf(MonitorManageConsts.getSystemSeparator()) + 1,
|
|
206
|
filePath.length());
|
|
207
|
if (fileType.equals(MonitorManageConsts.FILE_TYPE_VIDEO)) {
|
|
208
|
bucketName = minioConfig.getBucketAiVideo();
|
|
209
|
time = fileName.substring(5, 19);
|
|
210
|
dateTime = DateUtils.formatDate(DateUtils.convertDate(time, DateUtils.PURE_DATETIME_PATTERN),
|
|
211
|
DateUtils.NORM_DATETIME_HHMM_PATTERN);
|
|
212
|
monitorVideoLogDto.setBeginTime(dateTime + ":00");
|
|
213
|
monitorVideoLogDto.setEndTime(dateTime + ":59");
|
|
214
|
|
|
215
|
}
|
|
216
|
// 文件上传到 minio文件服务器
|
|
217
|
multipartFile = new CommonsMultipartFile(FileUtils.createFileItem(new File(filePath), fileName));
|
|
218
|
|
|
219
|
log.info("保存文件");
|
|
220
|
minioFileMap = fileManageService.uploadFile(multipartFile, bucketName, deviceCode, null);
|
|
221
|
|
|
222
|
if (fileType.equals(MonitorManageConsts.FILE_TYPE_VIDEO)) {
|
|
223
|
monitorVideoLogDto.setTopic(topicAiVideo);// 视频历史记录TOPIC
|
|
224
|
monitorVideoLogDto.setVideoUrl(minioFileMap.get("fileId"));
|
|
225
|
monitorVideoLogDto.setResourceToolCode(deviceCode);
|
|
226
|
processKafka(monitorVideoLogDto.getTopic(), JSONObject.toJSONString(monitorVideoLogDto));
|
|
227
|
}
|
|
228
|
log.info("-------等待任务--------");
|
|
229
|
}
|
|
230
|
|
|
231
|
public static void main(String[] args) throws Exception {
|
|
232
|
String filePath = MonitorManageConsts.getSystemSeparator() + "home" + MonitorManageConsts.getSystemSeparator()
|
|
233
|
+ "puaiuc" + MonitorManageConsts.getSystemSeparator() + "data"
|
|
234
|
+ MonitorManageConsts.getSystemSeparator() + "DAHUA" + MonitorManageConsts.getSystemSeparator()
|
|
235
|
+ "5A02296PAKA885B" + MonitorManageConsts.getSystemSeparator() + "videos"
|
|
236
|
+ MonitorManageConsts.getSystemSeparator() + "video20201219151941.mp4";
|
|
237
|
String fileName = filePath.substring(filePath.lastIndexOf(MonitorManageConsts.getSystemSeparator()) + 1,
|
|
238
|
filePath.length());
|
|
239
|
String time = fileName.substring(5, 19);
|
|
240
|
String dateTime = DateUtils.formatDate(DateUtils.convertDate(time, DateUtils.PURE_DATETIME_PATTERN),
|
|
241
|
DateUtils.NORM_DATETIME_HHMM_PATTERN);
|
|
242
|
System.out.println(dateTime);
|
|
243
|
}
|
|
244
|
|
|
245
|
private Map<String, KafkaTemplate> kafkaTemplateMap = new HashMap<>();
|
|
246
|
|
|
247
|
private boolean sendKafkaDataPoint(String topic, String msgStr) {
|
|
248
|
KafkaTemplate kafkaTemplate = kafkaTemplateMap.get(kafkaServers);
|
|
249
|
if (kafkaTemplate == null) {
|
|
250
|
// new 实例
|
|
251
|
KafkaProducerConfig kafkaProducerConfig = new KafkaProducerConfig(kafkaServers);
|
|
252
|
kafkaTemplate = kafkaProducerConfig.kafkaTemplate();
|
|
253
|
kafkaTemplateMap.put(kafkaServers, kafkaTemplate);
|
|
254
|
}
|
|
255
|
|
|
256
|
try {
|
|
257
|
Object result = kafkaTemplate.send(topic, msgStr).get();
|
|
258
|
System.out.println("发送kafka消息:topic=" + topic + "msg: " + msgStr);
|
|
259
|
} catch (Exception e) {
|
|
260
|
log.error(e.getMessage());
|
|
261
|
return false;
|
|
262
|
}
|
|
263
|
|
|
264
|
return true;
|
|
265
|
}
|
|
266
|
|
|
267
|
/**
|
|
268
|
* AI头盔检查
|
|
269
|
* @param aiIdenLogDto
|
|
270
|
* @return
|
|
271
|
*/
|
|
272
|
private AiIdenLogDto aiHelmetDetect(AiIdenLogDto aiIdenLogDto, String aifilePath) {
|
|
273
|
try {
|
|
274
|
log.info("开始AI处理...");
|
|
275
|
// 安全帽识别
|
|
276
|
String aiResponseData = ebcAiService.helmetDetect(ImageBase64Converter.convertFileToBase64(aifilePath),
|
|
277
|
Strings.EMPTY, Strings.EMPTY);
|
227
|
278
|
// String aiResponseData = ebcAiService.helmetDetect(ImageBase64Converter.convertInputStreamToBase64(multipartFile.getInputStream()), Strings.EMPTY, Strings.EMPTY);
|
228
|
|
JSONObject jsonObject = JSONObject.parseObject(aiResponseData);// JSONUtil.formatJsonStr(aiResponseData);
|
229
|
|
System.out.println("AI 识别结果: "+jsonObject);
|
230
|
|
IdenResultDto idenResultDto = null;
|
231
|
|
List<IdenResultDto> idenResultDtoList = null;
|
232
|
|
if(jsonObject.getString("Status").equals("Ok")){
|
233
|
|
idenResultDtoList = new ArrayList<>();
|
234
|
|
JSONArray jsonoArray = JSONArray.parseArray(jsonObject.getString("Result"));
|
235
|
|
if(jsonoArray.size()>0){
|
236
|
|
for(int i=0;i<jsonoArray.size();i++){
|
237
|
|
JSONObject resultObj = JSONObject.parseObject(jsonoArray.get(i).toString());
|
238
|
|
String aiClassName = resultObj.getString("class");
|
239
|
|
// safety_hat表示安全帽;ordinart_hat表示普通帽子;chef_hat表示厨师帽;none表示未戴帽子
|
240
|
|
if(aiClassName.equals("none")){
|
241
|
|
idenResultDto =new IdenResultDto();
|
242
|
|
idenResultDto.setAlarmEmployeeRoleId(MonitorManageConsts.alarmEmployeeRoleId);
|
243
|
|
idenResultDto.setAlarmType(MonitorManageConsts.AI_ALARM_TYPE_WEA);
|
244
|
|
idenResultDto.setAlarmMemo("未戴帽子");
|
245
|
|
aiIdenLogDto.setIdenResultType(MonitorManageConsts.AI_IDENTIFY_RESULT_ALARM);
|
246
|
|
idenResultDtoList.add(idenResultDto);
|
247
|
|
aiIdenLogDto.setIdenResult(idenResultDtoList);
|
248
|
|
aiIdenLogDto.setAiIdenModel(MonitorManageConsts.AI_MODEL_CLOTHING_CODE);
|
249
|
|
}else{
|
250
|
|
// if(aiClassName.equals("safety_hat")){
|
251
|
|
idenResultDto =new IdenResultDto();
|
252
|
|
idenResultDto.setAlarmEmployeeRoleId(MonitorManageConsts.alarmEmployeeRoleId);
|
253
|
|
idenResultDto.setAlarmType(aiClassName);
|
254
|
|
idenResultDto.setAlarmMemo(aiClassName);
|
255
|
|
idenResultDtoList.add(idenResultDto);
|
256
|
|
aiIdenLogDto.setIdenResult(idenResultDtoList);
|
257
|
|
aiIdenLogDto.setIdenResultType(MonitorManageConsts.AI_IDENTIFY_RESULT);
|
258
|
|
aiIdenLogDto.setAiIdenModel(MonitorManageConsts.AI_MODEL_CLOTHING_CODE);
|
259
|
|
}
|
260
|
|
}
|
261
|
|
log.info("识别成功,推送KAFKA消息");
|
262
|
|
processKafka(aiIdenLogDto.getTopic(), JSONObject.toJSONString(aiIdenLogDto));
|
263
|
|
}else{
|
264
|
|
log.info("没有识别到人,不推送KAFKA消息");
|
265
|
|
}
|
266
|
|
}
|
267
|
|
//AI模型
|
|
279
|
JSONObject jsonObject = JSONObject.parseObject(aiResponseData);// JSONUtil.formatJsonStr(aiResponseData);
|
|
280
|
System.out.println("AI 识别结果: " + jsonObject);
|
|
281
|
IdenResultDto idenResultDto = null;
|
|
282
|
List<IdenResultDto> idenResultDtoList = null;
|
|
283
|
if (jsonObject.getString("Status").equals("Ok")) {
|
|
284
|
idenResultDtoList = new ArrayList<>();
|
|
285
|
JSONArray jsonoArray = JSONArray.parseArray(jsonObject.getString("Result"));
|
|
286
|
if (jsonoArray.size() > 0) {
|
|
287
|
for (int i = 0; i < jsonoArray.size(); i++) {
|
|
288
|
JSONObject resultObj = JSONObject.parseObject(jsonoArray.get(i).toString());
|
|
289
|
String aiClassName = resultObj.getString("class");
|
|
290
|
// safety_hat表示安全帽;ordinart_hat表示普通帽子;chef_hat表示厨师帽;none表示未戴帽子
|
|
291
|
if (aiClassName.equals("none")) {
|
|
292
|
idenResultDto = new IdenResultDto();
|
|
293
|
idenResultDto.setAlarmEmployeeRoleId(MonitorManageConsts.alarmEmployeeRoleId);
|
|
294
|
idenResultDto.setAlarmType(MonitorManageConsts.AI_ALARM_TYPE_WEA);
|
|
295
|
idenResultDto.setAlarmMemo("未戴帽子");
|
|
296
|
aiIdenLogDto.setIdenResultType(MonitorManageConsts.AI_IDENTIFY_RESULT_ALARM);
|
|
297
|
idenResultDtoList.add(idenResultDto);
|
|
298
|
// aiIdenLogDto.setIdenResult(idenResultDtoList);
|
|
299
|
aiIdenLogDto.setIdenResult(JSON.toJSONString(idenResultDtoList));
|
|
300
|
// aiIdenLogDto.setAiIdenModel(MonitorManageConsts.AI_MODEL_CLOTHING_CODE);
|
|
301
|
aiIdenLogDto.setRelateEmployeeRoleId(MonitorManageConsts.alarmEmployeeRoleId);
|
|
302
|
} else {
|
|
303
|
// if(aiClassName.equals("safety_hat")){
|
|
304
|
idenResultDto = new IdenResultDto();
|
|
305
|
idenResultDto.setAlarmEmployeeRoleId(MonitorManageConsts.alarmEmployeeRoleId);
|
|
306
|
idenResultDto.setAlarmType(aiClassName);
|
|
307
|
idenResultDto.setAlarmMemo(aiClassName);
|
|
308
|
idenResultDtoList.add(idenResultDto);
|
|
309
|
// aiIdenLogDto.setIdenResult(idenResultDtoList);
|
|
310
|
aiIdenLogDto.setIdenResult(JSON.toJSONString(idenResultDtoList));
|
|
311
|
aiIdenLogDto.setIdenResultType(MonitorManageConsts.AI_IDENTIFY_RESULT);
|
|
312
|
// aiIdenLogDto.setAiIdenModel(MonitorManageConsts.AI_MODEL_CLOTHING_CODE);
|
|
313
|
aiIdenLogDto.setRelateEmployeeRoleId(MonitorManageConsts.alarmEmployeeRoleId);
|
|
314
|
}
|
|
315
|
}
|
|
316
|
log.info("识别成功,推送KAFKA消息");
|
|
317
|
processKafka(aiIdenLogDto.getTopic(), JSONObject.toJSONString(aiIdenLogDto));
|
|
318
|
} else {
|
|
319
|
log.info("没有识别到人,不推送KAFKA消息");
|
|
320
|
}
|
|
321
|
}
|
|
322
|
// AI模型
|
268
|
323
|
// aiIdenLogDto.setAiIdenModel(MonitorManageConsts.AI_MODEL_CLOTHING_CODE);
|
269
|
|
}catch (Exception e){
|
270
|
|
log.error("AI处理异常");
|
271
|
|
}
|
272
|
|
return aiIdenLogDto;
|
273
|
|
}
|
274
|
|
|
275
|
|
/**
|
276
|
|
* AI人体识别
|
277
|
|
* @param aifilePath
|
278
|
|
* @return
|
279
|
|
*/
|
280
|
|
private boolean aiworkHumanDetect(String aifilePath){
|
281
|
|
boolean isHuman = false;
|
282
|
|
try {
|
283
|
|
//安全帽识别
|
284
|
|
String aiResponseData = ebcAiService.workClothesDetect(ImageBase64Converter.convertFileToBase64(aifilePath), true,true,0.9f);
|
285
|
|
|
286
|
|
JSONObject jsonObject = JSONObject.parseObject(aiResponseData);// JSONUtil.formatJsonStr(aiResponseData);
|
287
|
|
if(jsonObject.getString("Status").equals("Ok")){
|
288
|
|
JSONArray jsonoArray = JSONArray.parseArray(jsonObject.getString("Result"));
|
289
|
|
for(int i=0;i<jsonoArray.size();i++){
|
290
|
|
JSONObject resultObj = JSONObject.parseObject(jsonoArray.get(i).toString());
|
291
|
|
String aiClassName = resultObj.getString("lable");
|
292
|
|
// safety_hat表示安全帽;ordinart_hat表示普通帽子;chef_hat表示厨师帽;none表示未戴帽子
|
293
|
|
if(aiClassName.equals("person")){
|
294
|
|
isHuman = true;
|
295
|
|
}
|
296
|
|
}
|
297
|
|
}
|
298
|
|
}catch (Exception e){
|
299
|
|
log.error("AI处理异常");
|
300
|
|
}
|
301
|
|
return isHuman;
|
302
|
|
}
|
|
324
|
} catch (Exception e) {
|
|
325
|
log.error("AI处理异常");
|
|
326
|
}
|
|
327
|
return aiIdenLogDto;
|
|
328
|
}
|
|
329
|
|
|
330
|
/**
|
|
331
|
* AI人体识别(照片中是否有人)
|
|
332
|
* @param aifilePath
|
|
333
|
* @return
|
|
334
|
*/
|
|
335
|
private boolean aiworkHumanDetect(String aifilePath) {
|
|
336
|
boolean isHuman = false;
|
|
337
|
try {
|
|
338
|
/*// 安全帽识别
|
|
339
|
String aiResponseData = ebcAiService.workClothesDetect(ImageBase64Converter.convertFileToBase64(aifilePath),
|
|
340
|
true, true, 0.9f);
|
|
341
|
|
|
342
|
JSONObject jsonObject = JSONObject.parseObject(aiResponseData);// JSONUtil.formatJsonStr(aiResponseData);
|
|
343
|
if (jsonObject.getString("Status").equals("Ok")) {
|
|
344
|
JSONArray jsonoArray = JSONArray.parseArray(jsonObject.getString("Result"));
|
|
345
|
for (int i = 0; i < jsonoArray.size(); i++) {
|
|
346
|
JSONObject resultObj = JSONObject.parseObject(jsonoArray.get(i).toString());
|
|
347
|
String aiClassName = resultObj.getString("lable");
|
|
348
|
// safety_hat表示安全帽;ordinart_hat表示普通帽子;chef_hat表示厨师帽;none表示未戴帽子
|
|
349
|
if (aiClassName.equals("person")) {
|
|
350
|
isHuman = true;
|
|
351
|
}
|
|
352
|
}
|
|
353
|
}*/
|
|
354
|
|
|
355
|
log.info("开始AI人数识别处理...");
|
|
356
|
String aiResponseData = ebcAiService.headDetect(ImageBase64Converter.convertFileToBase64(aifilePath), true,
|
|
357
|
0.9f);
|
|
358
|
|
|
359
|
JSONObject jsonObject = JSONObject.parseObject(aiResponseData);
|
|
360
|
JSONArray jsonArray = jsonObject.getJSONArray("Result");
|
|
361
|
if (!CollectionUtils.isEmpty(jsonArray)) {
|
|
362
|
isHuman = true;
|
|
363
|
log.info("AI人数识别结果:有" + jsonArray.size() + "人");
|
|
364
|
} else {
|
|
365
|
log.info("AI人数识别结果:没有人");
|
|
366
|
}
|
|
367
|
|
|
368
|
} catch (Exception e) {
|
|
369
|
log.error("AI处理异常");
|
|
370
|
}
|
|
371
|
return isHuman;
|
|
372
|
}
|
|
373
|
|
|
374
|
/**
|
|
375
|
* 人脸识别
|
|
376
|
* @param aiIdenLogDto
|
|
377
|
* @param aifilePath
|
|
378
|
* @return
|
|
379
|
*/
|
|
380
|
private AiIdenLogDto faceAiRecog(AiIdenLogDto aiIdenLogDto, String aifilePath) {
|
|
381
|
try {
|
|
382
|
log.info("开始AI人脸识别处理...");
|
|
383
|
// 人脸识别
|
|
384
|
String aiResponseData = ebcAiService.faceAiRecog(ImageBase64Converter.convertFileToBase64(aifilePath));
|
|
385
|
|
|
386
|
JSONObject jsonObject = JSONObject.parseObject(aiResponseData);
|
|
387
|
System.out.println("AI人脸识别结果: " + aiResponseData);
|
|
388
|
|
|
389
|
if ("1".equals(jsonObject.getString("errorcode")) && "success".equals(jsonObject.getString("message"))) {
|
|
390
|
JSONObject resultJsonObject = JSONObject.parseObject(jsonObject.getString("result"));
|
|
391
|
|
|
392
|
if (resultJsonObject.getIntValue("is_match") == 0) {
|
|
393
|
aiIdenLogDto.setIdenResult(jsonObject.getString("result"));
|
|
394
|
aiIdenLogDto.setIdenResultType(MonitorManageConsts.AI_IDENTIFY_RESULT);
|
|
395
|
|
|
396
|
} else {
|
|
397
|
aiIdenLogDto.setIdenResult(jsonObject.getString("result"));
|
|
398
|
aiIdenLogDto.setRelateEmployeeRoleId(resultJsonObject.getString("user_id"));
|
|
399
|
aiIdenLogDto.setIdenResultType(MonitorManageConsts.AI_IDENTIFY_RESULT_ATTENDANCE);
|
|
400
|
|
|
401
|
}
|
|
402
|
|
|
403
|
log.info("识别成功,推送KAFKA消息");
|
|
404
|
processKafka(aiIdenLogDto.getTopic(), JSONObject.toJSONString(aiIdenLogDto));
|
|
405
|
} else {
|
|
406
|
log.info("没有识别到人,不推送KAFKA消息");
|
|
407
|
return aiIdenLogDto;
|
|
408
|
}
|
|
409
|
} catch (Exception e) {
|
|
410
|
log.error("AI处理异常");
|
|
411
|
}
|
|
412
|
return aiIdenLogDto;
|
|
413
|
}
|
|
414
|
|
|
415
|
/**
|
|
416
|
* 根据设备code获取监控任务详情
|
|
417
|
* @param deviceCode
|
|
418
|
* @return
|
|
419
|
*/
|
|
420
|
private List<Map> getResourceToolAllInfo(String deviceCode) {
|
|
421
|
List<Map> resourceToolInfoList = new ArrayList<Map>();
|
|
422
|
try {
|
|
423
|
String url = protectionResourceUrl + "?resourceToolCode=" + deviceCode;
|
|
424
|
log.info("getResourceToolAllInfo method params: resourceToolCode=" + deviceCode + ", url=" + url);
|
|
425
|
|
|
426
|
String resultJson = HttpServiceUtil.sendRequest(url);
|
|
427
|
JSONObject resultData = JSON.parseObject(resultJson);
|
|
428
|
if (StringUtils.isEmpty(resultData.getString("data"))) {
|
|
429
|
log.info("getResourceToolAllInfo method returns an empty result");
|
|
430
|
return resourceToolInfoList;
|
|
431
|
}
|
|
432
|
|
|
433
|
resourceToolInfoList = JSON.parseArray(resultData.getString("data"), Map.class);
|
|
434
|
log.info("getResourceToolAllInfo method return result: " + resultData.getString("data"));
|
|
435
|
} catch (Exception e) {
|
|
436
|
log.error("getResourceToolAllInfo is error");
|
|
437
|
}
|
|
438
|
|
|
439
|
return resourceToolInfoList;
|
|
440
|
}
|
303
|
441
|
|
304
|
442
|
}
|