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