zhanghua
2024-12-20 1f45c25ea725445d7e78e8d5da6e72150f35f2eb
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
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
package com.dahua.netsdk.lib.callback.impl;
 
import com.dahua.netsdk.lib.NetSDKLib;
import com.dahua.netsdk.lib.NetSDKLib.*;
import com.dahua.netsdk.lib.ToolKits;
import com.dahua.netsdk.lib.constant.SDK_ALARM_Ex_TYPE;
import com.dahua.netsdk.lib.enumeration.*;
import com.dahua.netsdk.lib.structure.*;
import com.sun.jna.NativeLong;
import com.sun.jna.Pointer;
 
import java.io.UnsupportedEncodingException;
 
import static com.dahua.netsdk.lib.Utils.getOsPrefix;
 
public class MessCallBack implements fMessCallBack {
 
    private MessCallBack() {
    }
 
    private static class CallBackHolder {
        private static final MessCallBack cb = new MessCallBack();
    }
 
    public static final MessCallBack getInstance() {
        return CallBackHolder.cb;
    }
 
    public static String encode;
 
    static {
        String osPrefix = getOsPrefix();
        if (osPrefix.toLowerCase().startsWith("win32-amd64")) {
            encode = "GBK";
        } else if (osPrefix.toLowerCase().startsWith("linux-amd64")) {
            encode = "UTF-8";
        }
    }
 
    @Override
    public boolean invoke(int lCommand, LLong lLoginID, Pointer pStuEvent,
                          int dwBufLen, String strDeviceIP, NativeLong nDevicePort,
                          Pointer dwUser) {
        switch (lCommand) {
            /************************************************************
             *                            门禁事件                            *
             *************************************************************/
            case NetSDKLib.NET_ALARM_ACCESS_CTL_EVENT: // 门禁事件
            {
                ALARM_ACCESS_CTL_EVENT_INFO msg = new ALARM_ACCESS_CTL_EVENT_INFO();
                ToolKits.GetPointerData(pStuEvent, msg);
                try {
                    System.out.println("【门禁事件】 " + new String(msg.szQRCode, "GBK"));
                } catch (UnsupportedEncodingException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                break;
            }
            case NetSDKLib.NET_ALARM_ACCESS_CTL_NOT_CLOSE: // 门禁未关事件详细信息
            {
                ALARM_ACCESS_CTL_NOT_CLOSE_INFO msg = new ALARM_ACCESS_CTL_NOT_CLOSE_INFO();
                ToolKits.GetPointerData(pStuEvent, msg);
                try {
                    System.out.printf("【门禁未关事件详细信息】 时间:%s 门通道号:%d 门禁名称:%s 事件动作(0:开始 1:停止):%d \n",
                            msg.stuTime, msg.nDoor, new String(msg.szDoorName, "GBK").trim(), msg.nAction);
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                break;
            }
            case NetSDKLib.NET_MOTION_ALARM_EX: {
                byte[] alarm = new byte[dwBufLen];
                pStuEvent.read(0, alarm, 0, dwBufLen);
                for (int i = 0; i < dwBufLen; i++) {
                    if (alarm[i] == 1) {
                        System.out.println("通道[" + i + "]" + "动态检测报警:" + "开始");
                    } else {
                        System.out.println("通道[" + i + "]" + "动态检测报警:" + "结束");
                    }
                }
                break;
            }
            case NetSDKLib.NET_ALARM_ACCESS_CTL_BREAK_IN: // 闯入事件详细信息
            {
                ALARM_ACCESS_CTL_BREAK_IN_INFO msg = new ALARM_ACCESS_CTL_BREAK_IN_INFO();
                ToolKits.GetPointerData(pStuEvent, msg);
                try {
                    System.out.printf("【闯入事件详细信息】 时间:%s 门通道号:%d 门禁名称:%s \n",
                            msg.stuTime, msg.nDoor, new String(msg.szDoorName, "GBK").trim());
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                break;
            }
            case NetSDKLib.NET_ALARM_ACCESS_CTL_REPEAT_ENTER: // 反复进入事件详细信息
            {
                ALARM_ACCESS_CTL_REPEAT_ENTER_INFO msg = new ALARM_ACCESS_CTL_REPEAT_ENTER_INFO();
                ToolKits.GetPointerData(pStuEvent, msg);
                try {
                    System.out.printf("【反复进入事件详细信息】 时间:%s 门通道号:%d 门禁名称:%s 卡号:%s\n",
                            msg.stuTime, msg.nDoor, new String(msg.szDoorName, "GBK").trim(), new String(msg.szCardNo).trim());
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                break;
            }
            case NetSDKLib.NET_ALARM_ACCESS_CTL_DURESS: // 胁迫卡刷卡事件详细信息
            {
                ALARM_ACCESS_CTL_DURESS_INFO msg = new ALARM_ACCESS_CTL_DURESS_INFO();
                ToolKits.GetPointerData(pStuEvent, msg);
                try {
                    System.out.printf("【胁迫卡刷卡事件详细信息】 时间:%s 门通道号:%d 门禁名称:%s 胁迫卡号:%s\n",
                            msg.stuTime, msg.nDoor, new String(msg.szDoorName, "GBK").trim(), new String(msg.szCardNo).trim());
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                break;
            }
            case NetSDKLib.NET_ALARM_OPENDOORGROUP: // 多人组合开门事件
            {
                ALARM_OPEN_DOOR_GROUP_INFO msg = new ALARM_OPEN_DOOR_GROUP_INFO();
                ToolKits.GetPointerData(pStuEvent, msg);
                System.out.printf("【多人组合开门事件】 时间:%s 门通道号:%d\n", msg.stuTime, msg.nChannelID);
                break;
            }
            case NetSDKLib.NET_ALARM_ACCESS_CTL_STATUS: // 门禁状态事件
            {
                ALARM_ACCESS_CTL_STATUS_INFO msg = new ALARM_ACCESS_CTL_STATUS_INFO();
                ToolKits.GetPointerData(pStuEvent, msg);
                System.out.printf("【门禁状态事件】 时间:%s 门通道号:%d 门禁状态:%d\n", msg.stuTime, msg.nDoor, msg.emStatus);
                break;
            }
            case NetSDKLib.NET_ALARM_FINGER_PRINT: // 获取信息事件
            {
                ALARM_CAPTURE_FINGER_PRINT_INFO msg = new ALARM_CAPTURE_FINGER_PRINT_INFO();
                ToolKits.GetPointerData(pStuEvent, msg);
                System.out.printf("【获取信息事件】 时间:%s 门通道号:%d 采集结果:%d\n", msg.stuTime, msg.nChannelID, msg.bCollectResult);
                break;
            }
            case NetSDKLib.NET_ALARM_QR_CODE_CHECK: // 二维码上报事件
            {
                ALARM_QR_CODE_CHECK_INFO msg = new ALARM_QR_CODE_CHECK_INFO();
                ToolKits.GetPointerData(pStuEvent, msg);
                try {
                    System.out.printf("【二维码上报事件】 UTC:%s 二维码字符串:%s ",
                            msg.UTC, new String(msg.szQRCode, "GBK").trim());
                } catch (UnsupportedEncodingException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                break;
            }
            /****************************************************************
             *                            报警主机事件                            *
             *****************************************************************/
            case NetSDKLib.NET_ALARM_POWERFAULT: // 电源故障事件
            {
                ALARM_POWERFAULT_INFO msg = new ALARM_POWERFAULT_INFO();
                ToolKits.GetPointerData(pStuEvent, msg);
                System.out.printf("【电源故障事件】 时间:%s 电源类型:%d 电源故障事件:%d 事件动作(0:开始 1:停止):%d\n",
                        msg.stuTime, msg.emPowerType, msg.emPowerFaultEvent, msg.nAction);
                break;
            }
            case NetSDKLib.NET_ALARM_BATTERYLOWPOWER: // 蓄电池低电压事件
            {
                ALARM_BATTERYLOWPOWER_INFO msg = new ALARM_BATTERYLOWPOWER_INFO();
                ToolKits.GetPointerData(pStuEvent, msg);
                System.out.printf("【蓄电池低电压事件】 时间:%s 通道号:%d 剩余电量百分比:%d 事件动作(0:开始 1:停止):%d\n",
                        msg.stTime, msg.nChannelID, msg.nBatteryLeft, msg.nAction);
                break;
            }
            case NetSDKLib.NET_ALARM_ARMMODE_CHANGE_EVENT: // 设备布防模式变化事件
            {
                ALARM_ARMMODE_CHANGE_INFO msg = new ALARM_ARMMODE_CHANGE_INFO();
                ToolKits.GetPointerData(pStuEvent, msg);
                System.out.printf("【设备布防模式变化事件】 时间:%s 变化后的状态:%d ID号:%d 用户ID:%d\n",
                        msg.stuTime, msg.bArm, msg.dwID, msg.nUserCode);
                break;
            }
            case NetSDKLib.NET_ALARM_BYPASSMODE_CHANGE_EVENT: // 防区旁路状态变化事件
            {
                ALARM_BYPASSMODE_CHANGE_INFO msg = new ALARM_BYPASSMODE_CHANGE_INFO();
                ToolKits.GetPointerData(pStuEvent, msg);
                System.out.printf("【防区旁路状态变化事件】 时间:%s 通道号:%d 变化后的模式:%d ID号:%d \n",
                        msg.stuTime, msg.nChannelID, msg.dwID, msg.emMode);
                break;
            }
            case NetSDKLib.NET_ALARM_INPUT_SOURCE_SIGNAL: // 报警输入源信号事件
            {
                ALARM_INPUT_SOURCE_SIGNAL_INFO msg = new ALARM_INPUT_SOURCE_SIGNAL_INFO();
                ToolKits.GetPointerData(pStuEvent, msg);
                System.out.printf("【报警输入源信号事件】 时间:%s 通道号:%d 事件动作(0:开始 1:停止):%d \n",
                        msg.stuTime, msg.nChannelID, msg.nAction);
                break;
            }
            case NetSDKLib.NET_ALARM_ALARMCLEAR: // 消警事件
            {
                ALARM_ALARMCLEAR_INFO msg = new ALARM_ALARMCLEAR_INFO();
                ToolKits.GetPointerData(pStuEvent, msg);
                System.out.printf("【消警事件】 时间:%s 通道号:%d 事件动作(0表示脉冲事件,1表示持续性事件开始,2表示持续性事件结束):%d \n",
                        msg.stuTime, msg.nChannelID, msg.bEventAction);
                break;
            }
            case NetSDKLib.NET_ALARM_SUBSYSTEM_STATE_CHANGE: // 子系统状态改变事件
            {
                ALARM_SUBSYSTEM_STATE_CHANGE_INFO msg = new ALARM_SUBSYSTEM_STATE_CHANGE_INFO();
                ToolKits.GetPointerData(pStuEvent, msg);
                System.out.printf("【子系统状态改变事件】 时间:%s 子系统序号:%d 变化后的状态:%d \n", msg.stuTime, msg.nChannelID, msg.emState);
                break;
            }
            case NetSDKLib.NET_ALARM_MODULE_LOST: // 扩展模块掉线事件
            {
                ALARM_MODULE_LOST_INFO msg = new ALARM_MODULE_LOST_INFO();
                ToolKits.GetPointerData(pStuEvent, msg);
                System.out.printf("【扩展模块掉线事件】 时间:%s 扩展模块接的总线的序号:%d 掉线的扩展模块数目:%d 设备类型:%s 在线情况(0-不在线,1-在线):%d \n",
                        msg.stuTime, msg.nSequence, msg.nAddr, new String(msg.szDevType).trim(), msg.bOnline);
                break;
            }
            case NetSDKLib.NET_ALARM_PSTN_BREAK_LINE: // PSTN掉线事件
            {
                ALARM_PSTN_BREAK_LINE_INFO msg = new ALARM_PSTN_BREAK_LINE_INFO();
                ToolKits.GetPointerData(pStuEvent, msg);
                System.out.printf("【PSTN掉线事件】 时间:%s 电话线序号:%d 事件动作(0:开始 1:停止):%d \n",
                        msg.stuTime, msg.nChannelID, msg.nAction);
                break;
            }
            case NetSDKLib.NET_ALARM_KEYPAD_TAMPER: // 键盘防拆报警/恢复事件
            {
                ALARM_KEYPAD_TAMPER_INFO msg = new ALARM_KEYPAD_TAMPER_INFO();
                ToolKits.GetPointerData(pStuEvent, msg);
                System.out.printf("【键盘防拆报警/恢复事件】 时间:%s 电话线序号:%d 事件动作(0:开始 1:停止):%d \n",
                        msg.stuTime, msg.nChannelID, msg.nAction);
                break;
            }
            case NetSDKLib.NET_ALARM_DEFENCE_ARMMODE_CHANGE: // 防区布撤防状态改变事件
            {
                ALARM_DEFENCE_ARMMODECHANGE_INFO msg = new ALARM_DEFENCE_ARMMODECHANGE_INFO();
                ToolKits.GetPointerData(pStuEvent, msg);
                System.out.printf("【防区布撤防状态改变事件】 时间:%s 布撤防状态:%d 防区号:%d \n",
                        msg.stuTime, msg.emDefenceStatus, msg.nDefenceID);
                break;
            }
            case NetSDKLib.NET_ALARM_SUBSYSTEM_ARMMODE_CHANGE: // 子系统布撤防状态改变事件
            {
                ALARM_SUBSYSTEM_ARMMODECHANGE_INFO msg = new ALARM_SUBSYSTEM_ARMMODECHANGE_INFO();
                ToolKits.GetPointerData(pStuEvent, msg);
                System.out.printf("【子系统布撤防状态改变事件】 UTC:%s 布撤防状态:%d 子系统编号:%d \n",
                        msg.UTC, msg.emSubsystemMode, msg.nSubSystemID);
                break;
            }
            case NetSDKLib.NET_ALARM_SENSOR_ABNORMAL: // 探测器异常报警
            {
                ALARM_SENSOR_ABNORMAL_INFO msg = new ALARM_SENSOR_ABNORMAL_INFO();
                ToolKits.GetPointerData(pStuEvent, msg);
                System.out.printf("【探测器异常报警】 时间:%s 通道号:%d 探测器状态:%d 事件动作(0:开始 1:停止):%d \n",
                        msg.stuTime, msg.nChannelID, msg.emStatus, msg.nAction);
                break;
            }
            /************************************************************
             *                            通用事件                            *
             *************************************************************/
            case NetSDKLib.NET_ALARM_ALARM_EX2: // 本地报警事件
            {
                ALARM_ALARM_INFO_EX2 msg = new ALARM_ALARM_INFO_EX2();
                ToolKits.GetPointerData(pStuEvent, msg);
                System.out.printf("【本地报警事件】 时间:%s 通道号:%d 事件动作(0:开始 1:停止):%d \n",
                        msg.stuTime, msg.nChannelID, msg.nAction);
                break;
            }
            case NetSDKLib.NET_ALARM_CHASSISINTRUDED: // 防拆事件
            {
                ALARM_CHASSISINTRUDED_INFO msg = new ALARM_CHASSISINTRUDED_INFO();
                ToolKits.GetPointerData(pStuEvent, msg);
                System.out.printf("【防拆事件】 时间:%s 通道号:%d 事件动作(0:开始 1:停止):%d \n",
                        msg.stuTime, msg.nChannelID, msg.nAction);
                break;
            }
            case NetSDKLib.NET_ALARM_RCEMERGENCY_CALL: // 紧急呼叫报警事件
            {
                ALARM_RCEMERGENCY_CALL_INFO msg = new ALARM_RCEMERGENCY_CALL_INFO();
                ToolKits.GetPointerData(pStuEvent, msg);
                System.out.printf("【紧急呼叫报警事件】 时间:%s 紧急类型:%d 报警方式:%d 事件动作(-1:未知 0:开始 1:停止):%d \n",
                        msg.stuTime, msg.emType, msg.emMode, msg.nAction);
                break;
            }
            case NetSDKLib.NET_ALARM_CROWD_DETECTION: // 人群密度检测事件
            {
                ALARM_CROWD_DETECTION_INFO msg = new ALARM_CROWD_DETECTION_INFO();
                ToolKits.GetPointerData(pStuEvent, msg);
                System.out.printf("【人群密度检测事件】 UTC:%s 通道号:%d 事件动作(0表示脉冲事件,1表示持续性事件开始,2表示持续性事件结束):%d ",
                        msg.UTC, msg.nChannelID, msg.nEventAction);
                break;
            }
            /************************************************************
             *                            交通事件                            *
             *************************************************************/
            case NetSDKLib.NET_ALARM_TRAFFIC_XINKONG: // 交通态势报警事件
            {
                ALARM_TRAFFIC_XINKONG_INFO msg = new ALARM_TRAFFIC_XINKONG_INFO();
                ToolKits.GetPointerData(pStuEvent, msg);
                System.out.printf("【交通态势报警事件】 UTC:%s 通道号:%d 物理车道号:%d 车牌号:%s carID:%d carType:%d \n",
                        msg.UTC, msg.nChannelID, msg.stuLaneInfo[0].nLane
                        , new String(msg.stuLaneInfo[0].stuCoilsInfo[0].PlateNum).trim()
                        , msg.stuLaneInfo[0].stuCoilsInfo[0].nCarId
                        , msg.stuLaneInfo[0].stuCoilsInfo[0].emCarType);
                break;
            }
            /************************************************************
             *                      电警红绿灯状态                        *
             ************************************************************/
            case NetSDKLib.NET_ALARM_TRAFFIC_LIGHT_STATE: // 电警红绿灯状态事件
            {
                System.out.println("\n\n<Event> TRAFFIC [ ALARM TRAFFIC LIGHT STATE ]");
 
                ALARM_TRAFFIC_LIGHT_STATE_INFO msg = new ALARM_TRAFFIC_LIGHT_STATE_INFO();
                ToolKits.GetPointerData(pStuEvent, msg);
 
                StringBuilder builder = new StringBuilder();
                try {
                    builder.append("<<------门禁报警事件主要信息------>>").append("\n")
                            .append("nChannel 通道: ").append(msg.nChannelID).append("\n")
                            .append("nAction 事件状态(0:脉冲 1:开始 2:停止): ").append(msg.nAction).append("\n")
                            .append("szName 事件名称: ").append(new String(msg.szName, encode)).append("\n")
                            .append("PTS 时间戳: ").append(msg.PTS).append("\n")
                            .append("UTC 发生时间: ").append(msg.UTC).append("\n")
                            .append("nEventID 事件ID: ").append(msg.nEventID).append("\n")
                            .append("nSource 源地址: ").append(msg.nSource).append("\n")
                            .append("nFrameSequence 帧序号: ").append(msg.nFrameSequence).append("\n")
                            .append("emLightSource 红绿灯触发源: ").append(EM_TRFAFFIC_LIGHT_SOURCE.getNoteByValue(msg.emLightSource)).append("\n");
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
 
                builder.append("///->灯亮的持续时间组,共 ").append(msg.nLightPeriodsNum).append(" 组\n");
                for (int i = 0; i < msg.nLightPeriodsNum; i++) {
                    builder.append("<<-----[").append(i).append("]----->>").append("\n")
                            .append("emType 交通灯类型: ").append(EM_TRFAFFIC_LIGHT_TYPE.getNoteByValue(msg.stuLightPeriods[i].emType)).append("\n")
                            .append("nStraight 直行灯持续时间: ").append(msg.stuLightPeriods[i].nStraight).append("\n")
                            .append("nTurnLeft 左转灯持续时间: ").append(msg.stuLightPeriods[i].nTurnLeft).append("\n")
                            .append("nTurnRight 右转灯持续时间: ").append(msg.stuLightPeriods[i].nTurnRight).append("\n")
                            .append("nUTurn 掉头灯持续时间: ").append(msg.stuLightPeriods[i].nUTurn).append("\n");
                }
 
                builder.append("///->交通灯状态组,共 ").append(msg.nLightStateNum).append(" 组\n");
                for (int i = 0; i < msg.nLightStateNum; i++) {
                    builder.append("<<-----[").append(i).append("]----->>").append("\n")
                            .append("emStraightLightInfo 直行信号灯状态: ").append(NET_TRAFFIC_LIGHT_STATUS.getNoteByValue(msg.stuLightStates[i].emStraightLightInfo)).append("\n")
                            .append("emTurnLeftLightInfo 左转信号灯状态: ").append(NET_TRAFFIC_LIGHT_STATUS.getNoteByValue(msg.stuLightStates[i].emTurnLeftLightInfo)).append("\n")
                            .append("emTurnRightLightInfo 右转信号灯状态: ").append(NET_TRAFFIC_LIGHT_STATUS.getNoteByValue(msg.stuLightStates[i].emTurnRightLightInfo)).append("\n")
                            .append("emUTurnLightInfo 调头信号灯状态: ").append(NET_TRAFFIC_LIGHT_STATUS.getNoteByValue(msg.stuLightStates[i].emUTurnLightInfo)).append("\n");
                }
 
                System.out.println(builder.toString());
 
                break;
            }
            /**
             * 太阳能系统信息上报
             */
            case SDK_ALARM_Ex_TYPE.SDK_ALARM_SOLARCELL_SYSTEM_INFO: {
                /**
                 * 太阳能电池信息
                 */
                ALARM_SOLARCELL_SYSTEM_INFO info = new ALARM_SOLARCELL_SYSTEM_INFO();
                ToolKits.GetPointerData(pStuEvent, info);
 
                System.out.printf("太阳能电池信息: 脉冲:%d, 事件发生时间:%s,时间戳:%f", info.nAction, info.UTC.toStringTime(), info.PTS);
 
                System.out.printf("蓄电池信息: 电量百分比:%d,电压:%f,温度:%f,控制温度:%f",
                        info.stuBatteryInfo.nElectricityQuantityPercent,
                        info.stuBatteryInfo.fVoltage,
                        info.stuBatteryInfo.fTemperature,
                        info.stuBatteryInfo.fControllerTemper);
 
                System.out.printf("太阳能历史数据: 系统运行时间:%d,蓄电池总放电次数:%d,蓄电池总充满电次数:%d",
                        info.stuHistoryInfo.nSystemTotalRunDay,
                        info.stuHistoryInfo.nBatteryOverDischargeCount,
                        info.stuHistoryInfo.nBatteryTotalChargeCount);
 
                System.out.printf("太阳能板信息: 电压:%f,电流:%f,充电功率:%f",
                        info.stuSolarPanel.fVoltage,
                        info.stuSolarPanel.fElectricCurrent,
                        info.stuSolarPanel.fChargingPower);
                System.out.println("故障信息:");
                for (int i = 0; i < info.nSystemFault; i++) {
                    System.out.println(EM_SOLARCELL_SYSTEM_FAULT_TYPE.getSolarcellFaultType(info.emSystemFault[i]).getInfo());
                }
                break;
            }
 
            /**
             * 硬盘满警告信息,数据为1个字节,1为有硬盘满报警,0为无报警。
             */
            case SDK_ALARM_Ex_TYPE.SDK_DISKFULL_ALARM_EX: {
                byte[] info = new byte[1];
                pStuEvent.read(0, info, 0, info.length);
                System.out.println(info[0] == 1 ? "硬盘满报警" : "无硬盘报警");
                break;
            }
            /**
             * 硬盘故障
             */
            case SDK_ALARM_Ex_TYPE.SDK_DISKERROR_ALARM_EX: {
                byte[] info = new byte[32];
                pStuEvent.read(0, info, 0, info.length);
                for (int i = 0; i < info.length; i++) {
                    System.out.println("info[" + i + "]" + (info[i] == 1 ? "硬盘错误报警" : "无报警"));
                }
                break;
            }
            /**
             * 无硬盘报警
             */
            case SDK_ALARM_Ex_TYPE.SDK_ALARM_NO_DISK: {
                ALARM_NO_DISK_INFO info = new ALARM_NO_DISK_INFO();
                ToolKits.GetPointerData(pStuEvent, info);
                System.out.println("无硬盘报警-时间:" + info.stuTime.toString() + ",动作:" + (info.dwAction == 0 ? "开始" : (info.dwAction == 1 ? "停止" : "未知")));
                break;
            }
            /************************************************************
             *                      热成像测温点报警                       *
             ************************************************************/
            case NetSDKLib.NET_ALARM_HEATIMG_TEMPER: // 热成像测温点报警
            {
                System.out.println("\n\n<Event> THERMAL [ ALARM HEATIMG TEMPER ]");
 
                ALARM_HEATIMG_TEMPER_INFO msg = new ALARM_HEATIMG_TEMPER_INFO();
                ToolKits.GetPointerData(pStuEvent, msg);
 
                StringBuilder builder = new StringBuilder();
                try {
                    builder.append("<<------门禁报警事件主要信息------>>").append("\n")
                            .append("szName 温度异常点名称: ").append(new String(msg.szName, encode)).append("\n")
                            .append("nAlarmId 报警项编号: ").append(msg.nAlarmId).append("\n")
                            .append("nResult 报警结果值: ").append(NET_RADIOMETRY_RESULT.getNoteByValue(msg.nResult)).append("\n")
                            .append("nAlarmContion 报警条件: ").append(NET_RADIOMETRY_ALARMCONTION.getNoteByValue(msg.nAlarmContion)).append("\n")
                            .append("fTemperatureValue 报警温度值: ").append(msg.fTemperatureValue).append("\n")
                            .append("nTemperatureUnit 温度单位: ").append(msg.nTemperatureUnit == 1 ? "摄氏度" : (msg.nTemperatureUnit == 2 ? "华氏度" : "未知")).append("\n")
                            .append("nPresetID 预置点: ").append(msg.nPresetID).append("\n")
                            .append("nChannel 通道号: ").append(msg.nChannel).append("\n")
                            .append("nAction 事件状态: ").append(msg.nAction == 0 ? "开始" : (msg.nAction == 1 ? "停止" : "无意义")).append("\n")
                            .append("stuAlarmCoordinates 报警坐标Ex: ").append("\n");
                    for (int i = 0; i < msg.stuAlarmCoordinates.nPointNum; i++) {
                        builder.append(String.format("[%2d] (%4d, %4d)", i, msg.stuAlarmCoordinates.stuPoints[i].nx, msg.stuAlarmCoordinates.stuPoints[i].ny)).append("\n");
                    }
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
 
                System.out.println(builder.toString());
 
                break;
            }
            case NetSDKLib.NET_ALARM_HOTSPOT_WARNING: {
                System.out.println("\n\n<Event> THERMAL [ ALARM_HOTSPOT_WARNING ]");
 
                ALARM_HOTSPOT_WARNING_INFO msg = new ALARM_HOTSPOT_WARNING_INFO();
                ToolKits.GetPointerData(pStuEvent, msg);
 
                StringBuilder builder = new StringBuilder();
 
                builder.append("<<------门禁报警事件主要信息------>>").append("\n")
                        .append("fHotSpotValue 温度值: ").append(msg.nTemperatureUnit).append("\n")
                        .append("nChannel 通道号: ").append(msg.nChannelID).append("\n")
                        .append("nAction 事件状态: ").append(msg.nAction == 0 ? "开始" : (msg.nAction == 1 ? "停止" : "无意义")).append("\n")
                        .append("stuAlarmCoordinates 报警坐标Ex: ").append("\n");
 
 
                System.out.println(builder.toString());
                break;
            }
            case NetSDKLib.NET_ALARM_COLDSPOT_WARNING: {
                System.out.println("\n\n<Event> THERMAL [ ALARM_COLDSPOT_WARNING ]");
 
                ALARM_COLDSPOT_WARNING_INFO msg = new ALARM_COLDSPOT_WARNING_INFO();
                ToolKits.GetPointerData(pStuEvent, msg);
 
                StringBuilder builder = new StringBuilder();
 
                builder.append("<<------门禁报警事件主要信息------>>").append("\n")
                        .append("fHotSpotValue 温度值: ").append(msg.nTemperatureUnit).append("\n")
                        .append("nChannel 通道号: ").append(msg.nChannelID).append("\n")
                        .append("nAction 事件状态: ").append(msg.nAction == 0 ? "开始" : (msg.nAction == 1 ? "停止" : "无意义")).append("\n")
                        .append("stuAlarmCoordinates 报警坐标Ex: ").append("\n");
 
 
                System.out.println(builder.toString());
                break;
            }
            default:
                break;
        }
 
        return true;
    }
}