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();
|
|
}
|
|
}
|