package com.netsdk.demo.customize;
|
|
import java.io.File;
|
import java.io.UnsupportedEncodingException;
|
|
import com.netsdk.demo.util.CaseMenu;
|
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 MatrixCameras {
|
static NetSDKLib netsdkApi = NetSDKLib.NETSDK_INSTANCE;
|
static NetSDKLib configApi = NetSDKLib.CONFIG_INSTANCE;
|
|
private NetSDKLib.NET_DEVICEINFO_Ex deviceinfo = new NetSDKLib.NET_DEVICEINFO_Ex();
|
private LLong loginHandle = new LLong(0); //登陆句柄
|
|
// 设备断线回调: 通过 CLIENT_Init 设置该回调函数,当设备出现断线时,SDK会调用该函数
|
public class fDisConnectCB implements NetSDKLib.fDisConnect{
|
public void invoke(LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser){
|
System.out.printf("Device[%s] Port[%d] Disconnect!\n" , pchDVRIP , nDVRPort);
|
}
|
}
|
|
// 网络连接恢复,设备重连成功回调
|
// 通过 CLIENT_SetAutoReconnect 设置该回调函数,当已断线的设备重连成功时,SDK会调用该函数
|
public class HaveReConnect implements NetSDKLib.fHaveReConnect {
|
public void invoke(LLong loginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) {
|
System.out.printf("ReConnect Device[%s] Port[%d]\n", pchDVRIP, nDVRPort);
|
}
|
}
|
|
private fDisConnectCB m_DisConnectCB = new fDisConnectCB();
|
private HaveReConnect haveReConnect = new HaveReConnect();
|
|
public void EndTest()
|
{
|
System.out.println("End Test");
|
if( loginHandle.longValue() != 0)
|
{
|
netsdkApi.CLIENT_Logout(loginHandle);
|
}
|
System.out.println("See You...");
|
|
netsdkApi.CLIENT_Cleanup();
|
System.exit(0);
|
}
|
|
public void InitTest()
|
{
|
//初始化SDK库
|
netsdkApi.CLIENT_Init(m_DisConnectCB, null);
|
|
// 设置断线重连回调接口,设置过断线重连成功回调函数后,当设备出现断线情况,SDK内部会自动进行重连操作
|
// 此操作为可选操作,但建议用户进行设置
|
netsdkApi.CLIENT_SetAutoReconnect(haveReConnect, null);
|
|
//设置登录超时时间和尝试次数,可选
|
int waitTime = 5000; //登录请求响应超时时间设置为5S
|
int tryTimes = 3; //登录时尝试建立链接3次
|
netsdkApi.CLIENT_SetConnectTime(waitTime, tryTimes);
|
|
// 设置更多网络参数,NET_PARAM的nWaittime,nConnectTryNum成员与CLIENT_SetConnectTime
|
// 接口设置的登录设备超时时间和尝试次数意义相同,可选
|
NetSDKLib.NET_PARAM netParam = new NetSDKLib.NET_PARAM();
|
netParam.nConnectTime = 10000; //登录时尝试建立链接的超时时间
|
netsdkApi.CLIENT_SetNetworkParam(netParam);
|
|
// 打开日志,可选
|
NetSDKLib.LOG_SET_PRINT_INFO setLog = new NetSDKLib.LOG_SET_PRINT_INFO();
|
|
File path = new File(".");
|
String logPath = path.getAbsoluteFile().getParent() + "\\sdk_log\\" + System.currentTimeMillis() + ".log";
|
|
setLog.bSetFilePath = 1;
|
System.arraycopy(logPath.getBytes(), 0, setLog.szLogFilePath, 0, logPath.getBytes().length);
|
|
setLog.bSetPrintStrategy = 1;
|
setLog.nPrintStrategy = 0;
|
boolean bLogopen = netsdkApi.CLIENT_LogOpen(setLog);
|
if (!bLogopen) {
|
System.err.println("Failed to open NetSDK log !!!");
|
}
|
|
// 向设备登入
|
int nSpecCap = 0;
|
Pointer pCapParam = null;
|
IntByReference nError = new IntByReference(0);
|
loginHandle = netsdkApi.CLIENT_LoginEx2(m_strIp, m_nPort, m_strUser ,
|
m_strPassword ,nSpecCap,pCapParam, deviceinfo,nError);
|
|
if(loginHandle.longValue() != 0) {
|
System.out.printf("Login Device[%s] Port[%d]Success!\n" , m_strIp , m_nPort);
|
}
|
else {
|
System.out.printf("Login Device[%s] Port[%d]Failed! %s\n" , m_strIp , m_nPort , ToolKits.getErrorCode());
|
EndTest();
|
}
|
}
|
|
/**
|
* 获取所有有效显示源
|
* @throws UnsupportedEncodingException
|
*/
|
public void MatrixGetCameras () throws UnsupportedEncodingException {
|
// 显示源信息数组初始化
|
int nCameraCount = 60;
|
int nMaxVideoInputCount = 10; //视频输入通道最大数
|
NET_MATRIX_CAMERA_INFO[] cameras = new NET_MATRIX_CAMERA_INFO[nCameraCount];
|
// 视频输入通道信息数组初始化
|
NetSDKLib.NET_VIDEO_INPUTS[] inputs= new NetSDKLib.NET_VIDEO_INPUTS[nMaxVideoInputCount];
|
for (int j = 0; j < nMaxVideoInputCount; j++) {
|
inputs[j] = new NetSDKLib.NET_VIDEO_INPUTS();
|
}
|
for(int i = 0; i < nCameraCount; i++) {
|
NetSDKLib.NET_MATRIX_CAMERA_INFO camera = new NetSDKLib.NET_MATRIX_CAMERA_INFO();
|
NetSDKLib.NET_REMOTE_DEVICE device = new NetSDKLib.NET_REMOTE_DEVICE();
|
device.nMaxVideoInputCount = nMaxVideoInputCount;// 视频输入通道最大数
|
device.pstuVideoInputs = new Memory(inputs[0].size() * nMaxVideoInputCount);
|
device.pstuVideoInputs.clear(inputs[0].size() * nMaxVideoInputCount);
|
// 将数组内存拷贝到Pointer
|
ToolKits.SetStructArrToPointerData(inputs, device.pstuVideoInputs);
|
camera.stuRemoteDevice = device;
|
cameras[i] = camera;
|
}
|
|
/*
|
* 入参
|
*/
|
NetSDKLib.NET_IN_MATRIX_GET_CAMERAS stuIn = new NetSDKLib.NET_IN_MATRIX_GET_CAMERAS();
|
|
/*
|
* 出参
|
*/
|
NET_OUT_MATRIX_GET_CAMERAS stuOut = new NET_OUT_MATRIX_GET_CAMERAS();
|
stuOut.nMaxCameraCount = nCameraCount;
|
stuOut.pstuCameras = new Memory(cameras[0].size() * nCameraCount);
|
stuOut.pstuCameras.clear(cameras[0].size() * nCameraCount);
|
|
ToolKits.SetStructArrToPointerData(cameras, stuOut.pstuCameras); // 将数组内存拷贝到Pointer
|
|
if(netsdkApi.CLIENT_MatrixGetCameras(loginHandle, stuIn, stuOut, 5000)) {
|
ToolKits.GetPointerDataToStructArr(stuOut.pstuCameras, cameras); // 将 Pointer 的内容 输出到 数组
|
|
for(int j = 0; j < stuOut.nRetCameraCount; j++) {
|
if(cameras[j].bRemoteDevice == 0) {
|
System.out.println("NVR通道号:" + cameras[j].nUniqueChannel);
|
System.out.println("前端通道号(远程设备):" + cameras[j].nChannelID);
|
System.out.println("设备ID : " + new String(cameras[j].szDevID).trim());
|
//System.out.println("IP : " + new String(cameras[j].stuRemoteDevice.szIp).trim());
|
//System.out.println("nPort : " + cameras[j].stuRemoteDevice.nPort);
|
//System.out.println("szUser : " + new String(cameras[j].stuRemoteDevice.szUser).trim());
|
//System.out.println("szPwd : " + new String(cameras[j].stuRemoteDevice.szPwd).trim());
|
System.out.println("通道个数 : " + cameras[j].stuRemoteDevice.nVideoInputChannels + "\n");
|
} else {
|
System.out.println("NVR通道号:" + cameras[j].nUniqueChannel);
|
System.out.println("前端通道号(远程设备):" + cameras[j].nChannelID);
|
System.out.println("设备ID : " + new String(cameras[j].szDevID).trim());
|
System.out.println("设备类型 : " + new String(cameras[j].stuRemoteDevice.szDevClass).trim());
|
System.out.println("设备序列号 : " + new String(cameras[j].stuRemoteDevice.szSerialNo).trim());
|
System.out.println("实际返回通道个数 : " + cameras[j].stuRemoteDevice.nRetVideoInputCount);
|
ToolKits.GetPointerDataToStructArr(cameras[j].stuRemoteDevice.pstuVideoInputs, inputs); // 将 Pointer 的内容 输出到 数组
|
for (int i = 0; i < cameras[j].stuRemoteDevice.nRetVideoInputCount; i++) {
|
System.out.println("使能:"+inputs[i].bEnable);
|
System.out.println("通道名称:"+new String(inputs[i].szChnName,"GBK"));
|
System.out.println("控制ID:"+new String(inputs[i].szControlID));
|
System.out.println("主码流url地址:"+new String(inputs[i].szMainStreamUrl)+"\n");
|
}
|
}
|
}
|
} else {
|
System.err.println("获取所有有效显示源失败!" + ToolKits.getErrorCode());
|
}
|
}
|
|
/**
|
* 设置显示源
|
*/
|
public void MatrixSetCameras() {
|
// 设置的显示源个数
|
int nCameraCount = 1;
|
|
// 显示源信息数组初始化
|
NET_MATRIX_CAMERA_INFO[] cameras = new NET_MATRIX_CAMERA_INFO[nCameraCount];
|
for(int i = 0; i < nCameraCount; i++) {
|
cameras[i] = new NET_MATRIX_CAMERA_INFO();
|
}
|
|
cameras[0].nUniqueChannel = 0;
|
cameras[0].nChannelID = 0; // 通道号
|
|
/*
|
* 入参
|
*/
|
NET_IN_MATRIX_SET_CAMERAS stuIn = new NET_IN_MATRIX_SET_CAMERAS();
|
stuIn.nCameraCount = nCameraCount;
|
stuIn.pstuCameras = new Memory(cameras[0].size() * nCameraCount);
|
stuIn.pstuCameras.clear(cameras[0].size() * nCameraCount);
|
|
ToolKits.SetStructArrToPointerData(cameras, stuIn.pstuCameras); // 将数组内存拷贝到Pointer
|
|
/*
|
* 出参
|
*/
|
NET_OUT_MATRIX_SET_CAMERAS stuOut = new NET_OUT_MATRIX_SET_CAMERAS();
|
|
if(netsdkApi.CLIENT_MatrixSetCameras(loginHandle, stuIn, stuOut, 5000)) {
|
System.out.println("设置显示源成功!");
|
} else {
|
System.err.println("设置显示源失败!" + ToolKits.getErrorCode());
|
}
|
}
|
|
|
public void GetRemoteDevice() {
|
int nChnCount = deviceinfo.byChanNum;
|
NetSDKLib.AV_CFG_RemoteDevice deviceInfo[] = new NetSDKLib.AV_CFG_RemoteDevice[nChnCount];
|
for (int i = 0; i < nChnCount; ++ i) {
|
deviceInfo[i] = new NetSDKLib.AV_CFG_RemoteDevice();
|
}
|
|
/// 获取服务器所有远程设备的信息
|
int realCount = ToolKits.GetDevConfig(loginHandle, -1, NetSDKLib.CFG_CMD_REMOTEDEVICE, deviceInfo);
|
System.out.println("个数:" + realCount);
|
if(realCount < 1) {
|
return;
|
}
|
|
for(int i = 0; i < realCount; ++ i)
|
{
|
try {
|
String remoteInfoString = "用户名: " + new String(deviceInfo[i].szUser).trim() + "\n"
|
+ "密码: " + new String(deviceInfo[i].szPassword).trim() + "\n"
|
+ "设备IP:" + new String(deviceInfo[i].szIP).trim() + "\n"
|
+ "设备Port:" + deviceInfo[i].nPort + "\n"
|
+ "设备名称:" + new String(deviceInfo[i].szName, "GBK").trim() + "\n"
|
+ "部署地点: " + new String(deviceInfo[i].szAddress, "GBK").trim() + "\n"
|
+ "设备类型:" + new String(deviceInfo[i].szDevClass).trim() + "\n"
|
+ "设备型号:" + new String(deviceInfo[i].szDevType).trim();
|
|
System.out.println(remoteInfoString);
|
} catch (UnsupportedEncodingException e) {
|
e.printStackTrace();
|
}
|
}
|
}
|
|
|
////////////////////////////////////////////////////////////////
|
// 登陆信息
|
String m_strIp = "172.32.103.250";
|
int m_nPort = 37777;
|
String m_strUser = "admin";
|
String m_strPassword = "admin123";
|
////////////////////////////////////////////////////////////////
|
|
public void RunTest()
|
{
|
System.out.println("Run Test");
|
CaseMenu menu = new CaseMenu();
|
|
menu.addItem(new CaseMenu.Item(this , "获取远程设备信息" , "GetRemoteDevice"));
|
|
menu.addItem(new CaseMenu.Item(this , "获取所有有效显示源" , "MatrixGetCameras"));
|
menu.addItem(new CaseMenu.Item(this , "设置显示源" , "MatrixSetCameras"));
|
|
menu.run();
|
}
|
|
public static void main(String[]args)
|
{
|
MatrixCameras demo = new MatrixCameras();
|
demo.InitTest();
|
demo.RunTest();
|
demo.EndTest();
|
}
|
}
|