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
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
package com.netsdk.demo.customize;
 
import com.netsdk.demo.util.Testable;
import com.netsdk.lib.NetSDKLib;
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;
 
public class GetRemoteCamera implements Testable {
    
    static NetSDKLib netsdkApi     = NetSDKLib.NETSDK_INSTANCE;
    static NetSDKLib configApi     = NetSDKLib.CONFIG_INSTANCE;
 
    private LLong loginHandle = new LLong(0);
    
    private NetSDKLib.NET_DEVICEINFO_Ex deviceinfo = new NetSDKLib.NET_DEVICEINFO_Ex();
    
    private static class DisconnectCallback implements NetSDKLib.fDisConnect {
        private static DisconnectCallback instance = new DisconnectCallback();
        private DisconnectCallback() {}
        public static DisconnectCallback getInstance() { 
            return instance;
        }
        
        public void invoke(LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser){
            System.out.printf("Device[%s:%d] Disconnect!\n" , pchDVRIP , nDVRPort);
        }
    }
    
    private static class HaveReconnectCallback implements NetSDKLib.fHaveReConnect {
        private static HaveReconnectCallback instance = new HaveReconnectCallback();
        private HaveReconnectCallback() {}
        public static HaveReconnectCallback getInstance() { 
            return instance;
        }
        
        public void invoke(LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser){
            System.out.printf("Device[%s:%d] HaveReconnected!\n" , pchDVRIP , nDVRPort);
        }
    }
 
    @Override
    public void initTest() {
        //初始化SDK库
        netsdkApi.CLIENT_Init(DisconnectCallback.getInstance(), null);
        
        //设置断线自动重练功能
        netsdkApi.CLIENT_SetAutoReconnect(HaveReconnectCallback.getInstance(), null);
        
        // 向设备登入
        final int nSpecCap = 0; /// login device by TCP
        final String address = "172.32.5.130";
        final int port = 37777;
        final String usrname = "admin";
        final String password = "admin123";
           IntByReference nError = new IntByReference(0);
        
        loginHandle = netsdkApi.CLIENT_LoginEx2(address, port, usrname , 
                password, nSpecCap, null, deviceinfo, nError);
        if(loginHandle.longValue() == 0)
        {
            System.err.printf("Login Device [%s:%d] Failed ! Last Error[%x]\n", address, port, netsdkApi.CLIENT_GetLastError());
            return;
        }
 
        System.out.printf("Login Device [%s:%d] Success. \n", address, port);        
    }
 
    @Override
    public void runTest() {
        if(loginHandle.longValue() == 0) {
            System.err.println("请先登录设备!");
            return;
        }
        
        // 获取远程设备的信息
        GetMatrixCamerasInfo();
        
        // 获取摄像机通道状态
        QueryChannelState();
    }
 
    @Override
    public void endTest() {
        if( loginHandle.longValue() != 0) {
            netsdkApi.CLIENT_Logout(loginHandle);
            loginHandle.setValue(0);
        }
        
        /// 清理资源, 只需调用一次
        netsdkApi.CLIENT_Cleanup();
        
        System.out.println("See You...");
    }
    
    // 获取远程设备的信息
    public void GetMatrixCamerasInfo () {    
        int cameraCount = deviceinfo.byChanNum;  // 通道号个数
        NetSDKLib.NET_MATRIX_CAMERA_INFO[]  cameraInfo = new NetSDKLib.NET_MATRIX_CAMERA_INFO[cameraCount];
        for(int i = 0; i < cameraCount; i++) {
            cameraInfo[i] = new NetSDKLib.NET_MATRIX_CAMERA_INFO();
        }
        
        // 入参
        NetSDKLib.NET_IN_MATRIX_GET_CAMERAS inMatrix = new NetSDKLib.NET_IN_MATRIX_GET_CAMERAS();
        
        // 出参
        NetSDKLib.NET_OUT_MATRIX_GET_CAMERAS outMatrix = new NetSDKLib.NET_OUT_MATRIX_GET_CAMERAS();
        outMatrix.nMaxCameraCount = cameraCount;
        outMatrix.pstuCameras = new Memory(cameraInfo[0].size() * cameraCount);
        outMatrix.pstuCameras.clear(cameraInfo[0].size() * cameraCount);
        
        ToolKits.SetStructArrToPointerData(cameraInfo, outMatrix.pstuCameras);  // 将数组内存拷贝到Pointer
        
        if(netsdkApi.CLIENT_MatrixGetCameras(loginHandle, inMatrix, outMatrix, 5000)) {
            ToolKits.GetPointerDataToStructArr(outMatrix.pstuCameras, cameraInfo);  // 将 Pointer 的内容 输出到   数组
            
            for(int j = 0; j < outMatrix.nRetCameraCount; j++) {
                if(cameraInfo[j].bRemoteDevice == 0) {   // 过滤远程设备
                    continue;
                }
                System.out.println("通道号:" + cameraInfo[j].nChannelID);
                System.out.println("IP : " + new String(cameraInfo[j].stuRemoteDevice.szIp).trim());
                System.out.println("nPort : " + cameraInfo[j].stuRemoteDevice.nPort);
                System.out.println("szUser : " + new String(cameraInfo[j].stuRemoteDevice.szUser).trim());
                System.out.println("szPwd : " + new String(cameraInfo[j].stuRemoteDevice.szPwd).trim());
                System.out.println("通道个数 : " + cameraInfo[j].stuRemoteDevice.nVideoInputChannels);
            }
        } else {
            System.err.println("MatrixGetCameras Failed." + ToolKits.getErrorCode());
        }
    }
    
    // 获取摄像机通道状态
    private void QueryChannelState() {
        int nQueryType = NetSDKLib.NET_QUERY_GET_CAMERA_STATE;
        
        // 入参
        NET_IN_GET_CAMERA_STATEINFO stIn = new NET_IN_GET_CAMERA_STATEINFO();
        stIn.bGetAllFlag = 1; // 1-true,查询所有摄像机状态
        
        // 摄像机通道信息
        int chnCount = deviceinfo.byChanNum;  // 通道个数
        NET_CAMERA_STATE_INFO[] cameraInfo = new NET_CAMERA_STATE_INFO[chnCount];
        for(int i = 0; i < chnCount; i++) {
            cameraInfo[i] = new NET_CAMERA_STATE_INFO();
        }
        
        // 出参
        NET_OUT_GET_CAMERA_STATEINFO stOut = new NET_OUT_GET_CAMERA_STATEINFO();
        stOut.nMaxNum = chnCount;
        stOut.pCameraStateInfo = new Memory(cameraInfo[0].size() * chnCount);
        stOut.pCameraStateInfo.clear(cameraInfo[0].size() * chnCount);
        
        ToolKits.SetStructArrToPointerData(cameraInfo, stOut.pCameraStateInfo);  // 将数组内存拷贝到Pointer
        
        stIn.write();
        stOut.write();
        boolean bRet = netsdkApi.CLIENT_QueryDevInfo(loginHandle, nQueryType, stIn.getPointer(), stOut.getPointer(), null, 3000);
        stIn.read();
        stOut.read();
        
        if(bRet) {
            ToolKits.GetPointerDataToStructArr(stOut.pCameraStateInfo, cameraInfo);  // 将 Pointer 的内容 输出到   数组
            
            System.out.println("查询到的摄像机通道状态有效个数:" + stOut.nValidNum);
            
            for(int i = 0; i < stOut.nValidNum; i++) {
                System.out.println("通道号:" + cameraInfo[i].nChannel);
                System.out.println("连接状态:" + getChannelState(cameraInfo[i].emConnectionState));   
            }
        } else {
            System.err.println("QueryDev Failed!" + ToolKits.getErrorCode());
        }
    }
    
    // 通道状态对应关系
    private String getChannelState(int state) {
        String channelState = "";
        switch (state) {
        case EM_CAMERA_STATE_TYPE.EM_CAMERA_STATE_TYPE_UNKNOWN:
            channelState = "未知";
            break;
        case EM_CAMERA_STATE_TYPE.EM_CAMERA_STATE_TYPE_CONNECTING:
            channelState = "正在连接";
            break;
        case EM_CAMERA_STATE_TYPE.EM_CAMERA_STATE_TYPE_CONNECTED:
            channelState = "已连接";
            break;
        case EM_CAMERA_STATE_TYPE.EM_CAMERA_STATE_TYPE_UNCONNECT:
            channelState = "未连接";
            break;
        case EM_CAMERA_STATE_TYPE.EM_CAMERA_STATE_TYPE_EMPTY:
            channelState = "未连接";
            break;
        case EM_CAMERA_STATE_TYPE.EM_CAMERA_STATE_TYPE_DISABLE:
            channelState = "通道未配置,无信息";
            break;
        default:
            channelState = "通道有配置,但被禁用";
            break;
        }
        return channelState;
    }
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        GetRemoteCamera cameras = new GetRemoteCamera();
        
        cameras.initTest();
        
        cameras.runTest();
        
        cameras.endTest();
 
    }
 
}