1
zhanghua
2024-09-26 c775c6953d9759e70f08acbfa8f6d7490aaae3d1
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
package com.netsdk.demo.customize.courseRecord;
 
import com.netsdk.lib.NetSDKLib;
import com.netsdk.lib.ToolKits;
import com.sun.jna.Memory;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
 
import static com.netsdk.lib.NetSDKLib.NET_DEVSTATE_SOFTWARE;
import static com.netsdk.lib.Utils.getOsPrefix;
 
/**
 * 这里写一些特殊操作用的接口
 *
 * @author : 47040
 * @since : Created in 2020/9/30 10:45
 */
public class TestCourseRecordStatus {
 
    // The constant net sdk
    public static final NetSDKLib netsdk = NetSDKLib.NETSDK_INSTANCE;
 
    // The constant config sdk.
    public static final NetSDKLib configsdk = NetSDKLib.CONFIG_INSTANCE;
 
    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";
        }
    }
 
    /**
     * 获取设备软件版本
     *
     * @param lLoginID 登录句柄
     */
    public void QueryDevDeviceVersionStateTest(NetSDKLib.LLong lLoginID) {
        NetSDKLib.NETDEV_VERSION_INFO info = new NetSDKLib.NETDEV_VERSION_INFO();
        info.write();
        boolean bRet = netsdk.CLIENT_QueryDevState(lLoginID, NET_DEVSTATE_SOFTWARE, info.getPointer(), info.size(), new IntByReference(0), 3000);
        if (!bRet) {
            System.err.println("QueryDevState DEV STATE of SOFTWARE failed: " + ToolKits.getErrorCode());
            return;
        }
        info.read();
        System.out.println("QueryDevState DEV STATE of SOFTWARE succeed");
 
        System.out.println("szSoftWareVersion 软件版本: " + new String(info.szSoftWareVersion).trim());
        System.out.println("szDevSerialNo 序列号: " + new String(info.szDevSerialNo).trim());
        int buildData = info.dwSoftwareBuildDate;
        int day = buildData & 0xff;
        buildData >>= 8;
        int month = buildData & 0xff;
        int year = buildData >> 8;
        System.out.println("BuildData 编译日期: " + year + "-" + month + "-" + day);
    }
 
    /**
     * 查询设备在线状态
     *
     * @param lLoginID 登录句柄
     */
    public void QueryOnlineStateTest(NetSDKLib.LLong lLoginID) {
 
        Pointer p = new Memory(Integer.SIZE);
        p.clear(Integer.SIZE);
        boolean ret = netsdk.CLIENT_QueryDevState(lLoginID, NetSDKLib.NET_DEVSTATE_ONLINE, p, Integer.SIZE, new IntByReference(0), 3000);
        if (!ret) {
            System.err.println("查询设备在线状态失败, " + ToolKits.getErrorCode());
            return;
        }
        int[] buffer = new int[1];
        p.read(0, buffer, 0, 1);
        // 1 表示在线, 0 表示断线
        System.out.println(buffer[0] == 1 ? "设备在线" : "设备断线");
    }
 
    /**
     * 查询硬盘状态
     */
    public boolean QueryHardDiskStateTest(NetSDKLib.LLong m_hLoginHandle) {
        IntByReference intRetLen = new IntByReference();
        NetSDKLib.NET_DEV_HARDDISK_STATE diskInfo = new NetSDKLib.NET_DEV_HARDDISK_STATE();
        if (netsdk.CLIENT_QueryDevState(m_hLoginHandle,
                NetSDKLib.NET_DEVSTATE_DISK,
                diskInfo.getPointer(),
                diskInfo.size(),
                intRetLen,
                5000)) {
            diskInfo.read();
 
            String[] diskType = {"读写驱动器", "只读驱动器", "备份驱动器或媒体驱动器", "冗余驱动器", "快照驱动器"};
            String[] diskStatus = {"休眠", "活动", "故障"};
            String[] diskSignal = {"本地", "远程"};
            for (int i = 0; i < diskInfo.dwDiskNum; ++i) {
                System.out.printf("硬盘[%d] 硬盘号:%d 分区号:%d 容量:%dMB 剩余空间:%dMB 标识:%s 类型:%s 状态:%s \n",
                        i + 1, diskInfo.stDisks[i].bDiskNum, diskInfo.stDisks[i].bSubareaNum,
                        diskInfo.stDisks[i].dwVolume, diskInfo.stDisks[i].dwFreeSpace, diskSignal[diskInfo.stDisks[i].bSignal],
                        diskType[(diskInfo.stDisks[i].dwStatus & 0xF0) >> 4], diskStatus[diskInfo.stDisks[i].dwStatus & 0x0F]);
            }
        } else {
            System.err.println("Query Hard Disk State Failed!" + ToolKits.getErrorCode());
            return false;
        }
        return true;
    }
 
    /**
     * 获取录播主机所有配置的前端摄像头连接状态
     *
     * @param m_hLoginHandle 登录句柄
     * @param chanNum        设备总通道数
     */
    public boolean QueryCameraStateTest(NetSDKLib.LLong m_hLoginHandle, int chanNum) {
 
        NetSDKLib.NET_CAMERA_STATE_INFO[] arrCameraStatus = new NetSDKLib.NET_CAMERA_STATE_INFO[chanNum];
        for (int i = 0; i < arrCameraStatus.length; i++) {
            arrCameraStatus[i] = new NetSDKLib.NET_CAMERA_STATE_INFO();
        }
 
        // 入参
        NetSDKLib.NET_IN_GET_CAMERA_STATEINFO stIn = new NetSDKLib.NET_IN_GET_CAMERA_STATEINFO();
        stIn.bGetAllFlag = 1; // 全部
 
        // 出参
        NetSDKLib.NET_OUT_GET_CAMERA_STATEINFO stOut = new NetSDKLib.NET_OUT_GET_CAMERA_STATEINFO();
        stOut.nMaxNum = chanNum;
        stOut.pCameraStateInfo = new Memory(arrCameraStatus[0].size() * chanNum);
        stOut.pCameraStateInfo.clear(arrCameraStatus[0].size() * chanNum);
        ToolKits.SetStructArrToPointerData(arrCameraStatus, stOut.pCameraStateInfo);  // 将数组内存拷贝到Pointer
 
        stIn.write();
        stOut.write();
 
        boolean bRet = netsdk.CLIENT_QueryDevInfo(m_hLoginHandle, NetSDKLib.NET_QUERY_GET_CAMERA_STATE,
                stIn.getPointer(), stOut.getPointer(), null, 3000);
        if (bRet) {
            stOut.read();
            ToolKits.GetPointerDataToStructArr(stOut.pCameraStateInfo, arrCameraStatus);  // 将Pointer拷贝到数组内存
            final String[] connectionState = {"未知", "正在连接", "已连接", "未连接", "通道未配置,无信息", "通道有配置,但被禁用"};
            // 注意: 前6个通道无法配置前端摄像头,真实通道也是设备内部的通道
            // 另外sdk通道从0开始计数,设备却是从1开始的
            for (int i = 6; i < stOut.nValidNum; ++i) {
                System.out.printf("真实通道[%2d]: %s \n",
                        arrCameraStatus[i].nChannel + 1,  // 为了和网页端一致,这里 +1
                        connectionState[arrCameraStatus[i].emConnectionState]);
            }
 
        } else {
            System.err.println("Query Camera State Failed!" + ToolKits.getErrorCode());
        }
 
        return bRet;
    }
}