Browse Source

华夏智信车牌摄像机兼容集成

qzy 7 months ago
parent
commit
38ce1c9656
35 changed files with 708 additions and 62 deletions
  1. 4 4
      config.xml
  2. 0 0
      log/ice_ipcsdk.log
  3. 3 0
      pom.xml
  4. 2 9
      src/main/java/com/gzlh/bus/EventThread.java
  5. 2 2
      src/main/java/com/gzlh/bus/task/CheckInitTask.java
  6. 1 1
      src/main/java/com/gzlh/bus/task/CheckState.java
  7. 44 0
      src/main/java/com/gzlh/config/cache/CarCache.java
  8. 11 0
      src/main/java/com/gzlh/config/cache/CarDTO.java
  9. 1 0
      src/main/java/com/gzlh/config/dto/ChannelSetting.java
  10. 10 1
      src/main/java/com/gzlh/config/hksdk/AlarmParseService.java
  11. 3 2
      src/main/java/com/gzlh/config/hksdk/HkUtils.java
  12. 2 1
      src/main/java/com/gzlh/device/capture/brand/CaptureBrandType.java
  13. 5 4
      src/main/java/com/gzlh/device/capture/task/HandlerCarImage.java
  14. 2 2
      src/main/java/com/gzlh/device/led/handler/impl/LedHandlerFengLiYuan.java
  15. 13 0
      src/main/java/com/gzlh/device/led/utils/CRC16.java
  16. 6 0
      src/main/java/com/gzlh/device/led/utils/FengLiYuanPackUtils.java
  17. 5 5
      src/main/java/com/gzlh/device/plc/client/PlcClientHandler.java
  18. 1 1
      src/main/java/com/gzlh/device/plc/handler/CheckUpTask.java
  19. 8 5
      src/main/java/com/gzlh/device/plc/handler/PLCHadnler.java
  20. 4 3
      src/main/java/com/gzlh/device/weighbridge/handler/impl/CommonWeighbridgeHandler.java
  21. 1 1
      src/main/java/com/gzlh/device/weighbridge/handler/impl/WeighbridgeHandlerKeLi.java
  22. 228 0
      src/main/java/com/gzlh/hx/api/IceSdk.java
  23. 23 0
      src/main/java/com/gzlh/hx/api/T_AlgoAdvParam.java
  24. 23 0
      src/main/java/com/gzlh/hx/callback/DeviceEventCallback.java
  25. 28 0
      src/main/java/com/gzlh/hx/callback/ICE_SYSTEMTIME_S.java
  26. 20 0
      src/main/java/com/gzlh/hx/callback/IDeviceEventCallback.java
  27. 39 0
      src/main/java/com/gzlh/hx/callback/IPlateCallback.java
  28. 35 0
      src/main/java/com/gzlh/hx/callback/IStillEventCallback.java
  29. 34 0
      src/main/java/com/gzlh/hx/callback/ITurnbackEventCallback.java
  30. 70 0
      src/main/java/com/gzlh/hx/callback/PlateCallback.java
  31. 33 0
      src/main/java/com/gzlh/hx/handler/InitHxSDK.java
  32. 15 0
      src/main/java/com/gzlh/hx/jepgshow/jpegShow.java
  33. 28 18
      src/main/java/com/gzlh/startup/StartupRunner.java
  34. 3 2
      src/main/java/com/gzlh/utils/FileUtils.java
  35. 1 1
      src/main/resources/application.yml

+ 4 - 4
config.xml

@@ -2,7 +2,7 @@
 
 <config>
     <managerSetting>
-        <enable>true</enable>
+        <enable>false</enable>
         <host>192.168.3.127</host>
         <beatPort>8050</beatPort>
         <serverUrl>http://127.0.0.1:9191</serverUrl>
@@ -21,12 +21,12 @@
     <!--设备相关设置-->
     <sysConfig>
         <caputreSetting>
-            <enable>false</enable>
-            <host>192.168.1.11</host>
+            <enable>true</enable>
+            <brand>6000</brand>
+            <host>192.168.55.100</host>
             <port>8000</port>
             <username>admin</username>
             <pwd>ap123456</pwd>
-            <brand>5000</brand>
         </caputreSetting>
         <serialSetting>
             <host>10.5.136.55</host>

+ 0 - 0
log/ice_ipcsdk.log


+ 3 - 0
pom.xml

@@ -59,6 +59,7 @@
             <artifactId>jna</artifactId>
             <version>3.0.9</version>
         </dependency>
+
         <!-- Redis -->
         <dependency>
             <groupId>org.springframework.boot</groupId>
@@ -148,7 +149,9 @@
                 <configuration>
                     <!--加密打包之后pom.xml会被删除,不用担心在jar包里找到此密码-->
                     <password>ABCabc123</password>
+                    <!--东岸-->
                     <code>20DFEE057FA73408A5D454AF9D5E8F0ED41D8CD98F00B204E9800998ECF8427ED41D8CD98F00B204E9800998ECF8427E</code>
+<!--                    <code>D72E7F75D4CDEEFAD7AC77891557F586D41D8CD98F00B204E9800998ECF8427ED41D8CD98F00B204E9800998ECF8427E</code>-->
                     <packages>com.gzlh</packages> <!--可以多个-->
                     <!--                    <cfgfiles>application.yml</cfgfiles>-->
                     <excludes>org.spring</excludes>

+ 2 - 9
src/main/java/com/gzlh/bus/EventThread.java

@@ -16,20 +16,13 @@ import com.gzlh.config.SystemObject;
 import com.gzlh.device.electron.factory.ElectronFactory;
 
 import com.gzlh.device.led.factory.LedFactory;
-import com.gzlh.device.led.utils.LedOptions;
-import com.gzlh.device.plc.event.PLCEvent;
 import com.gzlh.device.plc.handler.PLCHadnler;
-import com.gzlh.device.weighbridge.action.WeighbridgeCommonAction;
 import com.gzlh.device.weighbridge.factory.WeighbridgeFactory;
 import com.gzlh.device.weighbridge.handler.impl.CommonWeighbridgeHandler;
-import com.gzlh.entity.CommandBO;
-import com.gzlh.entity.ReqBO;
+
 import com.gzlh.utils.DeviceCache;
-import com.gzlh.utils.WordHandlerUtils;
 import lombok.extern.slf4j.Slf4j;
 
-import java.util.ArrayList;
-import java.util.Date;
 import java.util.List;
 
 @Slf4j
@@ -59,7 +52,7 @@ public class EventThread implements Runnable {
                     List<String> actionList = eventDTO.getActionList().getAction();
                     //依次执行动作
                     for (String action : actionList) {
-                        log.info("action :{}", action);
+                       // log.info("action :{}", action);
                         String module = StrUtil.subBefore(action, ".", true);
                         String command = StrUtil.subAfter(action, ".", true);
 //                中断事件动作

+ 2 - 2
src/main/java/com/gzlh/bus/task/CheckInitTask.java

@@ -45,7 +45,7 @@ public class CheckInitTask extends Task {
      EventBus eventBus=SpringUtil.getBean(EventBus.class);
       ReqBO reqBO= EventDataManager.getCacheData();
       if (reqBO!=null&& StrUtil.isNotEmpty(reqBO.getCarNo())){
-          if (new Date().getTime()/1000-reqBO.getGatherTime().getTime()/1000>90){
+          if (System.currentTimeMillis()/1000-reqBO.getGatherTime().getTime()/1000>90){
               log.info("----------触发初始化---------------");
               eventBus.startEvent(ModuleEnum.PLC_MODULE.getModuleEn() + "." + PLCEvent.IDLE);
               taskService.addTask(new CheckInitTask(RandomUtil.randomNumbers(16),15000,0));
@@ -55,7 +55,7 @@ public class CheckInitTask extends Task {
           return;
       }
       if (checkCount>=10){
-          log.info("----------触发初始化---------------");
+          log.info("----------触发初始化-------10--------");
           eventBus.startEvent(ModuleEnum.PLC_MODULE.getModuleEn() + "." + PLCEvent.IDLE);
           taskService.addTask(new CheckInitTask(RandomUtil.randomNumbers(16),15000,0));
           return;

+ 1 - 1
src/main/java/com/gzlh/bus/task/CheckState.java

@@ -36,7 +36,7 @@ public class CheckState {
             if (!state.equals(cacheState)) {
                 handlerChannel(state);
             }
-            log.info("enable:{}",ChannelCacheManager.stateEnable(channelCode));
+           // log.info("enable:{}",ChannelCacheManager.stateEnable(channelCode));
         } catch (Exception e) {
             log.error("resp:{}", e.getMessage());
         }

+ 44 - 0
src/main/java/com/gzlh/config/cache/CarCache.java

@@ -0,0 +1,44 @@
+package com.gzlh.config.cache;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import com.gzlh.bus.EventBus;
+import com.gzlh.bus.EventDataManager;
+import com.gzlh.config.ModuleEnum;
+import com.gzlh.device.capture.event.CaptureEvent;
+import com.gzlh.entity.ReqBO;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+public class CarCache {
+
+    private final static List<CarDTO> STANDBY_LIST = new ArrayList<>();
+
+    public static void handlerCarCache(String carNo, String httpUrl) {
+        ReqBO reqBO = EventDataManager.getCacheData();
+        if (reqBO == null || StrUtil.isEmpty(reqBO.getCarNo())) {
+            EventDataManager.cacheData("carImg", httpUrl);
+            EventDataManager.cacheData("carNo", carNo);
+            EventDataManager.cacheData("gatherTime",new Date());
+            return;
+        }
+        CarDTO carDTO = new CarDTO();
+        carDTO.setCarImg(httpUrl).setCarNo(carNo);
+        STANDBY_LIST.add(carDTO);
+    }
+
+    public static void setNextCar() {
+        if (STANDBY_LIST.size() > 0) {
+            CarDTO carDTO=  STANDBY_LIST.get(0);
+            EventDataManager.cacheData("carImg", carDTO.getCarImg());
+            EventDataManager.cacheData("carNo", carDTO.getCarNo());
+            EventDataManager.cacheData("gatherTime", new Date());
+            STANDBY_LIST.remove(0);
+            EventBus eventBus= SpringUtil.getBean(EventBus.class);
+            eventBus.startEvent(ModuleEnum.CAPTURE_MODULE.getModuleEn()+"."+ CaptureEvent.CAPTURE_ADMIN);
+        }
+
+        }
+    }

+ 11 - 0
src/main/java/com/gzlh/config/cache/CarDTO.java

@@ -0,0 +1,11 @@
+package com.gzlh.config.cache;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+@Data
+@Accessors(chain = true)
+public class CarDTO {
+    private String carImg;
+    private String carNo;
+}

+ 1 - 0
src/main/java/com/gzlh/config/dto/ChannelSetting.java

@@ -13,6 +13,7 @@ public class ChannelSetting implements Serializable {
     @JsonProperty("ip")
     private String ip;
 
+
     @JsonProperty("channelName")
     private String channelName;
 

+ 10 - 1
src/main/java/com/gzlh/config/hksdk/AlarmParseService.java

@@ -48,6 +48,7 @@ public class AlarmParseService {
     public void alarmDataHandle(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser) {
         //lCommand是传的报警类型
         String separator=File.separator;
+        log.info("command:{}",lCommand);
         if (lCommand == HCNetSDK.COMM_ITS_PLATE_RESULT) {//交通抓拍结果(新报警信息)
             if (!ChannelCacheManager.stateEnable(SysConfig.channelSetting.getChannelCode())){
                 log.error("通道已停用=======");
@@ -113,7 +114,8 @@ public class AlarmParseService {
                         fout.write(bytes);
                         fout.close();
                         String httpUrl="http://"+channelSetting.getIp()+"/"+filePath.replace("\\","/");
-                        taskService.addTask(new HandlerCarImage(RandomUtil.randomNumbers(10),100,httpUrl,sLicense));
+
+                        taskService.addTask(new HandlerCarImage(RandomUtil.randomNumbers(10),1,httpUrl,sLicense));
                     } catch (IOException e) {
                         // TODO Auto-generated catch block
                         e.printStackTrace();
@@ -121,6 +123,13 @@ public class AlarmParseService {
                 }
             }
 
+        }else  if (lCommand==HCNetSDK.COMM_ALARM_V30){
+            HCNetSDK.NET_DVR_ALARMINFO_V30 strAlarmInfoV30 = new HCNetSDK.NET_DVR_ALARMINFO_V30();
+            strAlarmInfoV30.write();
+            Pointer pInfoV30 = strAlarmInfoV30.getPointer();
+            pInfoV30.write(0, pAlarmInfo.getByteArray(0, strAlarmInfoV30.size()), 0, strAlarmInfoV30.size());
+            strAlarmInfoV30.read();
+            log.info("dwAlarmType:{}",strAlarmInfoV30.dwAlarmType);
         }
     }
 }

+ 3 - 2
src/main/java/com/gzlh/config/hksdk/HkUtils.java

@@ -55,8 +55,9 @@ public class HkUtils {
             HCNetSDK.NET_DVR_SETUPALARM_PARAM m_strAlarmInfo = new HCNetSDK.NET_DVR_SETUPALARM_PARAM();
             m_strAlarmInfo.dwSize = m_strAlarmInfo.size();
             m_strAlarmInfo.byLevel = 0;  //布防等级
-            m_strAlarmInfo.byAlarmInfoType = 1;   // 智能交通报警信息上传类型:0- 老报警信息(NET_DVR_PLATE_RESULT),1- 新报警信息(NET_ITS_PLATE_RESULT)
-            m_strAlarmInfo.byDeployType = 0;   //布防类型:0-客户端布防,1-实时布防
+            m_strAlarmInfo.byAlarmInfoType = 1;
+            // 智能交通报警信息上传类型:0- 老报警信息(NET_DVR_PLATE_RESULT),1- 新报警信息(NET_ITS_PLATE_RESULT)
+            m_strAlarmInfo.byDeployType = 1;   //布防类型:0-客户端布防,1-实时布防
             m_strAlarmInfo.write();
             int result = hCNetSDK.NET_DVR_SetupAlarmChan_V41(userId, m_strAlarmInfo);
             if (result == -1) {

+ 2 - 1
src/main/java/com/gzlh/device/capture/brand/CaptureBrandType.java

@@ -7,7 +7,8 @@ import lombok.Getter;
 @AllArgsConstructor
 public enum CaptureBrandType {
 
-    HK_BRAND(5000,"海康相机")
+    HK_BRAND(5000,"海康相机"),
+    HX_BRAND(6000,"华信相机")
     ;
 
 

+ 5 - 4
src/main/java/com/gzlh/device/capture/task/HandlerCarImage.java

@@ -6,6 +6,7 @@ import cn.hutool.extra.spring.SpringUtil;
 
 import com.gzlh.bus.SysConfig;
 import com.gzlh.config.SystemObject;
+import com.gzlh.config.cache.CarCache;
 import com.gzlh.device.capture.event.CaptureEvent;
 
 import com.gzlh.config.ModuleEnum;
@@ -53,15 +54,15 @@ public class HandlerCarImage extends Task {
             return;
         }
         CommonWeighbridgeHandler.hsCar=true;
-//      String base64=  Base64.encode(new File(filePath));
-        EventDataManager.cacheData("carImg",httpUrl);
-        EventDataManager.cacheData("carNo",carNo);
-        EventDataManager.cacheData("gatherTime",new Date());
         EventBus eventBus=SpringUtil.getBean(EventBus.class);
         //向总线发送抓拍到车牌事件
         if (SysConfig.channelSetting.getChannelType() ==0){
+            EventDataManager.cacheData("carImg",httpUrl);
+            EventDataManager.cacheData("carNo",carNo);
+            EventDataManager.cacheData("gatherTime",new Date());
             eventBus.startEvent(ModuleEnum.CAPTURE_MODULE.getModuleEn()+"."+ CaptureEvent.CAPTURE_CAR_NO);
         }else{
+            CarCache.handlerCarCache(carNo,httpUrl);
             eventBus.startEvent(ModuleEnum.CAPTURE_MODULE.getModuleEn()+"."+ CaptureEvent.CAPTURE_ADMIN);
         }
     }

+ 2 - 2
src/main/java/com/gzlh/device/led/handler/impl/LedHandlerFengLiYuan.java

@@ -30,7 +30,7 @@ public class LedHandlerFengLiYuan implements ILedHandler {
 
     @Override
     public void sendMsg(String content, LedOptions options) {
-//       log.info("丰利源发送led消息:{}", content);
+       log.info("丰利源发送led消息:{}", content);
         String msgHex = FengLiYuanPackUtils.build(content, options);
        // log.info("数据包:{}", msgHex);
         ledNettyConfig.send(msgHex);
@@ -88,7 +88,7 @@ public class LedHandlerFengLiYuan implements ILedHandler {
                 }
                 ledOptions.setColor("02").setLine("03").setShowType("0B");
                 if (StrUtil.equals("",weight)){
-                    log.info("clean weight");
+                    log.info("clean weight-----");
                 }
                 sendMsg(weight, ledOptions);
             }else if (StrUtil.contains(action, "channel")) {

+ 13 - 0
src/main/java/com/gzlh/device/led/utils/CRC16.java

@@ -1,6 +1,7 @@
 package com.gzlh.device.led.utils;
 
 import cn.hutool.core.util.HexUtil;
+import com.gzlh.utils.ModbusUtils;
 
 public class CRC16 {
     public static String crc16(int[] data, int size) {
@@ -37,7 +38,19 @@ public class CRC16 {
         return sb.toString();
     }
 
+    public static void main(String[] args) {
+        String crc="781D";
+        String packData="0106004B0002";
+        int[] a = new int[packData.length() / 2];
+        for (int i = 0; i < packData.length(); i += 2) {
+            a[i / 2] = Integer.parseInt(packData.substring(i, i + 2), 16);
+        }
+        String crc16 = CRC16.crc16(a, a.length);
+        System.out.println(crc16(a,a.length));
 
+       String str= ModbusUtils.buildRequestPacket(packData);
+        System.out.println(str);
+    }
 
 
 }

+ 6 - 0
src/main/java/com/gzlh/device/led/utils/FengLiYuanPackUtils.java

@@ -67,5 +67,11 @@ public class FengLiYuanPackUtils {
         return HEADER_HEX+sb;
     }
 
+    public static void main(String[] args) {
+        LedOptions ledOptions=new LedOptions();
+        ledOptions.setColor("05").setLine("02").setShowType("0B");
+        System.out.println(build("桂A132V1",ledOptions));
+
+    }
 
 }

+ 5 - 5
src/main/java/com/gzlh/device/plc/client/PlcClientHandler.java

@@ -28,15 +28,15 @@ public class PlcClientHandler extends SimpleChannelInboundHandler<String> {
     protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
 //        log.info("PLC 客户端收到消息:" + msg);
 //        修改设备状态信息
-        DeviceCache.changeDeviceStatus(ModuleEnum.PLC_MODULE.getModuleZh(),1);
 //        String crc = msg.substring(msg.length() - 4 );
-        if (StrUtil.isEmpty(msg)||StrUtil.length(msg)<8){
+        if (StrUtil.isEmpty(msg) || StrUtil.length(msg) < 8) {
             return;
         }
         String data = msg.substring(0, msg.length() - 4);
         String str = ModbusUtils.buildRequestPacket(data);
-        if (msg.equalsIgnoreCase(str)){
+        if (msg.equalsIgnoreCase(str)) {
             plcHadnler.handlerMsg(msg);
+            DeviceCache.changeDeviceStatus(ModuleEnum.PLC_MODULE.getModuleZh(), 1);
         }
     }
 
@@ -44,13 +44,13 @@ public class PlcClientHandler extends SimpleChannelInboundHandler<String> {
     public void channelInactive(ChannelHandlerContext ctx) throws Exception {
         log.error("PLC 客户端 连接断开,进行重连");
 //        断连设备状态设为0
-        DeviceCache.changeDeviceStatus(ModuleEnum.PLC_MODULE.getModuleZh(),0);
+        DeviceCache.changeDeviceStatus(ModuleEnum.PLC_MODULE.getModuleZh(), 0);
         ledNettyConfig.connect();
     }
 
     @Override
     public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
-        log.error("plc error:{}",cause.getMessage());
+        log.error("plc error:{}", cause.getMessage());
         //cause.printStackTrace();
         //ctx.close();
     }

+ 1 - 1
src/main/java/com/gzlh/device/plc/handler/CheckUpTask.java

@@ -53,6 +53,6 @@ public class CheckUpTask extends Task {
         plcNettyConfig.send(packData);
         tryCount = tryCount + 1;
         TaskService taskService = SpringUtil.getBean(TaskService.class);
-        taskService.addTask(new CheckUpTask(RandomUtil.randomNumbers(10), 1000, tryCount));
+        taskService.addTask(new CheckUpTask(RandomUtil.randomNumbers(10), 2000, tryCount));
     }
 }

+ 8 - 5
src/main/java/com/gzlh/device/plc/handler/PLCHadnler.java

@@ -1,5 +1,6 @@
 package com.gzlh.device.plc.handler;
 
+import cn.hutool.core.thread.ThreadUtil;
 import cn.hutool.core.util.RandomUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.extra.spring.SpringUtil;
@@ -8,6 +9,7 @@ import com.gzlh.bus.EventDataManager;
 import com.gzlh.bus.EventThread;
 import com.gzlh.bus.SysConfig;
 import com.gzlh.config.ModuleEnum;
+import com.gzlh.config.cache.CarCache;
 import com.gzlh.config.dto.SerialSetting;
 import com.gzlh.config.task.TaskService;
 import com.gzlh.device.led.client.LedNettyConfig;
@@ -44,7 +46,7 @@ public class PLCHadnler {
 
 
     public void handlerAction(String action) {
-        log.info("plc handler action:{}", action);
+       // log.info("plc handler action:{}", action);
         SerialSetting serialSetting = SysConfig.serialSetting;
         if (StrUtil.equals(action, PLCAction.RED_LIGHT_ON)) {
             //亮红灯
@@ -105,7 +107,7 @@ public class PLCHadnler {
         //  log.info("oldPlcInfo status:{}", oldPlcInfo);
 //        将plc的设备信息补到8存入缓存
         String newPlcInfo = String.format("%8s", result).replace(" ", "0");
-//         log.info("new plc status:{}", newPlcInfo);
+         log.info("plc status:{}", newPlcInfo);
         String newReverse = new StringBuffer(newPlcInfo).reverse().toString();
 //          log.info("new plc reverse status:{}", newReverse);
         if (StrUtil.isEmpty(oldPlcInfo)) {
@@ -130,7 +132,7 @@ public class PLCHadnler {
         if (StrUtil.equals(oldPlcInfo,newReverse)){
             return;
         }
-        log.info("newReverse:{}", newReverse);
+        log.info("newReverse:{},{}", newReverse,CommonWeighbridgeHandler.hsCar);
         DeviceCache.setPlcStatus(newReverse);
         SerialSetting.PlcDTO.StatusDTO status = SysConfig.serialSetting.getPlc().getStatus();
         int len = newReverse.length();
@@ -146,7 +148,7 @@ public class PLCHadnler {
             String upPointStatus=newReverse.charAt(Integer.parseInt(upPoint))+"";
             String downPoint = status.getDownPoint();//默认是1
             String downPointStatus=newReverse.charAt(Integer.parseInt(downPoint))+"";
-            if (StrUtil.equals(newPointStatus,oldPointStatus)){
+            if (!StrUtil.equals(newPointStatus,oldPointStatus)){
                 //看看哪个位变化了
                 //上到位。。。
                 if (upPoint.equals(judgePoint)) {
@@ -159,11 +161,12 @@ public class PLCHadnler {
                     //下到位触发//初始化
                     if (downPointStatus.equals("1")) {
                         eventBus.startEvent(ModuleEnum.PLC_MODULE.getModuleEn() + "." + PLCEvent.IDLE);
+                        CarCache.setNextCar();
                     }
                 }
                 if (radarPoint.equals(judgePoint)) {
                     //雷达从1--->0 初始化
-                    if (radarPointStatus.equals("0")) {
+                    if (radarPointStatus.equals("0")&&!CommonWeighbridgeHandler.hsCar) {
                         eventBus.startEvent(ModuleEnum.PLC_MODULE.getModuleEn() + "." + PLCEvent.IDLE);
                     }
                 }

+ 4 - 3
src/main/java/com/gzlh/device/weighbridge/handler/impl/CommonWeighbridgeHandler.java

@@ -13,12 +13,13 @@ import com.gzlh.config.dto.SerialSetting;
 import com.gzlh.device.led.utils.LedOptions;
 import com.gzlh.device.weighbridge.event.WeighbridgeEvent;
 import com.gzlh.utils.DeviceCache;
+import lombok.extern.slf4j.Slf4j;
 
 import java.util.*;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
-
+@Slf4j
 public class CommonWeighbridgeHandler {
 
 
@@ -79,7 +80,7 @@ public class CommonWeighbridgeHandler {
             }
             isStart = false;
             averaWeight = handlerWeight();
-            StaticLog.info("----------weight---------:{}", averaWeight);
+            log.info("----------weight---------:{}", averaWeight);
             if (averaWeight == 0 || serialSetting.getWeighbridge().getMinKg() > averaWeight) {
                 //todo read timeout
                 //读取超时
@@ -97,7 +98,7 @@ public class CommonWeighbridgeHandler {
 
         private int handlerWeight() {
             List<Integer>list=WEIGHT_CACHE;
-            StaticLog.info("w:{}", JSONUtil.toJsonStr(list));
+            log.info("w:{}", JSONUtil.toJsonStr(list));
             if (list.isEmpty()){
                 return 0;
             }

+ 1 - 1
src/main/java/com/gzlh/device/weighbridge/handler/impl/WeighbridgeHandlerKeLi.java

@@ -52,7 +52,7 @@ public class WeighbridgeHandlerKeLi implements IWeighbridgeHandler {
             CommonWeighbridgeHandler.hsCar=false;
             return;
         }
-       // log.info(WeighbridgeBrandType.NINGBO_KELI.getBrand() + "地磅:{}", weight);
+//        log.info(WeighbridgeBrandType.NINGBO_KELI.getBrand() + "地磅:{}", weight);
         // 将字符串转换成字节数组类型
         // int weight = Integer.parseInt(new String(validData)) / 10;
         CommonWeighbridgeHandler.cacheWeight(weight);

+ 228 - 0
src/main/java/com/gzlh/hx/api/IceSdk.java

@@ -0,0 +1,228 @@
+package com.gzlh.hx.api;
+
+
+import com.gzlh.hx.api.T_AlgoAdvParam;
+
+import com.gzlh.hx.callback.IDeviceEventCallback;
+import com.gzlh.hx.callback.IPlateCallback;
+import com.gzlh.hx.callback.IStillEventCallback;
+import com.gzlh.hx.callback.ITurnbackEventCallback;
+import com.sun.jna.Library;
+import com.sun.jna.Native;
+import com.sun.jna.Pointer;
+import com.sun.jna.ptr.IntByReference;
+
+public interface IceSdk extends Library {
+	String strdir = "E:\\libs\\ice_ipcsdk\\bin\\ice_ipcsdk.dll";
+	IceSdk jnaLib = (IceSdk) Native.loadLibrary(strdir, IceSdk.class);
+	
+	/**
+	 *  @brief  全局初始化
+	 *  @return void
+	*/
+	public void ICE_IPCSDK_Init();
+	
+	/**
+	 *  @brief  全局释放
+	 *  @return void
+	*/
+	public int ICE_IPCSDK_Fini();
+
+	/**
+     *  @brief  连接相机,不带视频流
+     *  @param  [IN] pcIP   相机ip
+     *  @return sdk句柄(连接不成功时,返回值为null)
+     */
+	public Pointer ICE_IPCSDK_OpenDevice(String ip);
+	
+	/**
+     *  @brief  断开连接
+     *  @param  [IN] hSDK   连接相机时返回的句柄值
+     *  @return void
+     */
+    public void ICE_IPCSDK_Close(Pointer hSDK);
+    
+
+  
+    /**
+     *  @brief  断开视频
+     *  @param  [IN] hSDK   连接相机时返回的句柄值
+     *  @return void
+     */  
+    public void ICE_IPCSDK_StopStream(Pointer hSDK);
+    
+    /**
+     *  @brief  软触发扩展接口
+     *  @param  [IN]  hSDK          由连接相机接口获得的句柄
+     *  @return 1表示成功,0表示失败
+     */
+	public int ICE_IPCSDK_TriggerExt(Pointer hSDK);
+     
+	/**
+     *  @brief  打开道闸
+     *  @param  [IN] hSDK  SDK句柄
+     *  @return 1 成功 0 失败
+     */
+	public int ICE_IPCSDK_OpenGate(Pointer hSDK);
+ 	
+	/**
+     *  @brief  设置获得实时识别数据的相关回调函数
+     *  @param  [IN] hSDK       连接相机时返回的sdk句柄
+     *  @param  [IN] pfOnPlate  实时识别数据,通过该回调获得
+     *  @param  [IN] pvParam    回调函数中的参数,能区分开不同的使用者即可
+     *  @return void
+     */
+ 	public void ICE_IPCSDK_SetPlateCallback(Pointer hSDK, IPlateCallback callback, int param);
+ 	
+ 	/**
+     *  @brief  设置相机事件回调
+     *  @param  [IN] reserve    	预留参数
+     *  @param  [IN] callback		相机事件回调
+     *  @param  [IN] param			回调上下文
+     *  return  void
+     */
+ 	public void ICE_IPCSDK_SetDeviceEventCallBack(Pointer reserve, IDeviceEventCallback callback, Pointer param);
+ 	
+ 	/**
+     *  @brief  车牌识别回调信息输出编码配置
+     *  @param  [IN] hSDK       连接相机时返回的sdk句柄
+     *  @param  [IN] enable		是否以UTF-8编码输出抓拍信息(1:UTF8格式输出车牌号,0:GB2312格式输出车牌号)
+     *  return  void
+     */
+ 	public void ICE_IPCSDK_EnableUTF8(Pointer hSDK, int enable);
+ 	
+ 	/**
+ 	*  @brief  添加黑白名单项(以车牌号为索引)
+ 	*  @param  [IN] hSDK              连接相机时返回的sdk句柄
+ 	*  @param  [IN] pcNumber          黑白名单项中的车牌号
+ 	*  @param  [IN] pcDateBegin       黑白名单项中的开始日期(格式为yyyy/MM/dd)
+ 	*  @param  [IN] pcDateEnd         黑白名单项中的结束日期(格式为yyyy/MM/dd)
+ 	*  @param  [IN] pcTimeBegin       黑白名单项中的开始时间(格式为HH:mm:ss)
+ 	*  @param  [IN] pcTimeEnd         黑白名单项中的结束时间(格式为HH:mm:ss)
+ 	*  @param  [IN] pcType            名单类型(白名单"W"/黑名单"B")
+ 	*  @param  [IN] pcRemark          备注
+ 	*  @param  [IN] pcRsrv2           预留字段2
+ 	*  @param  [IN] pcRsrv3           预留字段3
+ 	*  @param  [IN] pcRsrv4           预留字段4
+ 	*  @return 1 添加成功 0 添加失败
+ 	*/
+ 	public int ICE_IPCSDK_WhiteListInsertItem_ByNumber(Pointer hSDK, String pcNumber, String pcDateBegin, String pcDateEnd, String pcTimeBegin, String pcTimeEnd, String pcType, String pcRemark, String pcRsrv2, String pcRsrv3, String pcRsrv4);
+ 	
+ 	
+ 	/**
+ 	*  @brief  删除黑白名单项(以车牌号为索引)
+ 	*  @param  [IN] hSDK              连接相机时返回的sdk句柄
+ 	*  @param  [IN] pcNumber          要删除的车牌号
+ 	*  @return 1 删除成功 0 删除失败
+ 	*/
+ 	public int  ICE_IPCSDK_WhiteListDeleteItem_ByNumber(Pointer hSDK, String pcNumber);
+
+ 	
+ 	/**
+ 	*  @brief  获取白名单项总数(包括黑白名单)
+ 	*          注意事项: 在使用任何白名单操作前,都需调用此接口,用于分配内存
+ 	*  @param  [IN]  hSDK         连接相机时返回的sdk句柄
+ 	*  @param  [OUT] pu32Count    白名单项总数
+ 	*  @return 1 成功 0 失败
+ 	*/
+ 	public int ICE_IPCSDK_WhiteListGetCount(Pointer hSDK, IntByReference  pu32Count);
+ 	public int ICE_IPCSDK_GetWhiteCount(Pointer hSDK, IntByReference  pu32Count);
+ 	
+	public int ICE_IPCSDK_ConnectNormalSdk(Pointer hSDK);
+ 	public int ICE_IPCSDK_SetWBListMode(Pointer hSDK, int mode);
+	public int ICE_IPCSDK_InsertWhiteItem(Pointer hSDK, byte[] pcNumber, String pcDateBegin, String pcDateEnd, String pcTimeBegin, String pcTimeEnd, String pcRemark, String pcRsrv2, String pcRsrv3, String pcRsrv4);
+ 	public int ICE_IPCSDK_DeleteWhiteItem(Pointer hSDK, byte[] pcNumber);
+ 	
+ 	public int  ICE_IPCSDK_GetWhiteItem(Pointer hSDK, int index,byte[] carNo, byte[] pcDateBegin, byte[] pcDateEnd, byte[] pcTimeBegin, byte[] pcTimeEnd, byte[] pcRemark, byte[] pcRsrv2, byte[] pcRsrv3, byte[] pcRsrv4);
+ 	
+ 	/**
+ 	*  @brief  获得相机mac地址
+ 	*  @param  [IN] hSDK                  连接相机时返回的sdk句柄
+ 	*  @param  [OUT] szDevID              相机mac地址
+ 	*  @return 0 失败 1 成功
+ 	*/
+ 	public int  ICE_IPCSDK_GetDevID(Pointer hSDK, byte [] szDevID);
+
+ 	/**
+ 	*  @brief  开始录像
+ 	*  @param  [IN] hSDK                 连接相机时返回的sdk句柄
+ 	*  @param  [IN] pcFileName           录像文件名
+ 	*  @return 0 失败 1 成功
+ 	*/
+ 	public int  ICE_IPCSDK_StartRecord(Pointer hSDK, String pcFileName);
+
+ 	/**
+ 	*  @brief  结束录像
+ 	*  @param  [IN] hSDK                 连接相机时返回的sdk句柄
+ 	*  @return void
+ 	*/
+ 	public void  ICE_IPCSDK_StopRecord(Pointer hSDK);
+ 	
+ 	/**
+ 	*  @brief  日志配置
+ 	*  @param  [IN] openLog     是否开启日志
+ 	*  @param  [IN] logPath     日志路径,默认为D:\
+ 	*  @return void
+ 	*/
+ 	public void  ICE_IPCSDK_LogConfig(int openLog, String logPath);
+ 	
+ 	/**
+ 	*  @brief  开启是否加密
+ 	*  @param  [IN] hSDK        连接相机时返回的sdk句柄
+ 	*  @param  [IN] ucEncId     如果为0则为不加密,如果为其它的则为加密
+ 	*  @param  [IN] szPwd       相机密码
+ 	*  @return 0 失败 1 成功
+ 	*/
+ 	public int  ICE_IPCSDK_EnableEnc(Pointer hSDK, int u32EncId, byte [] szPwd);
+
+ 	/**
+ 	*  @brief  修改车牌解密密码
+ 	*  @param  [IN] hSDK        连接相机时返回的sdk句柄
+ 	*  @param  [IN] szOldPwd    车牌解密旧密码
+ 	*  @param  [IN] szNewPwd    车牌解密新密码
+ 	*  @return 0 失败 1 成功
+ 	*/
+ 	public int  ICE_IPCSDK_ModifyEncPwd(Pointer hSDK, byte [] szOldPwd,  byte [] szNewPwd);
+
+ 	/**
+ 	*  @brief  设置车牌解密密码
+ 	*  @param  [IN] hSDK        连接相机时返回的sdk句柄
+ 	*  @param  [IN] szPwd       车牌解密密码
+ 	*  @return 0 失败 1 成功
+ 	*/
+ 	public int  ICE_IPCSDK_SetDecPwd(Pointer hSDK, byte [] szPwd);
+ 	
+ 	/**
+ 	 *  @brief  设置滞留报警事件的相关回调函数
+ 	 *  @param  [IN] hSDK               连接相机时返回的sdk句柄
+ 	 *  @param  [IN] pfStillEvent		滞留报警事件
+ 	 *  @param  [IN] pvStillEventParam  回调上下文
+ 	 *  @return 0 失败,1成功
+ 	 */
+ 	public int ICE_IPCSDK_SetStillEventCallback(Pointer hSDK, IStillEventCallback callback, int param);
+ 	
+ 	/**
+ 	 *  @brief  设置折返报警事件的相关回调函数
+ 	 *  @param  [IN] hSDK					连接相机时返回的sdk句柄
+ 	 *  @param  [IN] pfTurnbackEvent		折返报警事件
+ 	 *  @param  [IN] pvTurnbackEventParam	回调上下文
+ 	 *  @return 0 失败,1成功
+ 	 */
+ 	public int ICE_IPCSDK_SetTurnbackEventCallback(Pointer hSDK, ITurnbackEventCallback callback, int param);
+ 	
+ 	/**
+ 	*  @brief  设置算法高级参数
+ 	*  @param  [IN] hSDK							连接相机时返回的sdk句柄
+ 	*  @param  [IN] ptAlgoAdvParam					算法高级参数结构体
+ 	*  @return  获取状态 1 成功 0 失败
+ 	*/
+ 	public int ICE_IPCSDK_SetAlgoAdvParam(Pointer hSDK, T_AlgoAdvParam.ByReference ptAlgoAdvParam);
+ 	
+ 	/**
+ 	*  @brief  设置算法高级参数
+ 	*  @param  [IN] hSDK							连接相机时返回的sdk句柄
+ 	*  @param  [OUT] ptAlgoAdvParam					算法高级参数结构体
+ 	*  @return  获取状态 1 成功 0 失败
+ 	*/
+ 	public int ICE_IPCSDK_GetAlgoAdvParam(Pointer hSDK, T_AlgoAdvParam.ByReference ptAlgoAdvParam);
+}

+ 23 - 0
src/main/java/com/gzlh/hx/api/T_AlgoAdvParam.java

@@ -0,0 +1,23 @@
+package com.gzlh.hx.api;
+
+import java.util.Arrays;
+import java.util.List;
+import com.sun.jna.Structure;
+
+public class T_AlgoAdvParam extends Structure{
+	public int s32EnableStillObj = 0;               //停滞目标检测开关 0:关闭,1:开启
+	public int s32StillObjOutputTime = 0;           //停滞目标输出间隔(范围:30-600 单位:秒)   
+	public int s32EnableTurnback = 0;				 //折返目标检测开关 0:关闭,1:开启
+	public byte[]  acReserved = new byte[512];				 //预留
+	@Override
+	protected List getFieldOrder() {
+		// TODO Auto-generated method stub
+		return Arrays.asList(new String[] {"s32EnableStillObj", "s32StillObjOutputTime", "s32EnableTurnback", "acReserved"});
+	}
+
+	public static class ByReference extends T_AlgoAdvParam implements Structure.ByReference {
+    }
+
+    public static class ByValue extends T_AlgoAdvParam implements Structure.ByValue {
+    }
+}

+ 23 - 0
src/main/java/com/gzlh/hx/callback/DeviceEventCallback.java

@@ -0,0 +1,23 @@
+package com.gzlh.hx.callback;
+
+import com.gzlh.config.ModuleEnum;
+import com.gzlh.hx.api.IceSdk;
+import com.gzlh.utils.DeviceCache;
+import com.sun.jna.Pointer;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class DeviceEventCallback implements IDeviceEventCallback{
+    @Override
+    public void ICE_IPCSDK_OnDeviceEvent(Pointer param, String strIP, int nEventType, int nReserve1, int nReserve2, int nReserve3, int nReserve4) {
+        log.info("DeviceEventCallback.ICE_IPCSDK_OnDeviceEvent:{}:{}:{}:{}", strIP,nEventType,nReserve1,nReserve2);
+        if (nEventType==0){
+            log.error("IP:{} 离线",strIP);
+            DeviceCache.changeDeviceStatus(ModuleEnum.CAPTURE_MODULE.getModuleZh(), 0);
+        }else if (nEventType==1){
+            log.info("IP:{} 在线",strIP);
+            DeviceCache.changeDeviceStatus(ModuleEnum.CAPTURE_MODULE.getModuleZh(), 1);
+        }
+
+    }
+}

+ 28 - 0
src/main/java/com/gzlh/hx/callback/ICE_SYSTEMTIME_S.java

@@ -0,0 +1,28 @@
+package com.gzlh.hx.callback;
+
+import java.util.List;
+
+import com.sun.jna.Structure;
+import java.util.Arrays;
+
+public class ICE_SYSTEMTIME_S extends Structure{
+	public short u16Year = 0;								//!< year
+	public short u16Month = 0;								//!< month
+	public short u16DayOfWeek = 0;							//!< week
+	public short u16Day = 0;								//!< day
+	public short u16Hour = 0;								//!< hour
+	public short u16Minute = 0;							//!< minute
+	public short u16Second = 0;							//!< second
+	public short u16Milliseconds = 0;						//!< milliseconds
+	@Override
+	protected List getFieldOrder() {
+		// TODO Auto-generated method stub
+		return Arrays.asList(new String[]{"u16Year", "u16Month", "u16DayOfWeek", "u16Day", "u16Hour", "u16Minute", "u16Second", "u16Milliseconds"});
+	}
+	
+	public static class ByReference extends ICE_SYSTEMTIME_S implements Structure.ByReference {
+    }
+
+    public static class ByValue extends ICE_SYSTEMTIME_S implements Structure.ByValue {
+    }
+}

+ 20 - 0
src/main/java/com/gzlh/hx/callback/IDeviceEventCallback.java

@@ -0,0 +1,20 @@
+package com.gzlh.hx.callback;
+
+import com.sun.jna.Pointer;
+import com.sun.jna.win32.StdCallLibrary.StdCallCallback;
+
+/**
+ *  @brief  相机事件回调
+ *  @param  [OUT] param    		回调上下文
+ *  @param  [OUT] strIP			相机ip
+ *  @param  [OUT] nEventType	事件类型 0: 离线 1: 在线
+ *  @param  [OUT] nReserve1		预留参数
+ *  @param  [OUT] nReserve2		预留参数
+ *  @param  [OUT] nReserve3		预留参数
+ *  @param  [OUT] nReserve4		预留参数
+ *  return  void
+ */
+	public interface IDeviceEventCallback extends StdCallCallback{
+	public void ICE_IPCSDK_OnDeviceEvent(Pointer param, String strIP, int nEventType, 
+			int nReserve1, int nReserve2, int nReserve3, int nReserve4);
+}

+ 39 - 0
src/main/java/com/gzlh/hx/callback/IPlateCallback.java

@@ -0,0 +1,39 @@
+package com.gzlh.hx.callback;
+
+import com.sun.jna.Pointer;
+import com.sun.jna.win32.StdCallLibrary.StdCallCallback;
+
+/**
+ *  @brief  通过该回调函数获得实时识别数据
+ *  @param  [OUT] pvParam	         用户自定义参数,用来区分不同的sdk使用者,类似于线程入口函数的参数(与设置此回调接口的最后一个参数相同)
+ *  @param  [OUT] pcIP	             相机ip
+ *  @param  [OUT] pcNumber           车牌号	
+ *  @param  [OUT] pcColor            车牌颜色("蓝色","黄色","白色","黑色",“绿色”)
+ *  @param  [OUT] pcPicData          全景数据
+ *  @param  [OUT] u32PicLen          全景数据长度
+ *  @param  [OUT] pcCloseUpPicData   车牌数据
+ *  @param  [OUT] u32CloseUpPicLen   车牌数据长度
+ *  @param  [OUT] nSpeed             车辆速度
+ *  @param  [OUT] nVehicleType       车辆类型(0:未知,1轿车,2面包车,3大型客车,4中型客车,5皮卡,6非机动车,7SUV,8MPV,9微型货车,10轻型货车,11中型货车,12重型货车)
+ *  @param  [OUT] s16FalsePlate      虚假车牌(0:否,1是)
+ *  @param  [OUT] nReserved2         预留参数2
+ *  @param  [OUT] fPlateConfidence   车牌打分值(SDK输出的范围大于IE界面设置的车牌阈值,上限是28,例如:IE设置的是10,范围:10-28)
+ *  @param  [OUT] u32VehicleColor    车身颜色(车辆特征码相机版本:(-1:未知,0:黑色,1:蓝色,2:灰色,3:棕色,4:绿色,5:夜间深色,6:紫色,7:红色,8:白色,9:黄色)
+ *                                           其它相机版本:(0:未知,1:红色,2:绿色,3:蓝色,4:黄色,5:白色,6:灰色,7:黑色,8:紫色,9:棕色,10:粉色))
+ *  @param  [OUT] u32PlateType       车牌类型,详见车牌类型ICE_PLATETYPE_E枚举值
+ *  @param  [OUT] u32VehicleDir      车辆方向(0:车头方向,1:车尾方向,2:车头和车尾方向)
+ *  @param  [OUT] u32AlarmType       报警输出,详见报警输出ICE_VDC_ALARM_TYPE枚举值
+ *  @param  [OUT] u32SerialNum       抓拍的序号(从相机第一次抓拍开始计数,相机重启后才清零)
+ *  @param  [OUT] uCapTime           实时抓拍时间,从1970年1月1日零点开始的秒数
+ *  @param  [OUT] nReserved3		 预留参数
+ *  @param  [OUT] nReserved4		 预留参数
+ *  return  void
+ */
+public interface IPlateCallback extends StdCallCallback {
+	 void ICE_IPCSDK_Plate(int param,
+		String strIP, String strNumber, String strColor, 
+		Pointer pPicData, int nLen, Pointer pCloseupData, int nCloseupLen, 
+		int nReserved1, int nVehicleType, int nFalsePlate, int nReserved2, 
+		float fPlateConfidence, int nVehicleColor, int nPlateType, int nVehicleDir, 
+		int nAlarmType, int nSerialNum, int nCapTime, int nReserved3, int nReserved4);
+}

+ 35 - 0
src/main/java/com/gzlh/hx/callback/IStillEventCallback.java

@@ -0,0 +1,35 @@
+package com.gzlh.hx.callback;
+import java.util.List;
+
+import com.sun.jna.Structure;
+import com.sun.jna.win32.StdCallLibrary.StdCallCallback;
+import java.util.Arrays;
+import com.sun.jna.Pointer;
+
+public interface IStillEventCallback extends StdCallCallback{
+	
+	public static class T_StillResult extends Structure{
+		public int u32EncodeType = 0;
+		public byte[] plateNum = new byte[128];
+		public int u32CarId = 0;
+		public ICE_SYSTEMTIME_S.ByValue tAlarmTime;
+		public byte[] resv = new byte[2048];
+		@Override
+		protected List getFieldOrder() {
+			// TODO Auto-generated method stub
+			return Arrays.asList(new String[]{"u32EncodeType", "plateNum", "u32CarId", "tAlarmTime", "resv"});
+		}
+		
+		public static class ByReference extends T_StillResult implements Structure.ByReference {
+        }
+
+        public static class ByValue extends T_StillResult implements Structure.ByValue {
+        }
+	}
+	
+	public void ICE_IPCSDK_OnStillEvent(int pvParam, String pcIP, 
+			   int u32EventType, T_StillResult.ByReference ptStillResult, 
+			   Pointer pPicData, int u32PicLen,
+			   Pointer pReserved1, int u32Reserved1, 
+			   Pointer pReserved2, int u32Reserved2);
+}

+ 34 - 0
src/main/java/com/gzlh/hx/callback/ITurnbackEventCallback.java

@@ -0,0 +1,34 @@
+package com.gzlh.hx.callback;
+
+import java.util.Arrays;
+import java.util.List;
+import com.sun.jna.Pointer;
+import com.sun.jna.Structure;
+import com.sun.jna.win32.StdCallLibrary.StdCallCallback;
+
+public interface ITurnbackEventCallback  extends StdCallCallback {
+	public static class T_TurnbackResult extends Structure{
+		public int u32EncodeType = 0;
+		public byte[] plateNum = new byte[128];
+		public int u32CarId = 0;
+		public ICE_SYSTEMTIME_S.ByValue tAlarmTime;
+		public byte[] resv = new byte[2048];
+		@Override
+		protected List getFieldOrder() {
+			// TODO Auto-generated method stub
+			return Arrays.asList(new String[]{"u32EncodeType", "plateNum", "u32CarId", "tAlarmTime", "resv"});
+		}
+		
+		public static class ByReference extends T_TurnbackResult implements Structure.ByReference {
+        }
+
+        public static class ByValue extends T_TurnbackResult implements Structure.ByValue {
+        }
+	}
+	
+	public void ICE_IPCSDK_OnTurnbackEvent(int pvParam, String pcIP, 
+			   int u32EventType, T_TurnbackResult.ByReference ptTurnbackResult, 
+			   Pointer pPicData, int u32PicLen,
+			   Pointer pReserved1, int u32Reserved1, 
+			   Pointer pReserved2, int u32Reserved2);
+}

+ 70 - 0
src/main/java/com/gzlh/hx/callback/PlateCallback.java

@@ -0,0 +1,70 @@
+package com.gzlh.hx.callback;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.RandomUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import com.gzlh.bus.SysConfig;
+import com.gzlh.config.dto.ChannelSetting;
+import com.gzlh.config.task.TaskService;
+import com.gzlh.device.capture.task.HandlerCarImage;
+import com.gzlh.hx.jepgshow.jpegShow;
+import com.sun.jna.Pointer;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.util.Date;
+
+@Slf4j
+public class PlateCallback implements IPlateCallback {
+    @Override
+    public void ICE_IPCSDK_Plate(int param, String strIP, String strNumber, String strColor,
+                                 Pointer pPicData, int nLen, Pointer pCloseupData, int nCloseupLen, int nReserved1,
+                                 int nVehicleType, int nFalsePlate, int nReserved2, float fPlateConfidence,
+                                 int nVehicleColor, int nPlateType, int nVehicleDir, int nAlarmType,
+                                 int nSerialNum, int nCapTime, int nReserved3, int nReserved4) {
+        log.info("ICE_IPCSDK_Plate:{}:{}:{},{}", param, strIP, strColor, strNumber);
+
+        if (nLen > 0) {
+            byte[] dst = new byte[nLen];
+            pPicData.read(0, dst, 0, nLen);
+            savePic(strIP, strNumber, dst, 0, 0);
+        }
+    }
+
+    public static void savePic(String strIP, String strNumber, byte[] data, int type, long lTime) {
+
+        Date nowTime = null;
+        if (lTime == 0)
+            nowTime = new Date();
+        else
+            nowTime = new Date(lTime);
+        String separator=File.separator;
+        String newName = DateUtil.format(nowTime, "yyMMddHHmm");
+        String fileName = strNumber + "-" + newName + ".jpg";
+        LocalDate now=LocalDate.now();
+        ChannelSetting channelSetting= SysConfig.channelSetting;
+        String fileFolder=channelSetting.getChannelCode()+separator+now.getYear()+separator+now.getMonthValue()+separator+now.getDayOfMonth();
+        FileUtil.mkdir(channelSetting.getFileRootPath()+separator+fileFolder);
+        String filePath=fileFolder +separator+ fileName;
+        String savedFilePath=channelSetting.getFileRootPath()+separator+filePath;
+        try {
+            DataOutputStream out = new DataOutputStream(Files.newOutputStream(Paths.get(savedFilePath)));
+            TaskService taskService = SpringUtil.getBean(TaskService.class);
+            String httpUrl = "http://" + channelSetting.getIp() + "/" + filePath.replace("\\", "/");
+            taskService.addTask(new HandlerCarImage(RandomUtil.randomNumbers(10), 1, httpUrl, strNumber));
+            out.write(data);
+            out.close();
+        } catch (IOException e1) {
+            // TODO Auto-generated catch block
+            e1.printStackTrace();
+        }
+    }
+}

+ 33 - 0
src/main/java/com/gzlh/hx/handler/InitHxSDK.java

@@ -0,0 +1,33 @@
+package com.gzlh.hx.handler;
+
+import cn.hutool.core.util.StrUtil;
+import com.gzlh.bus.SysConfig;
+import com.gzlh.config.dto.CaputreSetting;
+import com.gzlh.hx.api.IceSdk;
+import com.gzlh.hx.callback.DeviceEventCallback;
+import com.gzlh.hx.callback.PlateCallback;
+import com.sun.jna.Pointer;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class InitHxSDK implements Runnable {
+
+
+    @Override
+    public void run() {
+        CaputreSetting caputreSetting = SysConfig.caputreSetting;
+        String ip = caputreSetting.getHost();
+        IceSdk.jnaLib.ICE_IPCSDK_Init();
+        PlateCallback plateCallback = new PlateCallback();
+        Pointer pointer = IceSdk.jnaLib.ICE_IPCSDK_OpenDevice(caputreSetting.getHost());
+        if (pointer==null){
+            log.error("connect 华夏智信相机异常:{}",ip);
+            return;
+        }
+        IceSdk.jnaLib.ICE_IPCSDK_EnableUTF8(pointer,1);
+        int param = Integer.parseInt(StrUtil.subAfter(ip, ".", true));
+        IceSdk.jnaLib.ICE_IPCSDK_SetPlateCallback(pointer, plateCallback, param);
+        IceSdk.jnaLib.ICE_IPCSDK_SetDeviceEventCallBack(pointer, new DeviceEventCallback(), pointer);
+
+    }
+}

+ 15 - 0
src/main/java/com/gzlh/hx/jepgshow/jpegShow.java

@@ -0,0 +1,15 @@
+package com.gzlh.hx.jepgshow;
+
+import com.sun.jna.Library;
+import com.sun.jna.Native;
+import com.sun.jna.Pointer;
+
+public interface jpegShow extends Library{
+	String strdir = System.getProperty("user.dir") + "\\jpegShow.dll";
+	jpegShow jnaLib = (jpegShow) Native.loadLibrary(strdir, jpegShow.class);
+	
+	public Pointer jpegShow_Init();
+	
+
+	public void jpegShow_Release(Pointer handle);
+}

+ 28 - 18
src/main/java/com/gzlh/startup/StartupRunner.java

@@ -15,12 +15,18 @@ import com.gzlh.config.hksdk.HCNetSDK;
 import com.gzlh.config.hksdk.HkUtils;
 import com.gzlh.config.hksdk.bo.HKCacheManager;
 import com.gzlh.config.task.TaskService;
+import com.gzlh.device.capture.brand.CaptureBrandType;
 import com.gzlh.device.electron.client.ElectronNettyConfig;
 import com.gzlh.device.led.client.LedNettyConfig;
 import com.gzlh.device.plc.client.PlcNettyConfig;
 import com.gzlh.device.plc.event.PLCEvent;
 import com.gzlh.device.plc.job.SearchJob;
 import com.gzlh.device.weighbridge.client.WeighbridgeNettyConfig;
+
+import com.gzlh.hx.api.IceSdk;
+import com.gzlh.hx.callback.PlateCallback;
+import com.gzlh.hx.handler.InitHxSDK;
+import com.sun.jna.Pointer;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.boot.CommandLineRunner;
 import org.springframework.stereotype.Component;
@@ -44,7 +50,6 @@ public class StartupRunner implements CommandLineRunner {
     private TaskService taskService;
 
 
-
     @Resource
     private BackgroundClientNetty backgroundClientNetty;
 
@@ -52,40 +57,45 @@ public class StartupRunner implements CommandLineRunner {
     private HkUtils hkUtils;
     @Resource
     private HCNetSDK hcNetSDK;
+
     @Override
     public void run(String... args) throws Exception {
-        SerialSetting serialSetting= SysConfig.serialSetting;
+
+        SerialSetting serialSetting = SysConfig.serialSetting;
         if (serialSetting.getWeighbridge().getEnable()) {
             ThreadUtil.execute(() -> weighbridgeNettyConfig.connect());
         }
         if (serialSetting.getLed().getEnable()) {
             ThreadUtil.execute(() -> ledNettyConfig.connect());
         }
-        if (serialSetting.getPlc().getEnable()){
+        if (serialSetting.getPlc().getEnable()) {
             ThreadUtil.execute(() -> plcNettyConfig.connect());
             ThreadUtil.execute(new SearchJob());
         }
-        if (serialSetting.getElectron().getEnable()){
+        if (serialSetting.getElectron().getEnable()) {
             ThreadUtil.execute(() -> electronNettyConfig.connect());
         }
         if (SysConfig.managerSetting.isEnable()) {
             ThreadUtil.execute(() -> backgroundClientNetty.connect());
         }
-        CaputreSetting caputreSetting=SysConfig.caputreSetting;
-        if (caputreSetting.isEnable()){
-            short port= (short) caputreSetting.getPort();
-            String ip=caputreSetting.getHost();
-            int userId = hkUtils.Login_V40(ip, port, caputreSetting.getUsername(), caputreSetting.getPwd(), hcNetSDK);
-            if (userId!=-1){
-                log.info("登录海康抓拍设备:{},{}",ip,userId);
-                hkUtils.SetAlarm(hcNetSDK,userId);
-                HKCacheManager.add(ModuleEnum.CAPTURE_MODULE,userId);
-            }else {
-                log.info("登录海康抓拍设备失败:{},{}",hcNetSDK.NET_DVR_GetLastError(),userId);
+        CaputreSetting caputreSetting = SysConfig.caputreSetting;
+        if (caputreSetting.isEnable()) {
+            if (caputreSetting.getBrand() == CaptureBrandType.HK_BRAND.getCode()) {
+                short port = (short) caputreSetting.getPort();
+                String ip = caputreSetting.getHost();
+                int userId = hkUtils.Login_V40(ip, port, caputreSetting.getUsername(), caputreSetting.getPwd(), hcNetSDK);
+                if (userId != -1) {
+                    log.info("登录海康抓拍设备:{},{}", ip, userId);
+                    hkUtils.SetAlarm(hcNetSDK, userId);
+                    HKCacheManager.add(ModuleEnum.CAPTURE_MODULE, userId);
+                } else {
+                    log.info("登录海康抓拍设备失败:{},{}", hcNetSDK.NET_DVR_GetLastError(), userId);
+                }
+                taskService.addTask(new CheckInitTask(RandomUtil.randomNumbers(16), 10000, 0));
+
+            } else if (caputreSetting.getBrand() == CaptureBrandType.HX_BRAND.getCode()) {
+                ThreadUtil.execute(new InitHxSDK());
             }
-          //  EventBus eventBus = SpringUtil.getBean(EventBus.class);
-           // eventBus.startEvent(ModuleEnum.PLC_MODULE.getModuleEn() + "." + PLCEvent.IDLE);
-            taskService.addTask(new CheckInitTask(RandomUtil.randomNumbers(16),10000,0));
         }
     }
 

+ 3 - 2
src/main/java/com/gzlh/utils/FileUtils.java

@@ -1,9 +1,7 @@
 package com.gzlh.utils;
 
-import org.springframework.beans.factory.annotation.Value;
 
 import java.io.*;
-import java.net.InetAddress;
 import java.net.URL;
 import java.net.URLConnection;
 import java.util.Arrays;
@@ -13,6 +11,9 @@ import java.util.Calendar;
 public class FileUtils {
 
 
+
+
+
     public static String downLoad(String urlString,String savePath) throws IOException {
         InputStream in = null;
         OutputStream out=null;

+ 1 - 1
src/main/resources/application.yml

@@ -14,7 +14,7 @@ file:
 #海康配置文件
 hk:
   log-home: D:\project\face\face-admin\logs\hk
-  lib-home: D:\hklib
+  lib-home: E:\libs\hklib
   lib-path: ${hk.lib-home}\HCNetSDK.dll
   linux-libcrypto-path: ${hk.lib-home}/libcrypto.so.1.1
   linux-libssl-path: ${hk.lib-home}/libssl.so.1.1