jiazx0107@163.com
2023-12-24 c8ff96af8647474b1d03f5f374bb18eb59f65987
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
package com.fzzy.protocol.sdkhk.lpr;
 
import com.fzzy.protocol.sdkhk.HKUtils;
import com.fzzy.protocol.sdkhk.common.HCNetSDK;
import com.fzzy.protocol.sdkhk.common.LPRCallBask_V31;
import com.fzzy.protocol.sdkhk.common.OsSelect;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
 
/**
 * 海康车牌识别监听控制,使用在宁夏石嘴山项目
 */
public class AlarmLpr {
 
    Logger log = LoggerFactory.getLogger(AlarmLpr.class);
 
    static HCNetSDK hCNetSDK = null;
    static int[] lUserID = new int[]{0, 0, 0, 0, 0};//用户句柄 实现对设备登录
    static int[] lAlarmHandle = new int[]{-1, -1, -1, -1, -1};//报警布防句柄
    static int lListenHandle = -1;//报警监听句柄
    static LPRCallBask_V31 fMSFCallBack_V31 = null;
 
 
    /**
     * SDK初始化
     *
     * @return
     */
    public String initSdk() {
        if (hCNetSDK == null) {
            synchronized (HCNetSDK.class) {
                String strDllPath = "";
                try {
                    if (OsSelect.isWindows())
                        strDllPath = HKUtils.SDK_DIR_WIN + "\\HCNetSDK.dll";
                    else if (OsSelect.isLinux())
                        strDllPath = HKUtils.SDK_DIR_LINUX + "/libhcnetsdk.so";
                    hCNetSDK = (HCNetSDK) Native.loadLibrary(strDllPath, HCNetSDK.class);
                } catch (Exception ex) {
                    // System.out.println("loadLibrary: " + strDllPath + " Error: " + ex.getMessage());
                    log.error("loadLibrary: " + strDllPath + " Error: " + ex.getMessage());
 
                    return "ERROR:loadLibrary: " + strDllPath + " Error: " + ex.getMessage();
                }
            }
        }
 
        String logBasePath = HKUtils.getLogBasePath(OsSelect.isLinux());
 
        //初始化
        hCNetSDK.NET_DVR_Init();
 
        //加载日志
        hCNetSDK.NET_DVR_SetLogToFile(3, logBasePath, false);
 
        //设置报警回调函数
        if (fMSFCallBack_V31 == null) {
            fMSFCallBack_V31 = new LPRCallBask_V31();
            Pointer pUser = null;
            if (!hCNetSDK.NET_DVR_SetDVRMessageCallBack_V31(fMSFCallBack_V31, pUser)) {
                log.error("设置回调函数失败!");
                return "ERROR:设置回调函数失败!";
            } else {
                log.debug("设置回调函数失败!");
            }
        }
 
 
        //配置警告监听
        HCNetSDK.NET_DVR_LOCAL_GENERAL_CFG struNET_DVR_LOCAL_GENERAL_CFG = new HCNetSDK.NET_DVR_LOCAL_GENERAL_CFG();
        struNET_DVR_LOCAL_GENERAL_CFG.byAlarmJsonPictureSeparate = 1;   //设置JSON透传报警数据和图片分离
        struNET_DVR_LOCAL_GENERAL_CFG.write();
        Pointer pStrNET_DVR_LOCAL_GENERAL_CFG = struNET_DVR_LOCAL_GENERAL_CFG.getPointer();
        hCNetSDK.NET_DVR_SetSDKLocalCfg(17, pStrNET_DVR_LOCAL_GENERAL_CFG);
 
        return HKUtils.RESULT_SUCCESS;
    }
 
 
    /**
     * @param index    登陆顺序 默认0 -4 同时只能登陆5个设备,每个设备登陆的顺序,人为控制
     * @param ip
     * @param port
     * @param userName
     * @param pwd
     * @return
     */
    public String login(int index, String ip, int port, String userName, String pwd) {
 
        //登陆
        String msg = Login_V(index, ip, (short) port, userName, pwd);
 
        if (!HKUtils.RESULT_SUCCESS.equals(msg)) {
            return msg;
        }
        //启动事件监听
        msg = SetAlarm_V(index, ip, port);
        return msg;
    }
 
    /**
     * 退出
     *
     * @param ip
     * @param port
     * @return
     */
    public String logout(int index, String ip, int port) {
 
        int i = index;
 
        if (lAlarmHandle[i] > -1) {
            if (!hCNetSDK.NET_DVR_CloseAlarmChan(lAlarmHandle[i])) {
                log.info(ip + ":" + port + "撤防成功");
            }
        }
        if (lListenHandle > -1) {
            if (!hCNetSDK.NET_DVR_StopListen_V30(lListenHandle)) {
                log.info(ip + ":" + port + "停止监听成功");
            }
        }
        if (hCNetSDK.NET_DVR_Logout(lUserID[i])) {
            log.info(ip + ":" + port + "注销成功");
        }
 
        hCNetSDK.NET_DVR_Cleanup();
 
        return HKUtils.RESULT_SUCCESS;
    }
 
 
    public String Login_V(int i, String ip, short port, String user, String psw) {
        //注册
        HCNetSDK.NET_DVR_USER_LOGIN_INFO m_strLoginInfo = new HCNetSDK.NET_DVR_USER_LOGIN_INFO();//设备登录信息
        HCNetSDK.NET_DVR_DEVICEINFO_V40 m_strDeviceInfo = new HCNetSDK.NET_DVR_DEVICEINFO_V40();//设备信息
 
        String m_sDeviceIP = ip;//设备ip地址
        m_strLoginInfo.sDeviceAddress = new byte[HCNetSDK.NET_DVR_DEV_ADDRESS_MAX_LEN];
        System.arraycopy(m_sDeviceIP.getBytes(), 0, m_strLoginInfo.sDeviceAddress, 0, m_sDeviceIP.length());
 
        String m_sUsername = user;//设备用户名
        m_strLoginInfo.sUserName = new byte[HCNetSDK.NET_DVR_LOGIN_USERNAME_MAX_LEN];
        System.arraycopy(m_sUsername.getBytes(), 0, m_strLoginInfo.sUserName, 0, m_sUsername.length());
 
        String m_sPassword = psw;//设备密码
        m_strLoginInfo.sPassword = new byte[HCNetSDK.NET_DVR_LOGIN_PASSWD_MAX_LEN];
        System.arraycopy(m_sPassword.getBytes(), 0, m_strLoginInfo.sPassword, 0, m_sPassword.length());
 
        m_strLoginInfo.wPort = port;
        m_strLoginInfo.bUseAsynLogin = false; //是否异步登录:0- 否,1- 是
//        m_strLoginInfo.byLoginMode=1;  //ISAPI登录
        m_strLoginInfo.write();
 
        lUserID[i] = hCNetSDK.NET_DVR_Login_V40(m_strLoginInfo, m_strDeviceInfo);
        if (lUserID[i] == -1) {
            log.error("ERROR:登录失败,错误码为" + hCNetSDK.NET_DVR_GetLastError());
            return "ERROR:登录失败,错误码为" + hCNetSDK.NET_DVR_GetLastError();
 
        }
 
        log.info(ip + ":车牌识别设备登录成功!");
        return HKUtils.RESULT_SUCCESS;
    }
 
 
    public String SetAlarm_V(int index, String ip, int port) {
        if (lAlarmHandle[index] < 0) { //尚未布防,需要布防
            //报警布防参数设置
            HCNetSDK.NET_DVR_SETUPALARM_PARAM m_strAlarmInfo = new HCNetSDK.NET_DVR_SETUPALARM_PARAM();
            m_strAlarmInfo.dwSize = m_strAlarmInfo.size();
            m_strAlarmInfo.byLevel = 1;  //布防等级 0 一级,1二级
            m_strAlarmInfo.byAlarmInfoType = 1;   // 智能交通报警信息上传类型:0- 老报警信息(NET_DVR_PLATE_RESULT),1- 新报警信息(NET_ITS_PLATE_RESULT)
            m_strAlarmInfo.byDeployType = 0;   //布防类型:0-客户端布防,1-实时布防
            m_strAlarmInfo.write();
            lAlarmHandle[index] = hCNetSDK.NET_DVR_SetupAlarmChan_V41(lUserID[index], m_strAlarmInfo);
            log.debug("lAlarmHandle: " + lAlarmHandle[index]);
            if (lAlarmHandle[index] == -1) {
                log.error("ERROR:布防失败,错误码为" + hCNetSDK.NET_DVR_GetLastError());
                return "ERROR:布防失败,错误码为" + hCNetSDK.NET_DVR_GetLastError();
            } else {
                log.debug(ip + ":" + port + " 布防成功");
            }
        } else {
            log.warn(ip + ":" + port + " 设备已经布防,请先撤防!");
        }
 
        return HKUtils.RESULT_SUCCESS;
    }
 
}