Browse Source

修改部署内容

dev-sn
yj 3 years ago
parent
commit
ed81859f2c
  1. 42
      device_cars/src/main/java/com/xr/device_car/config/common/LocalDateConverter.java
  2. 41
      device_cars/src/main/java/com/xr/device_car/config/common/LocalDateTimeConverter.java
  3. 281
      device_cars/src/main/java/com/xr/device_car/config/common/RESTClient.java
  4. 33
      device_cars/src/main/java/com/xr/device_car/config/udp/UdbConfig.java
  5. 68
      device_cars/src/main/java/com/xr/device_car/config/udp/UdpClientConfig.java
  6. 139
      device_cars/src/main/java/com/xr/device_car/config/utils/EasyExcelUtil.java
  7. 52
      device_cars/src/main/java/com/xr/device_car/config/utils/HkComUtil.java
  8. 55
      device_cars/src/main/java/com/xr/device_car/config/utils/HttpResponseBean.java
  9. 72
      device_cars/src/main/java/com/xr/device_car/config/utils/MinioUtil.java
  10. 141
      device_cars/src/main/java/com/xr/device_car/config/utils/OnvifUtils.java
  11. 231
      device_cars/src/main/java/com/xr/device_car/config/utils/PythonExecutor.java
  12. 177
      device_cars/src/main/java/com/xr/device_car/modules/analysis/controller/MeterInitializationController.java
  13. 3
      device_cars/src/main/java/com/xr/device_car/modules/analysis/controller/SendUdpLogController.java
  14. 2
      device_cars/src/main/java/com/xr/device_car/modules/analysis/entity/SendUdpLog.java
  15. 12
      device_cars/src/main/resources/digest/AbsoluteMove.wsdl
  16. 6
      device_cars/src/main/resources/digest/GetDeviceInformation.wsdl
  17. 6
      device_cars/src/main/resources/digest/GetPTZ.wsdl
  18. 8
      device_cars/src/main/resources/digest/GetPresets.wsdl
  19. 6
      device_cars/src/main/resources/digest/GetProfiles.wsdl
  20. 8
      device_cars/src/main/resources/digest/GetSnapshotUrl.wsdl
  21. 8
      device_cars/src/main/resources/digest/GetStatus.wsdl
  22. 25
      device_cars/src/main/resources/digest/GetStreamUri.wsdl
  23. 9
      device_cars/src/main/resources/digest/GotoPreset.wsdl
  24. 55
      device_udpclent/src/main/java/com/xr/device_udpclent/common/config/HttpResponseBean.java
  25. 150
      device_udpclent/src/main/java/com/xr/device_udpclent/common/utils/AnalysisXml.java
  26. 152
      device_udpclent/src/main/java/com/xr/device_udpclent/common/utils/OnvifUtils.java
  27. 281
      device_udpclent/src/main/java/com/xr/device_udpclent/common/utils/RESTClient.java
  28. 12
      device_udpclent/src/main/resources/digest/AbsoluteMove.wsdl
  29. 6
      device_udpclent/src/main/resources/digest/GetDeviceInformation.wsdl
  30. 6
      device_udpclent/src/main/resources/digest/GetPTZ.wsdl
  31. 8
      device_udpclent/src/main/resources/digest/GetPresets.wsdl
  32. 6
      device_udpclent/src/main/resources/digest/GetProfiles.wsdl
  33. 8
      device_udpclent/src/main/resources/digest/GetSnapshotUrl.wsdl
  34. 8
      device_udpclent/src/main/resources/digest/GetStatus.wsdl
  35. 25
      device_udpclent/src/main/resources/digest/GetStreamUri.wsdl
  36. 9
      device_udpclent/src/main/resources/digest/GotoPreset.wsdl

42
device_cars/src/main/java/com/xr/device_car/config/common/LocalDateConverter.java

@ -1,42 +0,0 @@
package com.xr.device_car.config.common;
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
/**
* @Author: ChenTaoTao
* @Date: 2022/3/28 10:07
* @Describe:
*/
public class LocalDateConverter implements Converter<LocalDate> {
@Override
public Class<LocalDate> supportJavaTypeKey() {
return LocalDate.class;
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
@Override
public LocalDate convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
return LocalDate.parse(cellData.getStringValue(), DateTimeFormatter.ofPattern("yyyy-MM-dd"));
}
@Override
public WriteCellData<String> convertToExcelData(LocalDate value, ExcelContentProperty contentProperty,
GlobalConfiguration globalConfiguration) {
return new WriteCellData<>(value.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
}
}

41
device_cars/src/main/java/com/xr/device_car/config/common/LocalDateTimeConverter.java

@ -1,41 +0,0 @@
package com.xr.device_car.config.common;
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
/**
* @Author: ChenTaoTao
* @Date: 2022/3/28 10:07
* @Describe:
*/
public class LocalDateTimeConverter implements Converter<LocalDateTime> {
@Override
public Class<LocalDateTime> supportJavaTypeKey() {
return LocalDateTime.class;
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
@Override
public LocalDateTime convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
return LocalDateTime.parse(cellData.getStringValue(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}
@Override
public WriteCellData<String> convertToExcelData(LocalDateTime value, ExcelContentProperty contentProperty,
GlobalConfiguration globalConfiguration) {
return new WriteCellData<>(value.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
}
}

281
device_cars/src/main/java/com/xr/device_car/config/common/RESTClient.java

@ -1,281 +0,0 @@
package com.xr.device_car.config.common;
import com.xr.device_car.config.utils.HttpResponseBean;
import org.apache.http.*;
import org.apache.http.client.HttpRequestRetryHandler;
import org.apache.http.client.config.CookieSpecs;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.protocol.HttpContext;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLHandshakeException;
import java.io.IOException;
import java.net.ConnectException;
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Http请求客户端
* @author ChenYongHeng
* @since 2019/5/27
*/
public class RESTClient {
private static Logger log = LoggerFactory.getLogger(RESTClient.class);
private volatile static RESTClient HttpClientConnectionPool;
private static final String USERAGENT = "SZ-JAVA";
private static final String CHARSET = "UTF-8";
private static final int MAX_TOTAL_CONNECTIONS = 200;
private static final int MAX_ROUTE_CONNECTIONS = 100;
/**
* 连接时间
*/
private static final int CONNECT_TIMEOUT = 5000;
/**
* 获取内容时间
*/
private static final int SOCKET_TIMEOUT = 30000;
private static PoolingHttpClientConnectionManager cm = null;
private static CloseableHttpClient HTTP_CLIENTS;
/**
* 初始化连接池
*/
static{
try {
cm = new PoolingHttpClientConnectionManager();
cm.setMaxTotal(MAX_TOTAL_CONNECTIONS);
// 默认设置为2
cm.setDefaultMaxPerRoute(MAX_ROUTE_CONNECTIONS);
// 客户端请求的默认设置
RequestConfig defaultRequestConfig = RequestConfig.custom()
.setSocketTimeout(SOCKET_TIMEOUT)
.setConnectTimeout(CONNECT_TIMEOUT)
.setConnectionRequestTimeout(CONNECT_TIMEOUT)
.setRedirectsEnabled(false)
.setCookieSpec(CookieSpecs.STANDARD_STRICT)
.build();
// 请求重试处理
HttpRequestRetryHandler httpRequestRetryHandler = new HttpRequestRetryHandler() {
@Override
public boolean retryRequest(IOException exception,
int executionCount, HttpContext context) {
// 如果超过最大重试次数,那么就不要继续了
if (executionCount >= 2) {
return false;
}
// 如果服务器丢掉了连接,那么就重试
if (exception instanceof NoHttpResponseException) {
return true;
}
// 不要重试SSL握手异常
if (exception instanceof SSLHandshakeException) {
return false;
}
HttpRequest request = (HttpRequest) context.getAttribute(HttpClientContext.HTTP_REQUEST);
boolean idempotent = !(request instanceof HttpEntityEnclosingRequest);
// 如果请求被认为是幂等的,那么就重试
if (idempotent) {
return true;
}
return false;
}
};
// https 信任所有
SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, (chain, authType) -> true).build();
HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE;
SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext, hostnameVerifier);
HTTP_CLIENTS = HttpClients.custom()
.setConnectionManager(cm)
.setDefaultRequestConfig(defaultRequestConfig)
.setRetryHandler(httpRequestRetryHandler)
//https
.setSSLSocketFactory(sslSocketFactory)
.build();
} catch (Exception e) {
e.printStackTrace();
}
}
private RESTClient(){}
/**
* 获取HttpClientConnectionPool对象这是单例方法
*
* @return
*/
public static RESTClient getClientConnectionPool() {
if (HttpClientConnectionPool == null) {
synchronized (RESTClient.class) {
if (HttpClientConnectionPool == null) {
HttpClientConnectionPool = new RESTClient();
}
}
}
return HttpClientConnectionPool;
}
/**
* 一般情况下是AuthToken使用
* @param url
* @param xmlFileName
* @return
*/
public HttpResponseBean postXML(String url, String xmlFileName){
return postXML( url, xmlFileName,"");
}
/**
* 一般情况下是DigestBean使用
* @param url
* @param xmlFileName
* @param auth
* @return
*/
public HttpResponseBean postXML(String url,String xmlFileName,String auth){
HttpPost httpPost = new HttpPost(url);
String seqNum = String.valueOf(System.currentTimeMillis());
httpPost.setHeader(HttpHeaders.CONTENT_TYPE, "application/soap+xml; charset=utf-8");
if(StringUtils.hasLength(xmlFileName))httpPost.setEntity(new StringEntity(xmlFileName, ContentType.APPLICATION_JSON));
if(StringUtils.hasLength(auth)) httpPost.setHeader("Authorization",auth);
log.info(seqNum+">>> "+httpPost.toString());
log.info(seqNum+"Body>>> " +xmlFileName);
return httpPost(httpPost,seqNum);
}
/**
* Post方法封装发送post请求获取响应内容
*/
public String fetchByPostMethod(String url, String jsonStr) {
String resultStr = null;
HttpPost httpPost = httpPostAddHeader(url, jsonStr);
String seqNum = String.valueOf(System.currentTimeMillis());
log.info(seqNum + ">>> " + httpPost.toString());
log.info(seqNum + "Body>>> " + jsonStr);
HttpResponse response;
try {
response = HTTP_CLIENTS.execute(httpPost);
HttpEntity entity = response.getEntity();
resultStr = EntityUtils.toString(entity, CHARSET);
EntityUtils.consume(entity);
} catch (IOException ce) {// 服务器请求失败
log.error(ce.getMessage());
} finally {
httpPost.abort();
}
log.info(seqNum + "<<< " + resultStr);
return resultStr;
}
/**
* 添加头部信息
* @param url
* @param jsonStr
* @return
*/
private HttpPost httpPostAddHeader(String url, String jsonStr){
HttpPost httpPost = new HttpPost(url);
httpPost.setEntity(new StringEntity(jsonStr, ContentType.APPLICATION_JSON));
httpPost.addHeader(HttpHeaders.USER_AGENT, USERAGENT);
httpPost.addHeader(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.toString());
return httpPost;
}
/**
* httppost
* @param httpPost
* @param seqNum
* @return
*/
private HttpResponseBean httpPost(HttpPost httpPost,String seqNum ) {
String resultStr = null;
HttpResponse response = null;
try{
response = HTTP_CLIENTS.execute(httpPost);
int statusCode = response.getStatusLine().getStatusCode();
if(statusCode == HttpStatus.SC_UNAUTHORIZED) {
//如果是401直接返回
return new HttpResponseBean(null, Arrays.asList(response.getAllHeaders()),response.getStatusLine().getStatusCode());
}
HttpEntity entity = response.getEntity();
resultStr = EntityUtils.toString(entity,CHARSET);
EntityUtils.consume(entity);
}catch (ConnectException ce){// 服务器请求失败
log.error("ConnectException fetchByPostMethod---->>>{}",ce.getMessage());
} catch (IOException e) {
log.error("IOException fetchByPostMethod---->>>{}",e.getMessage());
}finally {
httpPost.abort();
}
log.info(seqNum+"<<< "+resultStr);
if(response != null) return new HttpResponseBean(resultStr, Arrays.asList(response.getAllHeaders()),response.getStatusLine().getStatusCode());
return null;
}
/**
* 正则获取字符编码
* @param content_type
* @return
*/
private static String getCharSetFromContentType(String content_type){
String regex = "charset=\\s*(\\S*[^;])";
Pattern pattern = Pattern.compile(regex,Pattern.DOTALL);
Matcher matcher = pattern.matcher(content_type);
if(matcher.find()){
return matcher.group(1);
}else{
return null;
}
}
}

33
device_cars/src/main/java/com/xr/device_car/config/udp/UdbConfig.java

@ -1,33 +0,0 @@
package com.xr.device_car.config.udp;
import com.xr.device_car.modules.analysis.entity.MeterConfig;
import com.xr.device_car.modules.analysis.entity.MeterReadingRecord;
import lombok.Data;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Random;
@Data
public class UdbConfig {
//获取资源信息配置报文
public static String getUdbConfig(List<MeterConfig> list){
StringBuffer buffer=new StringBuffer();
SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
buffer.append(new Date().getTime()+ new Random().nextInt(9000)+1000).append("\t");
buffer.append("<!Entity=表计识别信息转发配置 ver='V1.0' time='"+sdf.format(new Date())+"'(文件最新时间)!>");
buffer.append("<DeviceInfo::设备资源信息>");
for(MeterConfig config:list){
buffer.append("站序号").append("\t");//站序号
buffer.append(config.getId()).append("\t");//监控索引号
buffer.append("中山站").append("/").append(config.getOwningInterval()).append("/").append(config.getDeviceName()).append("/").append(config.getMeterName()).append("\t");//设备名称=站名称+间隔名称+设备名称+开关名称
buffer.append(config.getMeterCode()).append("\t");//实物ID目前取表计ID
buffer.append("否").append(";");//是否联动信号目前取否,目前结尾符号位;
}
buffer.append("</DeviceInfo::设备资源信息>");
return buffer.toString();
}
}

68
device_cars/src/main/java/com/xr/device_car/config/udp/UdpClientConfig.java

@ -1,68 +0,0 @@
package com.xr.device_car.config.udp;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.xr.device_car.config.utils.StaticPropUtil;
import com.xr.device_car.modules.analysis.entity.SendUdpLog;
import com.xr.device_car.modules.analysis.service.SendUdpLogService;
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.DatagramChannel;
import io.netty.channel.socket.DatagramPacket;
import io.netty.channel.socket.nio.NioDatagramChannel;
import io.netty.util.CharsetUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.net.InetSocketAddress;
import java.text.SimpleDateFormat;
import java.util.Date;
@Configuration
public class UdpClientConfig {
@Autowired
private SendUdpLogService sendUdpLogService;
@Bean
public DatagramChannel udpChannel() {
EventLoopGroup group = new NioEventLoopGroup();
try {
Bootstrap bootstrap = new Bootstrap();
bootstrap.group(group)
.channel(NioDatagramChannel.class)
.option(ChannelOption.SO_BROADCAST, true)
.handler(new SimpleChannelInboundHandler<DatagramPacket>() {
@Override
protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket msg) throws Exception {
// 处理接收到的数据
String data = msg.content().toString(CharsetUtil.UTF_8);
QueryWrapper<SendUdpLog> queryWrapper=new QueryWrapper();
queryWrapper.eq("message_id",data.split(":")[0]);
SendUdpLog sendUdpLog = sendUdpLogService.getOne(queryWrapper);
if(sendUdpLog !=null){
sendUdpLog.setResTime(new Date());
sendUdpLog.setResMsg(data);
sendUdpLogService.updateById(sendUdpLog);
}
System.out.println("Received data: " + data);
}
});
return (DatagramChannel) bootstrap.bind(0).sync().channel();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Bean
public InetSocketAddress udpServerAddress() {
return new InetSocketAddress(StaticPropUtil.udpHost, StaticPropUtil.udpPort);
}
}

139
device_cars/src/main/java/com/xr/device_car/config/utils/EasyExcelUtil.java

@ -1,139 +0,0 @@
package com.xr.device_car.config.utils;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.handler.RowWriteHandler;
import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.handler.context.RowWriteHandlerContext;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.extension.api.R;
import com.xr.device_car.config.common.LocalDateConverter;
import com.xr.device_car.config.common.LocalDateTimeConverter;
import com.xr.device_car.modules.analysis.entity.xslx.SendUdpLogXslx;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @Author: ChenTaoTao
* @Date: 2022/3/19 16:51
* @Describe: 文件导出
*/
@Slf4j
public class EasyExcelUtil {
public static <T> void writeExcel(HttpServletResponse response, List<T> data, Class tClass, String name){
try {
List<Class> list=convertList(data,tClass);
String dateStr = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
name = name+dateStr;
//防止下载时中文乱码
name = new String(name.getBytes("UTF-8"), "ISO-8859-1");
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
//添加这个是防止前端拿不到Content-disposition
response.setHeader("Content-Disposition", "attachment;filename=" + name+".xlsx");
response.setHeader("Access-Control-Expose-Headers","Content-disposition");
// 这里需要设置不关闭流
EasyExcel.write(response.getOutputStream(), tClass).autoCloseStream(Boolean.FALSE).sheet(name).registerConverter(new LocalDateConverter()).registerConverter(new LocalDateTimeConverter())
.registerWriteHandler(getCellStyleStrategy()).doWrite(list);
} catch (Exception e) {
log.error("文件导出失败,错误信息{}",e);
// 重置response
response.reset();
response.setContentType("application/json");
response.setCharacterEncoding("utf-8");
R r = R.failed("文件下载失败");
try {
response.getWriter().println(JSON.toJSONString(r));
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
}
private static HorizontalCellStyleStrategy getCellStyleStrategy() {
// 创建标题样式和内容样式
WriteCellStyle headerStyle = new WriteCellStyle();
headerStyle.setBorderLeft(BorderStyle.THIN);
headerStyle.setBorderTop(BorderStyle.THIN);
headerStyle.setBorderRight(BorderStyle.THIN);
headerStyle.setBorderBottom(BorderStyle.THIN);
WriteCellStyle contentStyle = new WriteCellStyle();
contentStyle.setBorderLeft(BorderStyle.THIN);
contentStyle.setBorderTop(BorderStyle.THIN);
contentStyle.setBorderRight(BorderStyle.THIN);
contentStyle.setBorderBottom(BorderStyle.THIN);
return new HorizontalCellStyleStrategy(headerStyle,contentStyle);
}
public static <T, S> List<S> convertList(List<T> list, Class<S> targetClass) throws NoSuchFieldException, IllegalAccessException, ParseException, NoSuchMethodException, InvocationTargetException, InstantiationException {
List<S> resultList = new ArrayList<>();
for (T sourceObj : list) {
S targetObj = targetClass.getDeclaredConstructor().newInstance();
Field[] sourceFields = sourceObj.getClass().getDeclaredFields();
Field[] targetFields = targetClass.getDeclaredFields();
for (Field sourceField : sourceFields) {
Field targetField = getField(targetFields, sourceField.getName());
if (targetField != null) {
sourceField.setAccessible(true);
targetField.setAccessible(true);
Object sourceValue = sourceField.get(sourceObj);
Object targetValue = convertFieldValue(sourceValue, targetField.getType(),sourceField.getType());
targetField.set(targetObj, targetValue);
}
}
resultList.add(targetObj);
}
return resultList;
}
private static Field getField(Field[] fields, String fieldName) {
for (Field field : fields) {
if (field.getName().equals(fieldName)) {
return field;
}
}
return null;
}
private static Object convertFieldValue(Object value, Class<?> targetType,Class<?> type1) throws ParseException {
if (type1 == String.class) {
return value.toString();
} else if (targetType == String.class && value instanceof Date) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return dateFormat.format(value);
}
return value;
}
}

52
device_cars/src/main/java/com/xr/device_car/config/utils/HkComUtil.java

@ -1,52 +0,0 @@
package com.xr.device_car.config.utils;
import com.xr.device_car.modules.analysis.entity.BallheadPT;
import com.xr.device_car.modules.analysis.entity.DeviceCamera;
import com.xr.device_car.modules.analysis.entity.OnvifAuthBean;
import com.xr.device_car.modules.analysis.entity.OnvifBean;
import org.springframework.util.CollectionUtils;
import java.awt.image.BufferedImage;
import java.util.List;
public class HkComUtil {
public static BufferedImage getBole(DeviceCamera device) throws Exception{ //拉取枪机图片
OnvifAuthBean onvifBean= new OnvifAuthBean(device.getDeviceIp(),80,device.getAccount(),device.getPassword());
String url= OnvifBean.getRequestUrl(onvifBean);
String auth = OnvifUtils.getAuthorization("digest",onvifBean,"digest/GetProfiles.wsdl", url);
System.out.println("鉴权:"+auth);
//获取Token
List<String> profileTokens = OnvifUtils.getProfileTokens(onvifBean,auth);
System.out.println("Token:"+profileTokens);
onvifBean.setAuth(auth);
if(!CollectionUtils.isEmpty(profileTokens)){
String snapshotUrl=null;
String token = profileTokens.get(0);
BallheadPT ballheadPT=OnvifUtils.getPtzStatus(token,onvifBean);
//如果类型是球机转换指定点位
if(device.getDeviceType().equals("3") && OnvifUtils.ptzCamera(token,onvifBean,device.getX(),device.getY(),device.getZ())){
Thread.sleep(1000);
//拉取图片
snapshotUrl = OnvifUtils.getSnapshotUrl(token,onvifBean);
if(snapshotUrl!=null){
//转回原来位置
OnvifUtils.ptzCamera(token,onvifBean,ballheadPT.getX(),ballheadPT.getY(),ballheadPT.getZ());
}
//如果类型是固定枪机,直接获取图片
}else{
snapshotUrl = OnvifUtils.getSnapshotUrl(token,onvifBean);
}
//返回图片地址
return Files.urlByImages(snapshotUrl,device.getAccount(),device.getPassword());
}
return null;
}
}

55
device_cars/src/main/java/com/xr/device_car/config/utils/HttpResponseBean.java

@ -1,55 +0,0 @@
package com.xr.device_car.config.utils;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.apache.http.Header;
import org.apache.http.HttpStatus;
import java.util.List;
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class HttpResponseBean {
private String body;
private List<Header> headers;
private Integer status;
/**
* 获取头部信息
* @param name
* @return
*/
public Header getFirstHeader(final String name) {
for (int i = 0; i < this.headers.size(); i++) {
final Header header = this.headers.get(i);
if (header.getName().equalsIgnoreCase(name)) {
return header;
}
}
return null;
}
/***
* 判断是否成功
*/
public static boolean isSuccess(HttpResponseBean httpResponseBean){
return httpResponseBean!= null && HttpStatus.SC_OK ==httpResponseBean.getStatus();
}
/***
* 判断是否是401
*/
public static boolean isUnAuthorzied(HttpResponseBean httpResponseBean){
return httpResponseBean!= null && HttpStatus.SC_UNAUTHORIZED ==httpResponseBean.getStatus();
}
public HttpResponseBean(String body) {
this.body = body;
}
}

72
device_cars/src/main/java/com/xr/device_car/config/utils/MinioUtil.java

@ -1,72 +0,0 @@
package com.xr.device_car.config.utils;
import io.minio.MinioClient;
import io.minio.errors.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;
import org.xmlpull.v1.XmlPullParserException;
import java.io.*;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.UUID;
public class MinioUtil {
private final static Logger log= LoggerFactory.getLogger(MinioUtil.class);
private static MinioClient minioClient;
private static MinioClient minioInit(){
try {
if(minioClient == null){
minioClient = new MinioClient(StaticPropUtil.minioUrl, StaticPropUtil.minioAccess, StaticPropUtil.minioSecret);
}
} catch (InvalidEndpointException e) {
throw new RuntimeException(e);
} catch (InvalidPortException e) {
throw new RuntimeException(e);
}
return minioClient;
}
public static String uploadMultipartFile(MultipartFile file) throws Exception {
MinioClient minioClient = minioInit();
InputStream is = file.getInputStream();
//使用uuid生成新的唯一文件名
String fileName = UUID.randomUUID().toString().replace("-", "") + file.getOriginalFilename();
//获取文件类型
String contentType = file.getContentType();//把文件放置Minio桶
minioClient.putObject("meter", fileName, is, contentType);
//获取访问路径
String url = minioClient.presignedGetObject("meter", fileName);
if (url != null) {
//返回路径不为空,即上传文件成功
return url.split("\\?")[0];
} else {
//上传失败
return"上传失败";
}
}
public static String uploadFile(File file) throws IOException, InvalidArgumentException, InvalidBucketNameException, InsufficientDataException, XmlPullParserException, ErrorResponseException, NoSuchAlgorithmException, NoResponseException, InvalidKeyException, InternalException, InvalidExpiresRangeException {
MinioClient minioClient = minioInit();
InputStream is = new FileInputStream(file);
//使用uuid生成新的唯一文件名
String fileName = UUID.randomUUID().toString().replace("-", "") + file.getName();
//获取文件类型
String contentType = fileName.substring(fileName.lastIndexOf(".")+1);//把文件放置Minio桶
minioClient.putObject("meter", fileName, is, contentType);
//获取访问路径
String url = minioClient.presignedGetObject("meter", fileName);
if (url != null) {
//返回路径不为空,即上传文件成功
return url.split("\\?")[0];
} else {
//上传失败
return"上传失败";
}
}
}

141
device_cars/src/main/java/com/xr/device_car/config/utils/OnvifUtils.java

@ -1,141 +0,0 @@
package com.xr.device_car.config.utils;
import com.xr.device_car.config.common.RESTClient;
import com.xr.device_car.modules.analysis.entity.BallheadPT;
import com.xr.device_car.modules.analysis.entity.DigestBean;
import com.xr.device_car.modules.analysis.entity.OnvifAuthBean;
import com.xr.device_car.modules.analysis.entity.OnvifBean;
import org.springframework.core.io.ClassPathResource;
import org.springframework.util.StringUtils;
import java.util.List;
import static com.xr.device_car.config.common.Const.HEADERS_ONVIF_WWW_AUTHENTICATE;
public class OnvifUtils {
/**
* 获取鉴权
* @param authType
* @param requestOnvifBean
* @param wsdl
* @param requestUrl
* @return
*/
public static String getAuthorization(String authType, OnvifBean requestOnvifBean, String wsdl, String requestUrl) {
//参数
// 读取GetProfiles.wsdl
String getProfiles = FileUtil.fileReader(new ClassPathResource(wsdl));
HttpResponseBean httpResponseBean = RESTClient.getClientConnectionPool()
.postXML(requestUrl, getProfiles);
//如果是401的话 获取WWW-Authenticate 重新请求
if (HttpResponseBean.isUnAuthorzied(httpResponseBean)) {
DigestBean digestBean = new DigestBean().getDigestBean(authType,requestOnvifBean, httpResponseBean.getFirstHeader(HEADERS_ONVIF_WWW_AUTHENTICATE).getValue());
return digestBean.getToken();
}
return null;
}
/**
* 获取Token
* @param requestOnvifBean
* @param auth
* @return
*/
public static List<String> getProfileTokens(OnvifBean requestOnvifBean, String auth) {
//请求url
String requestUrl = OnvifBean.getRequestUrl(requestOnvifBean);
//参数
// 读取GetProfiles.wsdl
String getProfiles = FileUtil.fileReader(new ClassPathResource("digest/GetProfiles.wsdl"));
HttpResponseBean httpResponseBean = RESTClient.getClientConnectionPool()
.postXML(requestUrl, getProfiles,auth);
if(httpResponseBean != null) {
String resultStr = httpResponseBean.getBody();
if (HttpResponseBean.isSuccess(httpResponseBean) && StringUtils.hasLength(resultStr)) {
return AnalysisXml.analysisTokens(resultStr);
}
}
return null;
}
/**
* 获取截图地址
* @param profileToken token
* @param requestOnvifBean
* @return
*/
public static String getSnapshotUrl(String profileToken, OnvifAuthBean requestOnvifBean) {
String requestUrl = OnvifBean.getRequestUrl(requestOnvifBean);
//参数
// 读取GetProfiles.wsdl
String snapshotUrlWsdl = FileUtil.fileReader(new ClassPathResource("digest/GetSnapshotUrl.wsdl"));
HttpResponseBean httpResponseBean = RESTClient.getClientConnectionPool()
.postXML(requestUrl, String.format(snapshotUrlWsdl,profileToken),requestOnvifBean.getAuth());
String resultStr = httpResponseBean.getBody();
if(StringUtils.hasLength(resultStr) && HttpResponseBean.isSuccess(httpResponseBean)) {
return AnalysisXml.analysisSnapshotUrl(resultStr);
}
return null;
}
//绝对位置转动球机
public static boolean ptzCamera(String profileToken,OnvifAuthBean requestOnvifBean,String x,String y,String z){
String requestUrl = OnvifBean.getRequestUrl(requestOnvifBean);
String snapshotUrlWsdl = FileUtil.fileReader(new ClassPathResource("digest/AbsoluteMove.wsdl"));
String wsdl = String.format(snapshotUrlWsdl,profileToken,x,y,z);
HttpResponseBean httpResponseBean = RESTClient.getClientConnectionPool()
.postXML(requestUrl, wsdl,requestOnvifBean.getAuth());
String resultStr = httpResponseBean.getBody();
if(StringUtils.hasLength(resultStr) && HttpResponseBean.isSuccess(httpResponseBean)) {
return true;
}
return false;
}
//获取球机当前位置
public static BallheadPT getPtzStatus(String token,OnvifAuthBean requestOnvifBean){
String requestUrl = OnvifBean.getRequestUrl(requestOnvifBean);
String snap = FileUtil.fileReader(new ClassPathResource("digest/GetStatus.wsdl"));
String wsdl = String.format(snap,token);
HttpResponseBean httpResponseBean = RESTClient.getClientConnectionPool()
.postXML(requestUrl, wsdl,requestOnvifBean.getAuth());
String resultStr = httpResponseBean.getBody();
if(StringUtils.hasLength(resultStr) && HttpResponseBean.isSuccess(httpResponseBean)) {
return AnalysisXml.getStatus(resultStr);
}
return null;
}
//获取所有预置点
public static List<BallheadPT> getBallHeadPts(String profileToken,OnvifAuthBean requestOnvifBean){
String requestUrl = OnvifBean.getRequestUrl(requestOnvifBean);
String snapshotUrlWsdl = FileUtil.fileReader(new ClassPathResource("digest/GetPresets.wsdl"));
String wsdl = String.format(snapshotUrlWsdl,profileToken);
HttpResponseBean httpResponseBean = RESTClient.getClientConnectionPool()
.postXML(requestUrl, wsdl,requestOnvifBean.getAuth());
String resultStr = httpResponseBean.getBody();
if(StringUtils.hasLength(resultStr) && HttpResponseBean.isSuccess(httpResponseBean)) {
return AnalysisXml.getBallheadPTs(resultStr);
}
return null;
}
//前往指定预置点
public static boolean gotoBallHeadPts(String profileToken, OnvifAuthBean requestOnvifBean, BallheadPT ballheadPT){
String requestUrl = OnvifBean.getRequestUrl(requestOnvifBean);
String snapshotUrlWsdl = FileUtil.fileReader(new ClassPathResource("digest/GotoPreset.wsdl"));
String wsdl = String.format(snapshotUrlWsdl,profileToken,ballheadPT.getId());
HttpResponseBean httpResponseBean = RESTClient.getClientConnectionPool()
.postXML(requestUrl, wsdl,requestOnvifBean.getAuth());
String resultStr = httpResponseBean.getBody();
if(StringUtils.hasLength(resultStr) && HttpResponseBean.isSuccess(httpResponseBean)) {
return true;
}
return false;
}
}

231
device_cars/src/main/java/com/xr/device_car/config/utils/PythonExecutor.java

@ -1,231 +0,0 @@
package com.xr.device_car.config.utils;
import cn.hutool.extra.spring.SpringUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.xr.device_car.modules.analysis.entity.MeterInitialization;
import com.xr.device_car.modules.analysis.service.IMeterInitializationService;
import com.xr.device_car.modules.analysis.service.MeterConfigService;
import com.xr.device_car.modules.analysis.service.impl.MeterInitializationServiceImpl;
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class PythonExecutor {
public static void main(String[] args) throws Exception {
try {
String pythonPath = StaticPropUtil.pythonPath;
ProcessBuilder processBuilder = new ProcessBuilder(pythonPath);
// 启动子进程
Process process = processBuilder.start();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
bw.write("import sys\n");
bw.write("sys.path.append(\"D:\\smartGrid\\smartGrid\\models\")\n");
bw.write("import indicatorLightStatus as ils\n");
bw.write("import switchRecognition as sr\n");
bw.write("import liquidLevel as ll\n");
bw.write("liquid_level_image_path = 'D:\\smartGrid\\smartGrid\\weights\\DIGITAL_METER (41).JPG'\n");
bw.write("ll.calculate_rgb_min_max([[112,\"D:\\smartGrid\\smartGrid\\weights\\DIGITAL_METER (41).JPG\"]])\n");
bw.write("print(\"Liquid level weights initialized.\")\n");
bw.write("liquid_level_image_path = 'D:\\smartGrid\\smartGrid\\weights\\DIGITAL_METER (10).JPG'\n");
bw.write("liquid_level = ll.calculate_liquid_level([112,liquid_level_image_path])\n");
bw.write("print(f\"Liquid level: {liquid_level}\")\n");
bw.close();
// 获取子进程的输出流
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
// 读取输出
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
// 等待进程执行完成
int exitCode = process.waitFor();
System.out.println("Exit Code: " + exitCode);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
private static boolean meterInit(String code) throws Exception {
String pythonPath = StaticPropUtil.pythonPath;
String modelPath = StaticPropUtil.modelPath;
ProcessBuilder processBuilder = new ProcessBuilder(pythonPath);
// 启动子进程
Process process = processBuilder.start();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
bw.write("import sys\n");
String imports = "sys.path.append(\"%s\")\n";
bw.write(String.format(imports, modelPath));
bw.write("import indicatorLightStatus as ils\n");
bw.write("import switchRecognition as sr\n");
bw.write("import liquidLevel as ll\n");
bw.write(code);
bw.write("print(\"success\")\n");
bw.close();
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
List<String> list = new ArrayList<>();
String line;
// 读取输出
while ((line = reader.readLine()) != null) {
list.add(line);
System.out.println(line);
}
BufferedReader exception = new BufferedReader(new InputStreamReader(process.getErrorStream()));
List<String> list1 = new ArrayList<>();
String line1;
// 读取输出
while ((line1 = exception.readLine()) != null) {
list1.add(line1);
System.out.println(line1);
}
// 等待进程执行完成
int exitCode = process.waitFor();
System.out.println("Exit Code: " + exitCode);
if (list.contains("success") && list1.isEmpty()) {
return true;
}
return false;
}
/**
* 初始化算法
* id 表计配置ID
* sfType 4 灯光 3 开关 5 液位计
*/
public static boolean meterInit(Integer id, String sfType) throws Exception {
IMeterInitializationService meterInitializationService = SpringUtil.getBean(MeterInitializationServiceImpl.class);
QueryWrapper<MeterInitialization> query = new QueryWrapper<>();
query.eq("meter_id", id);
query.orderByAsc("serial");
List<MeterInitialization> list = meterInitializationService.list(query);
List<String> path = list.stream().map(n -> n.getImgAddress()).collect(Collectors.toList());
String ph = "";
for (String str : path) {
str = str.replace("\\", "\\\\");
ph += "\"" + str + "\"" + ",";
}
ph = ph.substring(0, ph.length() - 1);
String code = "";
if (sfType.equals("4")) {
List<List<Object>> list1 = new ArrayList<>();
List<Object> list2 = new ArrayList<>();
list2.add(id);
List<String> list3 = new ArrayList<>();
list3.add(ph);
list2.add(list3);
list1.add(list2);
code = "ils.calculate_luminance_threshold(" + Arrays.toString(list1.toArray()) + ")\n";
}
if (sfType.equals("3")) {
List<String> list1 = new ArrayList<>();
path.add(0, id + "");
list1.add(ph);
code = "sr.initialize(" + Arrays.toString(list1.toArray()) + ")\n";
}
if (sfType.equals("5")) {
List<String> list1 = new ArrayList<>();
// list1.add(id.toString());
//path.add(0, id + "");
list1.add(ph);
// String params = String.join( list1);
//Arrays.toString(list1.toArray())
code = "ll.calculate_rgb_min_max("+"[["+id+ ","+ ph +"]]"+")\n";
}
return meterInit(code);
}
/**
* 读取结果
* id 表计id
* path 图片路径
* sfType 1 灯光 2 开关 3 液位计 4 指针
*/
public static String readNumber(Integer id, String path, String sfType) throws Exception {
String pythonPath = StaticPropUtil.pythonPath;
String modelPath = StaticPropUtil.modelPath;
ProcessBuilder processBuilder = new ProcessBuilder(pythonPath);
// 启动子进程
Process process = processBuilder.start();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
bw.write("import sys\n");
String imports = "sys.path.append(\"%s\")\n";
bw.write(String.format(imports, modelPath));
bw.write("import indicatorLightStatus as ils\n");
bw.write("import switchRecognition as sr\n");
bw.write("import liquidLevel as ll\n");
bw.write("indicator_light_image_path = '" + path + "'\n");
if (sfType.equals("4")) {
bw.write("value = ils.check_indicator_light_status(" + id + ",indicator_light_image_path)\n");
}
if (sfType.equals("3")) {
bw.write("value = sr.read_numbers(" + id + ",indicator_light_image_path)\n");
}
if (sfType.equals("5")) {
bw.write("value = ll.calculate_liquid_level([" + id + ",indicator_light_image_path,\"down\"])\n");
}
if (sfType.equals("0")) {
bw.write("rotate_angle, value = pr.getPointerAngleAndNum(" + id + ", indicator_light_image_path)\n");
}
bw.write("print(f\"value:{value}\")");
bw.close();
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
List<String> list = new ArrayList<>();
String line;
// 读取输出
while ((line = reader.readLine()) != null) {
list.add(line);
}
BufferedReader exception = new BufferedReader(new InputStreamReader(process.getErrorStream()));
List<String> list1 = new ArrayList<>();
String line1;
// 读取输出
while ((line1 = exception.readLine()) != null) {
list.add(line1);
}
// if(list.contains("value")){
// String value = list.get(list.indexOf("value")).split(":")[1];
// File file = new File(path);
// if(file.exists()){
// file.delete();
// }
// return value;
// }
for (String element : list) {
if (element.contains("value")) {
String[] parts = element.split(":");
File file = new File(path);
if (file.exists()) {
file.delete();
}
if (parts.length > 1) {
String result = parts[1].trim();
return result;
}
}
}
return null;
}
}

177
device_cars/src/main/java/com/xr/device_car/modules/analysis/controller/MeterInitializationController.java

@ -1,177 +0,0 @@
package com.xr.device_car.modules.analysis.controller;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.xr.device_car.config.common.Result;
import com.xr.device_car.config.utils.*;
import com.xr.device_car.modules.analysis.entity.DeviceCamera;
import com.xr.device_car.modules.analysis.entity.MeterConfig;
import com.xr.device_car.modules.analysis.entity.MeterInitialization;
import com.xr.device_car.modules.analysis.entity.MeterType;
import com.xr.device_car.modules.analysis.service.DeviceCameraService;
import com.xr.device_car.modules.analysis.service.IMeterInitializationService;
import com.xr.device_car.modules.analysis.service.MeterConfigService;
import com.xr.device_car.modules.analysis.service.MeterTypeService;
import io.minio.MinioClient;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.InputStream;
import java.util.*;
import java.awt.image.BufferedImage;
/**
* <p>
* 表计算法初始化 前端控制器
* </p>
*
* @author gaoby
* @since 2023-11-20
*/
@RestController
@RequestMapping("/meterInitialization")
@RequiredArgsConstructor
public class MeterInitializationController {
@Value("${upLoad.file}")
private String uploadDir;
private final MeterConfigService meterConfigService;
private final DeviceCameraService deviceCameraService;
private final IMeterInitializationService iMeterInitializationService;
private final MeterTypeService meterTypeService;
@PostMapping("pullImages")
public Result<?> pullImages(MeterInitialization meterInitialization){
MeterConfig config=meterConfigService.getById(meterInitialization.getMeterId());
DeviceCamera deviceCamera = deviceCameraService.getById(config.getCameraId());
BufferedImage bufferedImage=null;
try {
if(deviceCamera.getDeviceType().equals("1")|| deviceCamera.getDeviceType().equals("2")){
bufferedImage= AdbUtil.getCamDevice();
}
if(deviceCamera.getDeviceType().equals("3") || deviceCamera.getDeviceType().equals("4")){ // 拉取球机
bufferedImage= HkComUtil.getBole(deviceCamera);
}
long l = new Date().getTime();
String path = StaticPropUtil.imagePath +l+".png";
File file=Files.saveImageForPath(bufferedImage,path);
String url = MinioUtil.uploadFile(file);
QueryWrapper<MeterInitialization> queryWrapper=new QueryWrapper<>();
queryWrapper.eq("meter_id",meterInitialization.getMeterId());
queryWrapper.orderByDesc("serial");
List<MeterInitialization> meterInitialization1=iMeterInitializationService.list(queryWrapper);
MeterInitialization meterInitialization2 = getMeterInitialization(meterInitialization, meterInitialization1, path,url);
iMeterInitializationService.save(meterInitialization2);
}catch (Exception e){
e.printStackTrace();
return Result.error(e.getMessage());
}
return Result.OK("拉取成功!");
}
private static MeterInitialization getMeterInitialization(MeterInitialization meterInitialization, List<MeterInitialization> meterInitialization1, String path,String url) {
MeterInitialization meterInitialization2=new MeterInitialization();
meterInitialization2.setMeterId(meterInitialization.getMeterId());
if(meterInitialization1.isEmpty()){
meterInitialization2.setSerial(0);
}else{
meterInitialization2.setSerial(meterInitialization1.get(0).getSerial()+1);
}
meterInitialization2.setValue(meterInitialization.getValue());
meterInitialization2.setImgAddress(path);
meterInitialization2.setImg(url);
return meterInitialization2;
}
@PostMapping("/uploadImg")
public Result<?> uploadImg(@RequestParam("imgFile") MultipartFile imgFile,@RequestParam("value") String value,@RequestParam("serial") String serial,@RequestParam("meterId") String meterId) throws Exception {
if (!imgFile.isEmpty()) {
// 获取文件名
String fileName = Objects.requireNonNull(imgFile.getOriginalFilename());
File folder = new File(StaticPropUtil.imagePath);
// 检查文件夹是否存在,如果不存在就创建它
if (!folder.exists()) {
folder.mkdirs(); // 创建文件夹及其父文件夹(如果不存在)
}
// 构建上传路径
String filePath = StaticPropUtil.imagePath + File.separator + fileName;
String imgAddress = StaticPropUtil.imagePath + fileName;
// 保存文件
File dest = new File(filePath);
imgFile.transferTo(dest);
// 上传至minIo服务器
String url = MinioUtil.uploadMultipartFile(imgFile);
if (url.equals("上传失败")){
Result.error("图片上传至服务器异常");
}
MeterInitialization meterInitialization = new MeterInitialization();
meterInitialization.setImg(url);
meterInitialization.setImgAddress(imgAddress);
meterInitialization.setMeterId(Integer.valueOf(meterId));
meterInitialization.setSerial(Integer.valueOf(serial));
meterInitialization.setValue(value);
QueryWrapper<MeterInitialization> wrapper = new QueryWrapper<>();
wrapper.eq("meter_id",meterInitialization.getMeterId());
iMeterInitializationService.save(meterInitialization);
return Result.OK("上传成功!");
}
return Result.error("上传图片异常,请联系管理员");
}
@PostMapping(value = "/queryPageList")
public Result<?> queryPageList(MeterInitialization meterInitialization, HttpServletRequest req)throws Exception{
// Page<MeterInitialization> pg = StringFormatterUtil.returnPage(req);
QueryWrapper<MeterInitialization> wrapper = StringFormatterUtil.returnQuery(req);
// meterId
if (ObjectUtil.isNotEmpty(meterInitialization.getMeterId())){
wrapper.eq("meter_id",meterInitialization.getMeterId());
}
wrapper.orderByAsc("serial");
List<MeterInitialization> meterInitializationList = iMeterInitializationService.list(wrapper);
return Result.OK(meterInitializationList);
}
@PostMapping(value = "/delImg")
public Result<?> delImg(Integer id) throws Exception {
iMeterInitializationService.removeById(id);
return Result.OK("删除成功!");
}
/**
* 初始化算法
*/
@PostMapping("initMeter")
public Result<?> initMeter(Integer meterId){
try{
MeterConfig meterConfig=meterConfigService.getById(meterId);
MeterType meterType = meterTypeService.getById(meterConfig.getTypeId());
if(PythonExecutor.meterInit(meterId,meterType.getMeterShape())){
meterConfig.setInitStatus("1");
meterConfigService.updateById(meterConfig);
}else{
return Result.error("初始化失败");
}
}catch (Exception e){
e.printStackTrace();
return Result.error(e.getMessage());
}
return Result.OK("初始化完成");
}
}

3
device_cars/src/main/java/com/xr/device_car/modules/analysis/controller/SendUdpLogController.java

@ -1,11 +1,9 @@
package com.xr.device_car.modules.analysis.controller;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xr.device_car.config.utils.EasyExcelUtil;
import com.xr.device_car.config.utils.StringFormatterUtil;
import com.xr.device_car.modules.analysis.entity.SendUdpLog;
import com.xr.device_car.modules.analysis.entity.xslx.SendUdpLogXslx;
@ -17,7 +15,6 @@ import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.*;
@RestController

2
device_cars/src/main/java/com/xr/device_car/modules/analysis/entity/SendUdpLog.java

@ -1,6 +1,5 @@
package com.xr.device_car.modules.analysis.entity;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
@ -9,7 +8,6 @@ import java.io.Serializable;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.xr.device_car.config.common.LocalDateTimeConverter;
import lombok.Data;
/**

12
device_cars/src/main/resources/digest/AbsoluteMove.wsdl

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:tptz="http://www.onvif.org/ver20/ptz/wsdl" xmlns:tt="http://www.onvif.org/ver10/schema">
<s:Body>
<tptz:AbsoluteMove>
<tptz:ProfileToken>%s</tptz:ProfileToken>
<tptz:Position>
<tt:PanTilt y="%s" x="%s" space="http://www.onvif.org/ver10/tptz/PanTiltSpaces/PositionGenericSpace" />
<tt:Zoom x="%s" space="http://www.onvif.org/ver10/tptz/ZoomSpaces/PositionGenericSpace" />
</tptz:Position>
</tptz:AbsoluteMove>
</s:Body>
</s:Envelope>

6
device_cars/src/main/resources/digest/GetDeviceInformation.wsdl

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:tds="http://www.onvif.org/ver10/device/wsdl" xmlns:tt="http://www.onvif.org/ver10/schema">
<soap:Body>
<tds:GetOnvifInformation />
</soap:Body>
</soap:Envelope>

6
device_cars/src/main/resources/digest/GetPTZ.wsdl

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:tptz="http://www.onvif.org/ver20/ptz/wsdl">
<s:Body>
<tptz:GetConfigurations />
</s:Body>
</s:Envelope>

8
device_cars/src/main/resources/digest/GetPresets.wsdl

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:tptz="http://www.onvif.org/ver20/ptz/wsdl" xmlns:tt="http://www.onvif.org/ver10/schema">
<s:Body>
<tptz:GetPresets>
<tptz:ProfileToken>%s</tptz:ProfileToken>
</tptz:GetPresets>
</s:Body>
</s:Envelope>

6
device_cars/src/main/resources/digest/GetProfiles.wsdl

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:trt="http://www.onvif.org/ver10/media/wsdl" xmlns:tt="http://www.onvif.org/ver10/schema">
<soap:Body>
<trt:GetProfiles />
</soap:Body>
</soap:Envelope>

8
device_cars/src/main/resources/digest/GetSnapshotUrl.wsdl

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:trt="http://www.onvif.org/ver10/media/wsdl" xmlns:tt="http://www.onvif.org/ver10/schema">
<soap:Body>
<trt:GetSnapshotUri>
<trt:ProfileToken>%s</trt:ProfileToken>
</trt:GetSnapshotUri>
</soap:Body>
</soap:Envelope>

8
device_cars/src/main/resources/digest/GetStatus.wsdl

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:tptz="http://www.onvif.org/ver20/ptz/wsdl" xmlns:tt="http://www.onvif.org/ver10/schema">
<s:Body>
<tptz:GetStatus>
<tptz:ProfileToken>%s</tptz:ProfileToken>
</tptz:GetStatus>
</s:Body>
</s:Envelope>

25
device_cars/src/main/resources/digest/GetStreamUri.wsdl

@ -1,25 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:trt="http://www.onvif.org/ver10/media/wsdl" xmlns:tt="http://www.onvif.org/ver10/schema">
<s:Header xmlns:s="http://www.w3.org/2003/05/soap-envelope">
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:UsernameToken>
<wsse:Username>%s</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">%s</wsse:Password>
<wsse:Nonce>%s</wsse:Nonce>
<wsu:Created>%s</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
</s:Header>
<soap:Body>
<GetStreamUri xmlns="http://www.onvif.org/ver10/media/wsdl">
<StreamSetup>
<!-- Attribute Wild card could not be matched. Generated XML may not be valid. -->
<Stream xmlns="http://www.onvif.org/ver10/schema">RTP-Unicast</Stream>
<Transport xmlns="http://www.onvif.org/ver10/schema">
<Protocol>%s</Protocol>
</Transport>
</StreamSetup>
<ProfileToken>%s</ProfileToken>
</GetStreamUri>
</soap:Body>
</soap:Envelope>

9
device_cars/src/main/resources/digest/GotoPreset.wsdl

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:tptz="http://www.onvif.org/ver20/ptz/wsdl" xmlns:tt="http://www.onvif.org/ver10/schema">
<s:Body>
<tptz:GotoPreset>
<tptz:ProfileToken>%s</tptz:ProfileToken>
<tptz:PresetToken>%s</tptz:PresetToken>
</tptz:GotoPreset>
</s:Body>
</s:Envelope>

55
device_udpclent/src/main/java/com/xr/device_udpclent/common/config/HttpResponseBean.java

@ -1,55 +0,0 @@
package com.xr.device_udpclent.common.config;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.apache.http.Header;
import org.apache.http.HttpStatus;
import java.util.List;
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class HttpResponseBean {
private String body;
private List<Header> headers;
private Integer status;
/**
* 获取头部信息
* @param name
* @return
*/
public Header getFirstHeader(final String name) {
for (int i = 0; i < this.headers.size(); i++) {
final Header header = this.headers.get(i);
if (header.getName().equalsIgnoreCase(name)) {
return header;
}
}
return null;
}
/***
* 判断是否成功
*/
public static boolean isSuccess(HttpResponseBean httpResponseBean){
return httpResponseBean!= null && HttpStatus.SC_OK ==httpResponseBean.getStatus();
}
/***
* 判断是否是401
*/
public static boolean isUnAuthorzied(HttpResponseBean httpResponseBean){
return httpResponseBean!= null && HttpStatus.SC_UNAUTHORIZED ==httpResponseBean.getStatus();
}
public HttpResponseBean(String body) {
this.body = body;
}
}

150
device_udpclent/src/main/java/com/xr/device_udpclent/common/utils/AnalysisXml.java

@ -1,150 +0,0 @@
package com.xr.device_udpclent.common.utils;
import com.xr.device_udpclent.models.entity.BallheadPT;
import net.logstash.logback.encoder.org.apache.commons.lang.StringEscapeUtils;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.ByteArrayInputStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class AnalysisXml {
/**
* 解析xml[Profiles] 获取 token
* @param resultStr
* @return
*/
public static List<String> analysisTokens(String resultStr){
// 解析body
// 转换返回结果中的特殊字符,返回的结果中会将xml转义,此处需要反转移
String xmlStr = StringEscapeUtils.unescapeXml(resultStr);
SAXReader reader = new SAXReader();
try {
Document document = reader.read(new ByteArrayInputStream(xmlStr.getBytes(StandardCharsets.UTF_8)));
Element root = document.getRootElement();
List<Element> elements = root.element("Body").element("GetProfilesResponse").elements("Profiles");
return elements.stream().map(element -> element.attribute("token").getText()).collect(Collectors.toList());
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 解析xml[ProfilesName] 获取 token
* @param resultStr
* @return
*/
public static List<String> analysisProfiles(String resultStr){
// 解析body
// 转换返回结果中的特殊字符,返回的结果中会将xml转义,此处需要反转移
String xmlStr = StringEscapeUtils.unescapeXml(resultStr);
SAXReader reader = new SAXReader();
try {
Document document = reader.read(new ByteArrayInputStream(xmlStr.getBytes(StandardCharsets.UTF_8)));
Element root = document.getRootElement();
List<Element> elements = root.element("Body").element("GetProfilesResponse").elements("Preset");
return elements.stream().map(element -> element.element("Name").getText()
).collect(Collectors.toList());
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 解析xml[MediaUri] 获取 token
* @param resultStr
* @return
*/
public static String analysisSnapshotUrl(String resultStr){
// 解析body
// 转换返回结果中的特殊字符,返回的结果中会将xml转义,此处需要反转移
String xmlStr = StringEscapeUtils.unescapeXml(resultStr).replace("&", "&amp;");
SAXReader reader = new SAXReader();
try {
Document document = reader.read(new ByteArrayInputStream(xmlStr.getBytes(StandardCharsets.UTF_8)));
Element rootElement = document.getRootElement();
Element element = rootElement.element("Body").element("GetSnapshotUriResponse").element("MediaUri");
return String.valueOf(element.elements("Uri").get(0).getData());
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 解析xml[MediaUri] 获取 streamUrl
* @param resultStr
* @return
*/
public static String analysisStreamUrl(String resultStr){
// 解析body
// 转换返回结果中的特殊字符,返回的结果中会将xml转义,此处需要反转移
String xmlStr = StringEscapeUtils.unescapeXml(resultStr).replace("&", "&amp;");
SAXReader reader = new SAXReader();
try {
Document document = reader.read(new ByteArrayInputStream(xmlStr.getBytes(StandardCharsets.UTF_8)));
Element rootElement = document.getRootElement();
Element element = rootElement.element("Body").element("GetStreamUriResponse").element("MediaUri");
return String.valueOf(element.elements("Uri").get(0).getData());
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static List<BallheadPT> getBallheadPTs(String resultStr){
List<BallheadPT> ballheadPTS=new ArrayList<>();
String xmlStr = StringEscapeUtils.unescapeXml(resultStr).replace("&", "&amp;");
SAXReader reader = new SAXReader();
try {
Document document = reader.read(new ByteArrayInputStream(xmlStr.getBytes(StandardCharsets.UTF_8)));
Element root = document.getRootElement();
List<Element> elements = root.element("Body").element("GetPresetsResponse").elements("Preset");
for(Element element:elements){
BallheadPT pt=new BallheadPT();
String id = element.attribute(0).getValue();
pt.setId(id);
String name = String.valueOf(element.element("Name").getText());
pt.setName(name);
List<Element> ele=element.elements("PTZPosition");
pt.setX(String.valueOf(ele.get(0).element("PanTilt").attribute(0).getValue()));
pt.setY(String.valueOf(ele.get(0).element("PanTilt").attribute(1).getValue()));
pt.setZ(String.valueOf(ele.get(0).element("Zoom").attribute(0).getValue()));
ballheadPTS.add(pt);
}
} catch (Exception e) {
e.printStackTrace();
}
return ballheadPTS;
}
public static BallheadPT getStatus(String resultStr){
String xmlStr = StringEscapeUtils.unescapeXml(resultStr).replace("&", "&amp;");
SAXReader reader = new SAXReader();
try {
Document document = reader.read(new ByteArrayInputStream(xmlStr.getBytes(StandardCharsets.UTF_8)));
Element root = document.getRootElement();
Element element = root.element("Body").element("GetStatusResponse").element("PTZStatus").element("Position");
String x=String.valueOf(element.element("PanTilt").attribute(0).getValue());
String y=String.valueOf(element.element("PanTilt").attribute(1).getValue());
String z=String.valueOf(element.element("Zoom").attribute(0).getValue());
BallheadPT pt=new BallheadPT();
pt.setX(x);
pt.setY(y);
pt.setZ(z);
return pt;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

152
device_udpclent/src/main/java/com/xr/device_udpclent/common/utils/OnvifUtils.java

@ -1,152 +0,0 @@
package com.xr.device_udpclent.common.utils;
import com.xr.device_udpclent.common.config.HttpResponseBean;
import com.xr.device_udpclent.common.config.OnvifAuthBean;
import com.xr.device_udpclent.models.entity.BallheadPT;
import com.xr.device_udpclent.models.entity.DigestBean;
import com.xr.device_udpclent.models.entity.OnvifBean;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.impl.auth.DigestScheme;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.springframework.core.io.ClassPathResource;
import org.springframework.util.StringUtils;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.List;
import static com.xr.device_udpclent.common.config.Const.HEADERS_ONVIF_WWW_AUTHENTICATE;
public class OnvifUtils {
/**
* 获取鉴权
* @param authType
* @param requestOnvifBean
* @param wsdl
* @param requestUrl
* @return
*/
public static String getAuthorization(String authType, OnvifBean requestOnvifBean, String wsdl, String requestUrl) {
//参数
// 读取GetProfiles.wsdl
String getProfiles = FileUtil.fileReader(new ClassPathResource(wsdl));
HttpResponseBean httpResponseBean = RESTClient.getClientConnectionPool()
.postXML(requestUrl, getProfiles);
//如果是401的话 获取WWW-Authenticate 重新请求
if (HttpResponseBean.isUnAuthorzied(httpResponseBean)) {
DigestBean digestBean = new DigestBean().getDigestBean(authType,requestOnvifBean, httpResponseBean.getFirstHeader(HEADERS_ONVIF_WWW_AUTHENTICATE).getValue());
return digestBean.getToken();
}
return null;
}
/**
* 获取Token
* @param requestOnvifBean
* @param auth
* @return
*/
public static List<String> getProfileTokens(OnvifBean requestOnvifBean, String auth) {
//请求url
String requestUrl = OnvifBean.getRequestUrl(requestOnvifBean);
//参数
// 读取GetProfiles.wsdl
String getProfiles = FileUtil.fileReader(new ClassPathResource("digest/GetProfiles.wsdl"));
HttpResponseBean httpResponseBean = RESTClient.getClientConnectionPool()
.postXML(requestUrl, getProfiles,auth);
if(httpResponseBean != null) {
String resultStr = httpResponseBean.getBody();
if (HttpResponseBean.isSuccess(httpResponseBean) && StringUtils.hasLength(resultStr)) {
return AnalysisXml.analysisTokens(resultStr);
}
}
return null;
}
/**
* 获取截图地址
* @param profileToken token
* @param requestOnvifBean
* @return
*/
public static String getSnapshotUrl(String profileToken, OnvifAuthBean requestOnvifBean) {
String requestUrl = OnvifBean.getRequestUrl(requestOnvifBean);
//参数
// 读取GetProfiles.wsdl
String snapshotUrlWsdl = FileUtil.fileReader(new ClassPathResource("digest/GetSnapshotUrl.wsdl"));
HttpResponseBean httpResponseBean = RESTClient.getClientConnectionPool()
.postXML(requestUrl, String.format(snapshotUrlWsdl,profileToken),requestOnvifBean.getAuth());
String resultStr = httpResponseBean.getBody();
if(StringUtils.hasLength(resultStr) && HttpResponseBean.isSuccess(httpResponseBean)) {
return AnalysisXml.analysisSnapshotUrl(resultStr);
}
return null;
}
//绝对位置转动球机
public static boolean ptzCamera(String profileToken,OnvifAuthBean requestOnvifBean,String x,String y,String z){
String requestUrl = OnvifBean.getRequestUrl(requestOnvifBean);
String snapshotUrlWsdl = FileUtil.fileReader(new ClassPathResource("digest/AbsoluteMove.wsdl"));
String wsdl = String.format(snapshotUrlWsdl,profileToken,x,y,z);
HttpResponseBean httpResponseBean = RESTClient.getClientConnectionPool()
.postXML(requestUrl, wsdl,requestOnvifBean.getAuth());
String resultStr = httpResponseBean.getBody();
if(StringUtils.hasLength(resultStr) && HttpResponseBean.isSuccess(httpResponseBean)) {
return true;
}
return false;
}
//获取球机当前位置
public static BallheadPT getPtzStatus(String token,OnvifAuthBean requestOnvifBean){
String requestUrl = OnvifBean.getRequestUrl(requestOnvifBean);
String snap = FileUtil.fileReader(new ClassPathResource("digest/GetStatus.wsdl"));
String wsdl = String.format(snap,token);
HttpResponseBean httpResponseBean = RESTClient.getClientConnectionPool()
.postXML(requestUrl, wsdl,requestOnvifBean.getAuth());
String resultStr = httpResponseBean.getBody();
if(StringUtils.hasLength(resultStr) && HttpResponseBean.isSuccess(httpResponseBean)) {
return AnalysisXml.getStatus(resultStr);
}
return null;
}
//获取所有预置点
public static List<BallheadPT> getBallHeadPts(String profileToken,OnvifAuthBean requestOnvifBean){
String requestUrl = OnvifBean.getRequestUrl(requestOnvifBean);
String snapshotUrlWsdl = FileUtil.fileReader(new ClassPathResource("digest/GetPresets.wsdl"));
String wsdl = String.format(snapshotUrlWsdl,profileToken);
HttpResponseBean httpResponseBean = RESTClient.getClientConnectionPool()
.postXML(requestUrl, wsdl,requestOnvifBean.getAuth());
String resultStr = httpResponseBean.getBody();
if(StringUtils.hasLength(resultStr) && HttpResponseBean.isSuccess(httpResponseBean)) {
return AnalysisXml.getBallheadPTs(resultStr);
}
return null;
}
//前往指定预置点
public static boolean gotoBallHeadPts(String profileToken,OnvifAuthBean requestOnvifBean,BallheadPT ballheadPT){
String requestUrl = OnvifBean.getRequestUrl(requestOnvifBean);
String snapshotUrlWsdl = FileUtil.fileReader(new ClassPathResource("digest/GotoPreset.wsdl"));
String wsdl = String.format(snapshotUrlWsdl,profileToken,ballheadPT.getId());
HttpResponseBean httpResponseBean = RESTClient.getClientConnectionPool()
.postXML(requestUrl, wsdl,requestOnvifBean.getAuth());
String resultStr = httpResponseBean.getBody();
if(StringUtils.hasLength(resultStr) && HttpResponseBean.isSuccess(httpResponseBean)) {
return true;
}
return false;
}
}

281
device_udpclent/src/main/java/com/xr/device_udpclent/common/utils/RESTClient.java

@ -1,281 +0,0 @@
package com.xr.device_udpclent.common.utils;
import com.xr.device_udpclent.common.config.HttpResponseBean;
import org.apache.http.*;
import org.apache.http.client.HttpRequestRetryHandler;
import org.apache.http.client.config.CookieSpecs;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.protocol.HttpContext;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLHandshakeException;
import java.io.IOException;
import java.net.ConnectException;
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Http请求客户端
* @author ChenYongHeng
* @since 2019/5/27
*/
public class RESTClient {
private static Logger log = LoggerFactory.getLogger(RESTClient.class);
private volatile static RESTClient HttpClientConnectionPool;
private static final String USERAGENT = "SZ-JAVA";
private static final String CHARSET = "UTF-8";
private static final int MAX_TOTAL_CONNECTIONS = 200;
private static final int MAX_ROUTE_CONNECTIONS = 100;
/**
* 连接时间
*/
private static final int CONNECT_TIMEOUT = 5000;
/**
* 获取内容时间
*/
private static final int SOCKET_TIMEOUT = 30000;
private static PoolingHttpClientConnectionManager cm = null;
private static CloseableHttpClient HTTP_CLIENTS;
/**
* 初始化连接池
*/
static{
try {
cm = new PoolingHttpClientConnectionManager();
cm.setMaxTotal(MAX_TOTAL_CONNECTIONS);
// 默认设置为2
cm.setDefaultMaxPerRoute(MAX_ROUTE_CONNECTIONS);
// 客户端请求的默认设置
RequestConfig defaultRequestConfig = RequestConfig.custom()
.setSocketTimeout(SOCKET_TIMEOUT)
.setConnectTimeout(CONNECT_TIMEOUT)
.setConnectionRequestTimeout(CONNECT_TIMEOUT)
.setRedirectsEnabled(false)
.setCookieSpec(CookieSpecs.STANDARD_STRICT)
.build();
// 请求重试处理
HttpRequestRetryHandler httpRequestRetryHandler = new HttpRequestRetryHandler() {
@Override
public boolean retryRequest(IOException exception,
int executionCount, HttpContext context) {
// 如果超过最大重试次数,那么就不要继续了
if (executionCount >= 2) {
return false;
}
// 如果服务器丢掉了连接,那么就重试
if (exception instanceof NoHttpResponseException) {
return true;
}
// 不要重试SSL握手异常
if (exception instanceof SSLHandshakeException) {
return false;
}
HttpRequest request = (HttpRequest) context.getAttribute(HttpClientContext.HTTP_REQUEST);
boolean idempotent = !(request instanceof HttpEntityEnclosingRequest);
// 如果请求被认为是幂等的,那么就重试
if (idempotent) {
return true;
}
return false;
}
};
// https 信任所有
SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, (chain, authType) -> true).build();
HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE;
SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext, hostnameVerifier);
HTTP_CLIENTS = HttpClients.custom()
.setConnectionManager(cm)
.setDefaultRequestConfig(defaultRequestConfig)
.setRetryHandler(httpRequestRetryHandler)
//https
.setSSLSocketFactory(sslSocketFactory)
.build();
} catch (Exception e) {
e.printStackTrace();
}
}
private RESTClient(){}
/**
* 获取HttpClientConnectionPool对象这是单例方法
*
* @return
*/
public static RESTClient getClientConnectionPool() {
if (HttpClientConnectionPool == null) {
synchronized (RESTClient.class) {
if (HttpClientConnectionPool == null) {
HttpClientConnectionPool = new RESTClient();
}
}
}
return HttpClientConnectionPool;
}
/**
* 一般情况下是AuthToken使用
* @param url
* @param xmlFileName
* @return
*/
public HttpResponseBean postXML(String url, String xmlFileName){
return postXML( url, xmlFileName,"");
}
/**
* 一般情况下是DigestBean使用
* @param url
* @param xmlFileName
* @param auth
* @return
*/
public HttpResponseBean postXML(String url,String xmlFileName,String auth){
HttpPost httpPost = new HttpPost(url);
String seqNum = String.valueOf(System.currentTimeMillis());
httpPost.setHeader(HttpHeaders.CONTENT_TYPE, "application/soap+xml; charset=utf-8");
if(StringUtils.hasLength(xmlFileName))httpPost.setEntity(new StringEntity(xmlFileName, ContentType.APPLICATION_JSON));
if(StringUtils.hasLength(auth)) httpPost.setHeader("Authorization",auth);
log.info(seqNum+">>> "+httpPost.toString());
log.info(seqNum+"Body>>> " +xmlFileName);
return httpPost(httpPost,seqNum);
}
/**
* Post方法封装发送post请求获取响应内容
*/
public String fetchByPostMethod(String url, String jsonStr) {
String resultStr = null;
HttpPost httpPost = httpPostAddHeader(url, jsonStr);
String seqNum = String.valueOf(System.currentTimeMillis());
log.info(seqNum + ">>> " + httpPost.toString());
log.info(seqNum + "Body>>> " + jsonStr);
HttpResponse response;
try {
response = HTTP_CLIENTS.execute(httpPost);
HttpEntity entity = response.getEntity();
resultStr = EntityUtils.toString(entity, CHARSET);
EntityUtils.consume(entity);
} catch (IOException ce) {// 服务器请求失败
log.error(ce.getMessage());
} finally {
httpPost.abort();
}
log.info(seqNum + "<<< " + resultStr);
return resultStr;
}
/**
* 添加头部信息
* @param url
* @param jsonStr
* @return
*/
private HttpPost httpPostAddHeader(String url, String jsonStr){
HttpPost httpPost = new HttpPost(url);
httpPost.setEntity(new StringEntity(jsonStr, ContentType.APPLICATION_JSON));
httpPost.addHeader(HttpHeaders.USER_AGENT, USERAGENT);
httpPost.addHeader(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.toString());
return httpPost;
}
/**
* httppost
* @param httpPost
* @param seqNum
* @return
*/
private HttpResponseBean httpPost(HttpPost httpPost,String seqNum ) {
String resultStr = null;
HttpResponse response = null;
try{
response = HTTP_CLIENTS.execute(httpPost);
int statusCode = response.getStatusLine().getStatusCode();
if(statusCode == HttpStatus.SC_UNAUTHORIZED) {
//如果是401直接返回
return new HttpResponseBean(null, Arrays.asList(response.getAllHeaders()),response.getStatusLine().getStatusCode());
}
HttpEntity entity = response.getEntity();
resultStr = EntityUtils.toString(entity,CHARSET);
EntityUtils.consume(entity);
}catch (ConnectException ce){// 服务器请求失败
log.error("ConnectException fetchByPostMethod---->>>{}",ce.getMessage());
} catch (IOException e) {
log.error("IOException fetchByPostMethod---->>>{}",e.getMessage());
}finally {
httpPost.abort();
}
log.info(seqNum+"<<< "+resultStr);
if(response != null) return new HttpResponseBean(resultStr, Arrays.asList(response.getAllHeaders()),response.getStatusLine().getStatusCode());
return null;
}
/**
* 正则获取字符编码
* @param content_type
* @return
*/
private static String getCharSetFromContentType(String content_type){
String regex = "charset=\\s*(\\S*[^;])";
Pattern pattern = Pattern.compile(regex,Pattern.DOTALL);
Matcher matcher = pattern.matcher(content_type);
if(matcher.find()){
return matcher.group(1);
}else{
return null;
}
}
}

12
device_udpclent/src/main/resources/digest/AbsoluteMove.wsdl

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:tptz="http://www.onvif.org/ver20/ptz/wsdl" xmlns:tt="http://www.onvif.org/ver10/schema">
<s:Body>
<tptz:AbsoluteMove>
<tptz:ProfileToken>%s</tptz:ProfileToken>
<tptz:Position>
<tt:PanTilt y="%s" x="%s" space="http://www.onvif.org/ver10/tptz/PanTiltSpaces/PositionGenericSpace" />
<tt:Zoom x="%s" space="http://www.onvif.org/ver10/tptz/ZoomSpaces/PositionGenericSpace" />
</tptz:Position>
</tptz:AbsoluteMove>
</s:Body>
</s:Envelope>

6
device_udpclent/src/main/resources/digest/GetDeviceInformation.wsdl

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:tds="http://www.onvif.org/ver10/device/wsdl" xmlns:tt="http://www.onvif.org/ver10/schema">
<soap:Body>
<tds:GetOnvifInformation />
</soap:Body>
</soap:Envelope>

6
device_udpclent/src/main/resources/digest/GetPTZ.wsdl

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:tptz="http://www.onvif.org/ver20/ptz/wsdl">
<s:Body>
<tptz:GetConfigurations />
</s:Body>
</s:Envelope>

8
device_udpclent/src/main/resources/digest/GetPresets.wsdl

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:tptz="http://www.onvif.org/ver20/ptz/wsdl" xmlns:tt="http://www.onvif.org/ver10/schema">
<s:Body>
<tptz:GetPresets>
<tptz:ProfileToken>%s</tptz:ProfileToken>
</tptz:GetPresets>
</s:Body>
</s:Envelope>

6
device_udpclent/src/main/resources/digest/GetProfiles.wsdl

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:trt="http://www.onvif.org/ver10/media/wsdl" xmlns:tt="http://www.onvif.org/ver10/schema">
<soap:Body>
<trt:GetProfiles />
</soap:Body>
</soap:Envelope>

8
device_udpclent/src/main/resources/digest/GetSnapshotUrl.wsdl

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:trt="http://www.onvif.org/ver10/media/wsdl" xmlns:tt="http://www.onvif.org/ver10/schema">
<soap:Body>
<trt:GetSnapshotUri>
<trt:ProfileToken>%s</trt:ProfileToken>
</trt:GetSnapshotUri>
</soap:Body>
</soap:Envelope>

8
device_udpclent/src/main/resources/digest/GetStatus.wsdl

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:tptz="http://www.onvif.org/ver20/ptz/wsdl" xmlns:tt="http://www.onvif.org/ver10/schema">
<s:Body>
<tptz:GetStatus>
<tptz:ProfileToken>%s</tptz:ProfileToken>
</tptz:GetStatus>
</s:Body>
</s:Envelope>

25
device_udpclent/src/main/resources/digest/GetStreamUri.wsdl

@ -1,25 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:trt="http://www.onvif.org/ver10/media/wsdl" xmlns:tt="http://www.onvif.org/ver10/schema">
<s:Header xmlns:s="http://www.w3.org/2003/05/soap-envelope">
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:UsernameToken>
<wsse:Username>%s</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">%s</wsse:Password>
<wsse:Nonce>%s</wsse:Nonce>
<wsu:Created>%s</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
</s:Header>
<soap:Body>
<GetStreamUri xmlns="http://www.onvif.org/ver10/media/wsdl">
<StreamSetup>
<!-- Attribute Wild card could not be matched. Generated XML may not be valid. -->
<Stream xmlns="http://www.onvif.org/ver10/schema">RTP-Unicast</Stream>
<Transport xmlns="http://www.onvif.org/ver10/schema">
<Protocol>%s</Protocol>
</Transport>
</StreamSetup>
<ProfileToken>%s</ProfileToken>
</GetStreamUri>
</soap:Body>
</soap:Envelope>

9
device_udpclent/src/main/resources/digest/GotoPreset.wsdl

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:tptz="http://www.onvif.org/ver20/ptz/wsdl" xmlns:tt="http://www.onvif.org/ver10/schema">
<s:Body>
<tptz:GotoPreset>
<tptz:ProfileToken>%s</tptz:ProfileToken>
<tptz:PresetToken>%s</tptz:PresetToken>
</tptz:GotoPreset>
</s:Body>
</s:Envelope>
Loading…
Cancel
Save