Bladeren bron

超脑对接初始化-v1.0

hanqingsong 1 jaar geleden
bovenliggende
commit
43e19473c1

+ 12 - 0
pom.xml

@@ -24,6 +24,7 @@
24 24
         <mysql.connector.java.version>8.0.28</mysql.connector.java.version>
25 25
         <lombok.versin>1.18.22</lombok.versin>
26 26
         <spring-cloud.version>Hoxton.SR12</spring-cloud.version>
27
+        <jna.version>3.0.9</jna.version>
27 28
     </properties>
28 29
     <dependencies>
29 30
         <!-- lombok -->
@@ -38,6 +39,17 @@
38 39
             <artifactId>fastjson</artifactId>
39 40
             <version>${fastjson.version}</version>
40 41
         </dependency>
42
+        <!-- 引入本地依赖 start -->
43
+        <dependency>
44
+            <groupId>com.sun.jna</groupId>
45
+            <artifactId>jna</artifactId>
46
+            <version>${jna.version}</version>
47
+        </dependency>
48
+        <dependency>
49
+            <groupId>com.sun.jna</groupId>
50
+            <artifactId>examples</artifactId>
51
+            <version>${jna.version}</version>
52
+        </dependency>
41 53
         <dependency>
42 54
             <groupId>org.springframework.boot</groupId>
43 55
             <artifactId>spring-boot-starter-web</artifactId>

File diff suppressed because it is too large
+ 9989 - 0
src/main/java/com/unis/common/HCNetSDK.java


+ 16 - 0
src/main/java/com/unis/common/osSelect.java

@@ -0,0 +1,16 @@
1
+package com.unis.common;
2
+
3
+/**
4
+ * @author jiangxin
5
+ * @create 2022-01-19-16:40
6
+ */
7
+public class osSelect {
8
+
9
+    public static boolean isLinux() {
10
+        return System.getProperty("os.name").toLowerCase().contains("linux");
11
+    }
12
+
13
+    public static boolean isWindows() {
14
+        return System.getProperty("os.name").toLowerCase().contains("windows");
15
+    }
16
+}

+ 31 - 0
src/main/java/com/unis/config/AddressModel.java

@@ -0,0 +1,31 @@
1
+package com.unis.config;
2
+
3
+import lombok.Data;
4
+import org.springframework.beans.factory.annotation.Value;
5
+import org.springframework.stereotype.Component;
6
+
7
+/**
8
+ * @author qingsong.han
9
+ * @description:
10
+ * @create 2024-07-31 9:24
11
+ */
12
+@Data
13
+@Component
14
+public class AddressModel {
15
+
16
+    // 推送地址
17
+    @Value("${address.pushToIntrusion}")
18
+    private String pushToIntrusion;
19
+    // 设备ip
20
+    @Value("${exceptionAlarm.deviceIP}")
21
+    private String deviceIP;
22
+    // 设备ip
23
+    @Value("${exceptionAlarm.org-code}")
24
+    private String orgCode;
25
+    // 设备登录用户名
26
+    @Value("${exceptionAlarm.userName}")
27
+    private String userName;
28
+    // 设备登录密码
29
+    @Value("${exceptionAlarm.password}")
30
+    private String password;
31
+}

+ 75 - 0
src/main/java/com/unis/face/Alarm.java

@@ -0,0 +1,75 @@
1
+package com.unis.face;
2
+
3
+import com.sun.jna.Pointer;
4
+import com.unis.common.HCNetSDK;
5
+import lombok.extern.slf4j.Slf4j;
6
+
7
+/**
8
+ * 报警布防/监听功能模块:功能:报警布防/监听实时接受设备的人脸比对报警事件,回调函数中获取的报警类型(lCommand)为COMM_SNAP_MATCH_ALARM,报警信息(pAlarmInfo)对应结构体:NET_VCA_FACESNAP_MATCH_ALARM。
9
+ * fSimilarity相似度大于0表示人脸比对成功,可以获取人脸库相关数据;fSimilarity相似度为0,需要通过NET_VCA_BLACKLIST_INFO结构体里面的byType类型判断,值为1表示陌生人模式,值为2表示人脸比对失败。
10
+ */
11
+@Slf4j
12
+public class Alarm {
13
+
14
+    public static HCNetSDK.FMSGCallBack_V31 fMSFCallBack_V31 = null;
15
+
16
+    /**
17
+     * 报警布防 (布防和监听选其一)
18
+     *
19
+     * @param lUserID 用户登录句柄
20
+     */
21
+    public static void SetAlarm(int lUserID) {
22
+        //尚未布防,需要布防
23
+        if (FaceMain.lAlarmHandle < 0) {
24
+
25
+            //设置报警回调函数,一个程序进程只需要而且只能调用一次,对接多台设备,可以SDK初始化之后就调用该接口设置报警回调函数
26
+            if (fMSFCallBack_V31 == null) {
27
+                fMSFCallBack_V31 = new FMSGCallBack_V31();
28
+                Pointer pUser = null;
29
+                if (!FaceMain.hCNetSDK.NET_DVR_SetDVRMessageCallBack_V31(fMSFCallBack_V31, pUser)) {
30
+                    log.error("设置回调函数失败!");
31
+                } else {
32
+                    log.info("设置回调函数成功!");
33
+                }
34
+            }
35
+
36
+            //报警布防参数设置
37
+            HCNetSDK.NET_DVR_SETUPALARM_PARAM m_strAlarmInfo = new HCNetSDK.NET_DVR_SETUPALARM_PARAM();
38
+            m_strAlarmInfo.dwSize = m_strAlarmInfo.size();
39
+            m_strAlarmInfo.byLevel = 1;  //布防等级
40
+            m_strAlarmInfo.byAlarmInfoType = 1;   // 智能交通报警信息上传类型:0- 老报警信息(NET_DVR_PLATE_RESULT),1- 新报警信息(NET_ITS_PLATE_RESULT)
41
+            m_strAlarmInfo.byDeployType = 1;   //布防类型 0:客户端布防 1:实时布防
42
+            m_strAlarmInfo.write();
43
+            FaceMain.lAlarmHandle = FaceMain.hCNetSDK.NET_DVR_SetupAlarmChan_V41(lUserID, m_strAlarmInfo);
44
+            log.info("lAlarmHandle: {}", FaceMain.lAlarmHandle);
45
+            if (FaceMain.lAlarmHandle == -1) {
46
+                log.error("布防失败,错误码为: {}", FaceMain.hCNetSDK.NET_DVR_GetLastError());
47
+            } else {
48
+                log.info("布防成功");
49
+            }
50
+        }
51
+    }
52
+
53
+    /**
54
+     * 报警监听
55
+     * <p>
56
+     * 注意: 设置监听前需要现在本机pc配置端口
57
+     * 具体步骤:库文件ClientDemo->登录设备->配置->网络参数配置->配置告警管理主机地址、告警管理主机端口(需要与NET_DVR_StartListen_V30接口中对应)
58
+     */
59
+    public void StartListen() {
60
+        if (fMSFCallBack_V31 == null) {
61
+            fMSFCallBack_V31 = new FMSGCallBack_V31();
62
+        }
63
+        /**
64
+         * 这里NET_DVR_StartListen_V30接口中的ip和端口需要和配置的ip和端口对应
65
+         * NET_DVR_StartListen_V30中传入的IP和端口是服务器或者测试PC的IP地址和端口,不是设备的IP和端口!!!
66
+         */
67
+        FaceMain.lListenHandle = FaceMain.hCNetSDK.NET_DVR_StartListen_V30("10.17.36.14", (short) 7201, fMSFCallBack_V31, null);
68
+        if (FaceMain.lListenHandle == -1) {
69
+            log.error("监听失败: {}", FaceMain.hCNetSDK.NET_DVR_GetLastError());
70
+        } else {
71
+            log.info("监听成功");
72
+        }
73
+    }
74
+
75
+}

+ 181 - 0
src/main/java/com/unis/face/FMSGCallBack_V31.java

@@ -0,0 +1,181 @@
1
+package com.unis.face;
2
+
3
+import com.alibaba.fastjson.JSON;
4
+import com.sun.jna.Pointer;
5
+import com.unis.common.HCNetSDK;
6
+/*import com.unissoft.pushMsg.AlarmDSService;
7
+import com.unissoft.pushMsg.AlarmDSServiceImpl;*/
8
+import lombok.extern.slf4j.Slf4j;
9
+
10
+import java.io.FileOutputStream;
11
+import java.io.IOException;
12
+import java.nio.ByteBuffer;
13
+import java.text.SimpleDateFormat;
14
+import java.util.Date;
15
+
16
+/**
17
+ * 人脸比对报警接收回调函数
18
+ */
19
+@Slf4j
20
+public class FMSGCallBack_V31 implements HCNetSDK.FMSGCallBack_V31 {
21
+    // this class call jna native callback,so is not spring manage class
22
+    /*private AlarmDSService alarmDSService = new AlarmDSServiceImpl();*/
23
+
24
+    //报警信息回调函数
25
+    public boolean invoke(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser) {
26
+        AlarmDataHandle(lCommand, pAlarmer, pAlarmInfo, dwBufLen, pUser);
27
+        return true;
28
+    }
29
+
30
+    public void AlarmDataHandle(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser) {
31
+        log.info("报警事件发生,进入回调");
32
+        log.info(
33
+                "lCommand {} -> pAlarmer {} -> pAlarmInfo {} -> dwBufLen {} -> pUser {}",
34
+                lCommand, JSON.toJSONString(pAlarmer), JSON.toJSONString(pAlarmInfo),dwBufLen,JSON.toJSONString(pUser)
35
+        );
36
+        /*String hexString = Integer.toHexString(lCommand);
37
+        log.info("报警类型 hexString {}", hexString);*/
38
+        switch (lCommand) {
39
+            case HCNetSDK.COMM_ALARM_RULE://行为分析信息上传
40
+                HCNetSDK.NET_VCA_RULE_ALARM ruleAlarm = new HCNetSDK.NET_VCA_RULE_ALARM();
41
+                ruleAlarm.write();
42
+                Pointer ruleAlarmPointer = ruleAlarm.getPointer();
43
+                ruleAlarmPointer.write(0, pAlarmInfo.getByteArray(0, ruleAlarm.size()), 0, ruleAlarm.size());
44
+                ruleAlarm.read();
45
+                log.info("alarm type in the NET_VCA_RULE_ALARM ---------->: {}", JSON.toJSONString(ruleAlarm));
46
+//                alarmDSService.pushLCommand(lCommand);
47
+                break;
48
+            case HCNetSDK.COMM_SNAP_MATCH_ALARM:
49
+                //人脸黑名单比对报警
50
+                log.info("SNAP_MATCH_ALARM");
51
+                HCNetSDK.NET_VCA_FACESNAP_MATCH_ALARM strFaceSnapMatch = new HCNetSDK.NET_VCA_FACESNAP_MATCH_ALARM();
52
+                strFaceSnapMatch.write();
53
+                Pointer pFaceSnapMatch = strFaceSnapMatch.getPointer();
54
+                pFaceSnapMatch.write(0, pAlarmInfo.getByteArray(0, strFaceSnapMatch.size()), 0, strFaceSnapMatch.size());
55
+                strFaceSnapMatch.read();
56
+                //比对结果
57
+                log.info("比对结果: {}", strFaceSnapMatch.byContrastStatus == 1 ? "比对成功" : "比对失败");
58
+                //人脸库ID
59
+                if (strFaceSnapMatch.struBlockListInfo.dwFDIDLen > 0) {
60
+                    long offset1 = 0;
61
+                    ByteBuffer buffers1 = strFaceSnapMatch.struBlockListInfo.pFDID.getByteBuffer(offset1, strFaceSnapMatch.struBlockListInfo.dwFDIDLen);
62
+                    byte[] bytes1 = new byte[strFaceSnapMatch.struBlockListInfo.dwFDIDLen];
63
+                    buffers1.get(bytes1);
64
+                    log.info("人脸库ID: {}", new String(bytes1));
65
+                }
66
+                //人脸库图片ID
67
+                if (strFaceSnapMatch.struBlockListInfo.dwPIDLen > 0) {
68
+                    long offset2 = 0;
69
+                    ByteBuffer buffers2 = strFaceSnapMatch.struBlockListInfo.pPID.getByteBuffer(offset2, strFaceSnapMatch.struBlockListInfo.dwPIDLen);
70
+                    byte[] bytes2 = new byte[strFaceSnapMatch.struBlockListInfo.dwPIDLen];
71
+                    buffers2.get(bytes2);
72
+                    log.info("图片ID: {}", new String(bytes2));
73
+                }
74
+                //保存抓拍人脸图,图片数据传输方式: 0- 二进制
75
+                if ((strFaceSnapMatch.dwSnapPicLen > 0) && (strFaceSnapMatch.byPicTransType == 0)) {
76
+                    SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");
77
+                    String newName = sf.format(new Date());
78
+                    FileOutputStream fout;
79
+                    try {
80
+                        String filename = ".//pic//" + newName + "_pSnapPicBuffer" + ".jpg";
81
+                        fout = new FileOutputStream(filename);
82
+                        //将字节写入文件
83
+                        long offset = 0;
84
+                        ByteBuffer buffers = strFaceSnapMatch.pSnapPicBuffer.getByteBuffer(offset, strFaceSnapMatch.dwSnapPicLen);
85
+                        byte[] bytes = new byte[strFaceSnapMatch.dwSnapPicLen];
86
+                        buffers.rewind();
87
+                        buffers.get(bytes);
88
+                        fout.write(bytes);
89
+                        fout.close();
90
+                    } catch (IOException e) {
91
+                        // TODO Auto-generated catch block
92
+                        e.printStackTrace();
93
+                    }
94
+                }
95
+                //保存抓拍人脸图URL,图片数据传输方式: 1- URL 注:超脑设备人脸比对报警图片一般按照URL上传,根据URL去下载设备中存储的图片,认证方式选择:摘要认证
96
+                if ((strFaceSnapMatch.dwSnapPicLen > 0) && (strFaceSnapMatch.byPicTransType == 1)) {
97
+                    long offset = 0;
98
+                    ByteBuffer buffers = strFaceSnapMatch.pSnapPicBuffer.getByteBuffer(offset, strFaceSnapMatch.dwSnapPicLen);
99
+                    byte[] bytes = new byte[strFaceSnapMatch.dwSnapPicLen];
100
+                    buffers.rewind();
101
+                    buffers.get(bytes);
102
+                    log.info("人脸抓拍图片 URL: {}", new String(bytes));
103
+                }
104
+                if ((strFaceSnapMatch.struSnapInfo.dwSnapFacePicLen > 0) && (strFaceSnapMatch.byPicTransType == 0)) {
105
+                    SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");
106
+                    String newName = sf.format(new Date());
107
+                    FileOutputStream fout;
108
+                    try {
109
+                        String filename = ".//pic//" + newName + "_struSnapInfo_pBuffer1" + ".jpg";
110
+                        fout = new FileOutputStream(filename);
111
+                        //将字节写入文件
112
+                        long offset = 0;
113
+                        ByteBuffer buffers = strFaceSnapMatch.struSnapInfo.pBuffer1.getByteBuffer(offset, strFaceSnapMatch.struSnapInfo.dwSnapFacePicLen);
114
+                        byte[] bytes = new byte[strFaceSnapMatch.struSnapInfo.dwSnapFacePicLen];
115
+                        buffers.rewind();
116
+                        buffers.get(bytes);
117
+                        fout.write(bytes);
118
+                        fout.close();
119
+                    } catch (IOException e) {
120
+                        // TODO Auto-generated catch block
121
+                        e.printStackTrace();
122
+                    }
123
+                }
124
+                if ((strFaceSnapMatch.struSnapInfo.dwSnapFacePicLen > 0) && (strFaceSnapMatch.byPicTransType == 1)) {
125
+                    long offset = 0;
126
+                    ByteBuffer buffers = strFaceSnapMatch.struSnapInfo.pBuffer1.getByteBuffer(offset, strFaceSnapMatch.struSnapInfo.dwSnapFacePicLen);
127
+                    byte[] bytes = new byte[strFaceSnapMatch.struSnapInfo.dwSnapFacePicLen];
128
+                    buffers.rewind();
129
+                    buffers.get(bytes);
130
+                    log.info("人脸抓拍图片1 URL: {}", new String(bytes));
131
+                }
132
+                //保存人脸库图片,图片数据传输方式: 0- 二进制
133
+                if ((strFaceSnapMatch.struBlockListInfo.dwBlockListPicLen > 0) && (strFaceSnapMatch.byPicTransType == 0)) {
134
+                    SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");
135
+                    String newName = sf.format(new Date());
136
+                    FileOutputStream fout;
137
+                    try {
138
+                        String filename = ".//pic//" + newName + "_fSimilarity_" + strFaceSnapMatch.fSimilarity + "_struBlackListInfo_pBuffer1" + ".jpg";
139
+                        fout = new FileOutputStream(filename);
140
+                        //将字节写入文件
141
+                        long offset = 0;
142
+                        ByteBuffer buffers = strFaceSnapMatch.struBlockListInfo.pBuffer1.getByteBuffer(offset, strFaceSnapMatch.struBlockListInfo.dwBlockListPicLen);
143
+                        byte[] bytes = new byte[strFaceSnapMatch.struBlockListInfo.dwBlockListPicLen];
144
+                        buffers.rewind();
145
+                        buffers.get(bytes);
146
+                        fout.write(bytes);
147
+                        fout.close();
148
+                    } catch (IOException e) {
149
+                        // TODO Auto-generated catch block
150
+                        e.printStackTrace();
151
+                    }
152
+                }
153
+                //保存人脸库图片,图片数据传输方式: 1-URL
154
+                if ((strFaceSnapMatch.struBlockListInfo.dwBlockListPicLen > 0) && (strFaceSnapMatch.byPicTransType == 1)) {
155
+                    long offset = 0;
156
+                    ByteBuffer buffers = strFaceSnapMatch.struBlockListInfo.pBuffer1.getByteBuffer(offset, strFaceSnapMatch.struBlockListInfo.dwBlockListPicLen);
157
+                    byte[] bytes = new byte[strFaceSnapMatch.struBlockListInfo.dwBlockListPicLen];
158
+                    buffers.rewind();
159
+                    buffers.get(bytes);
160
+                    log.info("人脸库图片 URL: {}", new String(bytes));
161
+                }
162
+                //抓拍库附加信息数据指针,附加信息的XML文本中包含人脸温度数据
163
+                if (strFaceSnapMatch.struBlockListInfo.struBlockListInfo.dwFCAdditionInfoLen > 0) {
164
+                    long offset = 0;
165
+                    ByteBuffer buffers = strFaceSnapMatch.struBlockListInfo.struBlockListInfo.pFCAdditionInfoBuffer.getByteBuffer(offset, strFaceSnapMatch.struBlockListInfo.struBlockListInfo.dwFCAdditionInfoLen);
166
+                    byte[] bytes = new byte[strFaceSnapMatch.struBlockListInfo.struBlockListInfo.dwFCAdditionInfoLen];
167
+                    buffers.rewind();
168
+                    buffers.get(bytes);
169
+                    log.info("抓拍库附加信息: {}", new String(bytes));
170
+                }
171
+//                alarmDSService.pushLCommand(lCommand);
172
+                break;
173
+            default:
174
+                // TODO 单报警设备 目前不需要 sAlarmType alarmNow
175
+                log.info("alarm type in the FMSGCallBack_V31 ->int: {}", lCommand);
176
+//                alarmDSService.pushLCommand(lCommand);
177
+                break;
178
+        }
179
+    }
180
+
181
+}

+ 186 - 0
src/main/java/com/unis/face/FaceMain.java

@@ -0,0 +1,186 @@
1
+package com.unis.face;
2
+
3
+import com.sun.jna.Native;
4
+import com.unis.common.HCNetSDK;
5
+import com.unis.common.osSelect;
6
+import com.unis.config.AddressModel;
7
+import lombok.extern.slf4j.Slf4j;
8
+import org.springframework.boot.ApplicationArguments;
9
+import org.springframework.boot.ApplicationRunner;
10
+import org.springframework.core.annotation.Order;
11
+import org.springframework.stereotype.Component;
12
+
13
+import javax.annotation.Resource;
14
+import java.io.BufferedReader;
15
+import java.io.IOException;
16
+import java.io.InputStreamReader;
17
+
18
+/**
19
+ * @author qingsong.han
20
+ * @description:
21
+ * @create 2024-07-31 9:29
22
+ */
23
+@Slf4j
24
+@Component
25
+@Order(1)
26
+public class FaceMain implements ApplicationRunner {
27
+
28
+    static HCNetSDK hCNetSDK = null;
29
+    static int lUserID = -1;//用户句柄
30
+    static int lAlarmHandle = -1; //布防句柄
31
+    static int lListenHandle = -1; //监听句柄
32
+
33
+    // 设备连接信息
34
+    @Resource
35
+    private AddressModel addressModel;
36
+
37
+    /*
38
+     * 获取配置
39
+     */
40
+    private void mainMethod() {
41
+        log.info("FaceMain mainMethod===========================================================init thread");
42
+        try {
43
+            if (hCNetSDK == null) {
44
+                if (!CreateSDKInstance()) {
45
+                    log.error("Load SDK fail");
46
+                    return;
47
+                }
48
+            }
49
+            //linux系统建议调用以下接口加载组件库
50
+            if (osSelect.isLinux()) {
51
+                HCNetSDK.BYTE_ARRAY ptrByteArray1 = new HCNetSDK.BYTE_ARRAY(256);
52
+                HCNetSDK.BYTE_ARRAY ptrByteArray2 = new HCNetSDK.BYTE_ARRAY(256);
53
+                //这里是库的绝对路径,请根据实际情况修改,注意改路径必须有访问权限
54
+                String strPath1 = System.getProperty("user.dir") + "/lib/libcrypto.so.1.1";
55
+                String strPath2 = System.getProperty("user.dir") + "/lib/libssl.so.1.1";
56
+
57
+                System.arraycopy(strPath1.getBytes(), 0, ptrByteArray1.byValue, 0, strPath1.length());
58
+                ptrByteArray1.write();
59
+                hCNetSDK.NET_DVR_SetSDKInitCfg(3, ptrByteArray1.getPointer());
60
+
61
+                System.arraycopy(strPath2.getBytes(), 0, ptrByteArray2.byValue, 0, strPath2.length());
62
+                ptrByteArray2.write();
63
+                hCNetSDK.NET_DVR_SetSDKInitCfg(4, ptrByteArray2.getPointer());
64
+
65
+                String strPathCom = System.getProperty("user.dir") + "/lib";
66
+                HCNetSDK.NET_DVR_LOCAL_SDK_PATH struComPath = new HCNetSDK.NET_DVR_LOCAL_SDK_PATH();
67
+                System.arraycopy(strPathCom.getBytes(), 0, struComPath.sPath, 0, strPathCom.length());
68
+                struComPath.write();
69
+                hCNetSDK.NET_DVR_SetSDKInitCfg(2, struComPath.getPointer());
70
+            }
71
+
72
+            //初始化
73
+            hCNetSDK.NET_DVR_Init();
74
+
75
+            //加载日志
76
+            hCNetSDK.NET_DVR_SetLogToFile(3, "..//sdklog", false);
77
+
78
+            //登录设备,每一台设备分别登录; 登录句柄是唯一的,可以区分设备
79
+            HCNetSDK.NET_DVR_USER_LOGIN_INFO m_strLoginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO();//设备登录信息
80
+            HCNetSDK.NET_DVR_DEVICEINFO_V40 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40();//设备信息
81
+
82
+            String m_sDeviceIP = addressModel.getDeviceIP();//设备ip地址
83
+            m_strLoginInfo.sDeviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN];
84
+            System.arraycopy(m_sDeviceIP.getBytes(), 0, m_strLoginInfo.sDeviceAddress, 0, m_sDeviceIP.length());
85
+
86
+            String m_sUsername = addressModel.getUserName();//设备用户名
87
+            m_strLoginInfo.sUserName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN];
88
+            System.arraycopy(m_sUsername.getBytes(), 0, m_strLoginInfo.sUserName, 0, m_sUsername.length());
89
+
90
+            String m_sPassword = addressModel.getPassword();//设备密码
91
+            m_strLoginInfo.sPassword = new byte[HCNetSDK.NET_DVR_LOGIN_PASSWD_MAX_LEN];
92
+            System.arraycopy(m_sPassword.getBytes(), 0, m_strLoginInfo.sPassword, 0, m_sPassword.length());
93
+
94
+            m_strLoginInfo.wPort = 8000;
95
+            m_strLoginInfo.bUseAsynLogin = false; //是否异步登录:0- 否,1- 是
96
+            m_strLoginInfo.byLoginMode = 0;  //登录模式:0- SDK私有协议,1- ISAPI协议
97
+            m_strLoginInfo.write();
98
+
99
+            lUserID = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo);
100
+            if (lUserID == -1) {
101
+                log.error("登录失败,错误码为: {}", hCNetSDK.NET_DVR_GetLastError());
102
+            } else {
103
+                log.info("{} 设备登录成功!设备序列号: {}", m_sDeviceIP, new String(m_strDeviceInfo.struDeviceV30.sSerialNumber).trim());
104
+                m_strDeviceInfo.read();
105
+            }
106
+
107
+            //报警布防实时接收人脸比对的结果信息,也可以单独参考“2-报警布防监听”这个Demo示例
108
+            Alarm.SetAlarm(lUserID);
109
+
110
+            // TODO 暂停状态 需要测试改造
111
+            while (true) {
112
+                //这里加入控制台输入控制,是为了保持连接状态,当输入Y表示布防结束
113
+                log.info("请选择是否撤出布防(Y/N):");
114
+                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
115
+                String str = bufferedReader.readLine();
116
+                if (str.toUpperCase().equals("Y")) {
117
+                    break;
118
+                }
119
+            }
120
+            Thread.sleep(3000);
121
+
122
+            //退出之前判断布防监听状态,并做撤防和停止监听操作
123
+            if (lAlarmHandle >= 0) {
124
+                if (!hCNetSDK.NET_DVR_CloseAlarmChan_V30(lAlarmHandle)) {
125
+                    log.error("撤防失败,错误码: {}", hCNetSDK.NET_DVR_GetLastError());
126
+                } else {
127
+                    log.info("撤防成功!!!");
128
+                }
129
+            }
130
+            if (lListenHandle >= 0) {
131
+                if (!hCNetSDK.NET_DVR_StopListen_V30(lListenHandle)) {
132
+                    log.error("取消监听失败,错误码:{}", hCNetSDK.NET_DVR_GetLastError());
133
+                } else {
134
+                    log.info("停止监听成功!!!");
135
+                }
136
+            }
137
+
138
+            //注销登录,程序退出时调用;程序同时对接多台设备时,每一台设备分别调用一次接口,传入不同的登录句柄
139
+            if (lUserID >= 0) {
140
+                hCNetSDK.NET_DVR_Logout(lUserID);
141
+            }
142
+
143
+            //SDK反初始化,释放资源,程序退出时调用
144
+            boolean b = hCNetSDK.NET_DVR_Cleanup();
145
+            if (b)
146
+                log.info("释放资源,程序退出!");
147
+        } catch (InterruptedException e) {
148
+            e.printStackTrace();
149
+        } catch (IOException e) {
150
+            e.printStackTrace();
151
+        }
152
+    }
153
+
154
+    /**
155
+     * 根据不同操作系统选择不同的库文件和库路径
156
+     *
157
+     * @return
158
+     */
159
+    private boolean CreateSDKInstance() {
160
+        if (hCNetSDK == null) {
161
+            synchronized (HCNetSDK.class) {
162
+                String strDllPath = "";
163
+                try {
164
+//                    System.setProperty("jna.debug_load", "true");
165
+                    if (osSelect.isWindows())
166
+                        //win系统加载库路径
167
+                        strDllPath = System.getProperty("user.dir") + "\\lib\\HCNetSDK.dll";
168
+                    else if (osSelect.isLinux())
169
+                        //Linux系统加载库路径
170
+                        strDllPath = System.getProperty("user.dir") + "/lib/libhcnetsdk.so";
171
+                    hCNetSDK = (HCNetSDK) Native.loadLibrary(strDllPath, HCNetSDK.class);
172
+                } catch (Exception ex) {
173
+                    log.error("loadLibrary: {} Error: {}", strDllPath, ex.getMessage());
174
+                    return false;
175
+                }
176
+            }
177
+        }
178
+        return true;
179
+    }
180
+
181
+    @Override
182
+    public void run(ApplicationArguments args) throws Exception {
183
+        // after behind for application run,because implements ApplicationRunner
184
+        this.mainMethod();
185
+    }
186
+}

+ 2 - 2
src/main/resources/application-dev.yml

@@ -2,11 +2,11 @@
2 2
 # 设备登录
3 3
 exceptionAlarm:
4 4
   # 设备ip地址 枪机: DS-2CD7T27DWD-IZS(16384)/球机: DS-7716NX-I4(4354)
5
-  deviceIP: 192.168.0.103
5
+  deviceIP: 10.7.11.161
6 6
   # 设备用户名
7 7
   userName: admin
8 8
   # 设备密码
9
-  password: q1234567
9
+  password: Aa870618
10 10
   # orgCode
11 11
   org-code: SJG
12 12
 # 只支持post