package com.netsdk.demo.customize; import com.alibaba.fastjson.JSONObject; import com.netsdk.demo.util.CaseMenu; import com.netsdk.lib.NetSDKLib; import com.netsdk.lib.ToolKits; import com.netsdk.lib.callback.impl.DefaultDisconnectCallback; import com.netsdk.lib.callback.impl.DefaultHaveReconnectCallBack; import com.netsdk.lib.constant.SDKStructureFieldLenth; import com.netsdk.lib.enumeration.EM_NEW_CONFIG; import com.netsdk.lib.enumeration.EM_NEW_QUERY_SYSTEM_INFO; import com.netsdk.lib.enumeration.NET_EM_CFG_OPERATE_TYPE; import com.netsdk.lib.structure.*; import com.netsdk.module.BaseModule; import com.netsdk.module.ConfigModule; import com.netsdk.module.entity.DeviceInfo; import com.sun.jna.Memory; import static com.netsdk.lib.enumeration.EM_NEW_CONFIG.CFG_CMD_ACCESS_GENERAL; /** * 设备配置 demo * * @author 47081 47040 * @version 1.0 * @since 2020/10/20 */ public class ConfigDemo { private final NetSDKLib netSdkApi = NetSDKLib.NETSDK_INSTANCE; /** 二次封装模块,包含一些基础接口 */ private final BaseModule baseModule; /** 二次封装模块,包含一些设备配置的接口 */ private final ConfigModule configModule; private long loginHandler; public ConfigDemo() { baseModule = new BaseModule(netSdkApi); configModule = new ConfigModule(netSdkApi); } public static void main(String[] args) { String ip = "10.35.176.108"; int port = 37777; String username = "admin"; String password = "admin"; ConfigDemo demo = new ConfigDemo(); demo.init(); if (demo.login(ip, port, username, password)) { demo.run(); } demo.logout(); demo.clean(); } /** sdk初始化 */ public boolean init() { return baseModule.init( DefaultDisconnectCallback.getINSTANCE(), DefaultHaveReconnectCallBack.getINSTANCE(), true); } /** 释放sdk资源 */ public void clean() { baseModule.clean(); } /** * 登录设备 * * @param ip 设备ip * @param port 设备端口 * @param username 用户名 * @param password 密码 * @return 登录是否成功 */ public boolean login(String ip, int port, String username, String password) { DeviceInfo info = baseModule.login(ip, port, username, password); loginHandler = info.getLoginHandler(); return loginHandler != 0; } /** * 登出 * * @return 登出是否成功 */ public boolean logout() { return baseModule.logout(loginHandler); } /** 休眠策略配置 */ public void getandSetSleepingControl() { NET_CFG_SLEEPING_CONTROL_INFO config = new NET_CFG_SLEEPING_CONTROL_INFO(); config = (NET_CFG_SLEEPING_CONTROL_INFO) configModule.getConfig( loginHandler, NET_EM_CFG_OPERATE_TYPE.NET_EM_CFG_SLEEPING_CONTROL, config, 0); if (config != null) { System.out.println("GetConfig-NET_EM_CFG_SLEEPING_CONTROL success"); System.out.println(config.toString()); config.bEnable = (config.bEnable > 0) ? 0 : 1; if(configModule.setConfig( loginHandler, NET_EM_CFG_OPERATE_TYPE.NET_EM_CFG_SLEEPING_CONTROL, config, 0)){ System.out.println("SetConfig-NET_EM_CFG_SLEEPING_CONTROL success"); } else { System.out.println("SetConfig-NET_EM_CFG_SLEEPING_CONTROL fail"); } } else { System.out.println("GetConfig-NET_EM_CFG_SLEEPING_CONTROL fail"); } } /** * 下发假日组配置 * * @return 下发是否成功 */ public boolean setSpecialDayGroup() { NET_CFG_ACCESSCTL_SPECIALDAY_GROUP_INFO config = new NET_CFG_ACCESSCTL_SPECIALDAY_GROUP_INFO(); config.bGroupEnable = true; config.nSpeciaday = 2; // byte[]赋值请使用System.arraycopy() System.arraycopy("test".getBytes(), 0, config.szGroupName, 0, "test".getBytes().length); System.arraycopy( "test1".getBytes(), 0, config.stuSpeciaday[0].szDayName, 0, "test1".getBytes().length); config.stuSpeciaday[0].stuStartTime = new NET_TIME(2020, 10, 19, 0, 0, 0); config.stuSpeciaday[0].stuEndTime = new NET_TIME(2020, 10, 21, 23, 59, 59); config.stuSpeciaday[1].szDayName = "test2".getBytes(); System.arraycopy( "test2".getBytes(), 0, config.stuSpeciaday[1].szDayName, 0, "test2".getBytes().length); config.stuSpeciaday[1].stuStartTime = new NET_TIME(2020, 10, 22, 10, 10, 10); config.stuSpeciaday[1].stuEndTime = new NET_TIME(2020, 10, 23, 12, 0, 0); return configModule.setConfig( loginHandler, NET_EM_CFG_OPERATE_TYPE.NET_EM_CFG_ACCESSCTL_SPECIALDAY_GROUP, config, 0); } /** 获取假日组配置 */ public void getSpecialDayGroup() { NET_CFG_ACCESSCTL_SPECIALDAY_GROUP_INFO config = new NET_CFG_ACCESSCTL_SPECIALDAY_GROUP_INFO(); config = (NET_CFG_ACCESSCTL_SPECIALDAY_GROUP_INFO) configModule.getConfig( loginHandler, NET_EM_CFG_OPERATE_TYPE.NET_EM_CFG_ACCESSCTL_SPECIALDAY_GROUP, config, 0); if (config != null) { System.out.println(config.toString()); } } /** 下发假日计划 */ public void setSpecialDaysSchedule() { NET_CFG_ACCESSCTL_SPECIALDAYS_SCHEDULE_INFO config = new NET_CFG_ACCESSCTL_SPECIALDAYS_SCHEDULE_INFO(); System.arraycopy( "scheduleName".getBytes(), 0, config.szSchduleName, 0, "scheduleName".getBytes().length); // 计划使能 config.bSchdule = true; // 假日组的下标,NET_CFG_ACCESSCTL_SPECIALDAY_GROUP_INFO中stuSpeciaday的下标 config.nGroupNo = 1; // 时间段 config.nTimeSection = 2; config.stuTimeSection[0].setTime(1, 5, 0, 0, 14, 0, 0); config.stuTimeSection[1].setTime(0, 15, 0, 0, 21, 0, 0); // 生效的门数量 config.nDoorNum = 1; // 生效的门 config.nDoors[0] = 1; configModule.setConfig( loginHandler, NET_EM_CFG_OPERATE_TYPE.NET_EM_CFG_ACCESSCTL_SPECIALDAYS_SCHEDULE, config, 0); } /** 获取假日计划 */ public void getSpecialDaysSchedule() { NET_CFG_ACCESSCTL_SPECIALDAYS_SCHEDULE_INFO config = new NET_CFG_ACCESSCTL_SPECIALDAYS_SCHEDULE_INFO(); config.nGroupNo = 1; config = (NET_CFG_ACCESSCTL_SPECIALDAYS_SCHEDULE_INFO) configModule.getConfig( loginHandler, NET_EM_CFG_OPERATE_TYPE.NET_EM_CFG_ACCESSCTL_SPECIALDAYS_SCHEDULE, config, 0); if (config != null) { System.out.println(config.toString()); } } /** 获取云台能力集 */ public void queryPtzCaps() { CFG_PTZ_PROTOCOL_CAPS_INFO info = new CFG_PTZ_PROTOCOL_CAPS_INFO(); info = (CFG_PTZ_PROTOCOL_CAPS_INFO) configModule.queryConfig( loginHandler, EM_NEW_QUERY_SYSTEM_INFO.CFG_CAP_CMD_PTZ, info, 0, 5000); if (info != null) { System.out.println( "支持云台巡迹OSD叠加: " + info.bSupportPtzPatternOSD + ",支持云台RS485检测OSD叠加: " + info.bSupportPTZCoordinates + ",支持云台方向状态显示: " + info.bDirectionDisplay + ",变倍最大值: " + info.dwZoomMax + ",变焦最小值: " + info.dwZoomMin); System.out.println("支持云台按绝对坐标定位: " + info.bMoveAbsolutely); if (info.bMoveAbsolutely) { System.out.println("绝对控制云台能力: " + info.stuMoveAbsolutely); } } } /** 设置一大三小 */ public void setCompose() { NET_COMPOSE_CHANNEL_INFO config = new NET_COMPOSE_CHANNEL_INFO(); config.emSplitMode = NetSDKLib.NET_SPLIT_MODE.NET_SPLIT_4A; // 子窗口显示数量 config.nChannelCount = 4; config.nChannelCombination[0] = 3; // 子窗口显示内容 config.nChannelCombination[1] = 0; config.nChannelCombination[2] = 7; config.nChannelCombination[3] = 8; boolean result = configModule.setConfig( loginHandler, NET_EM_CFG_OPERATE_TYPE.NET_EM_CFG_COMPOSE_CHANNEL, config, -1, 5000); if (!result) { System.out.println("set config failed."); } else { System.out.println("set config success."); } } /** 获取一大三小模式 */ public void getCompose() { NET_COMPOSE_CHANNEL_INFO config = new NET_COMPOSE_CHANNEL_INFO(); config = (NET_COMPOSE_CHANNEL_INFO) configModule.getConfig( loginHandler, NET_EM_CFG_OPERATE_TYPE.NET_EM_CFG_COMPOSE_CHANNEL, config, -1); if (config != null) { System.out.println("分割模式: " + config.emSplitMode + ",窗口数量:" + config.nChannelCount); for (int i = 0; i < config.nChannelCount; i++) { // 子窗口显示内容 System.out.println("nChannelCombination[" + i + "]: " + config.nChannelCombination[i]); } } else { System.out.println("get compose configuration failed."); } } /** 获取刻录文件大小 */ public void getBurnParam() { // 该长度是登录时从deviceInfo中取出的通道总数 NET_BURN_PARAM_INFO[] config = new NET_BURN_PARAM_INFO[12]; for (int i = 0; i < config.length; i++) { config[i] = new NET_BURN_PARAM_INFO(); } // 获取单个的可以使用configModule.getConfig config = (NET_BURN_PARAM_INFO[]) configModule.getConfigs( loginHandler, NET_EM_CFG_OPERATE_TYPE.NET_EM_CFG_BURN_PARAM, config); if (config != null) { for (NET_BURN_PARAM_INFO net_burn_param_info : config) { if (net_burn_param_info.nChannelCount > 0) { for (int j = 0; j < net_burn_param_info.nChannelCount; j++) { System.out.println("通道: " + net_burn_param_info.nChannels[j]); } System.out.println( "刻录文件长度:" + net_burn_param_info.nBurnFileLength + " MB,有效通道总数: " + net_burn_param_info.nChannelCount); } } // 修改,设备修改刻录长度可能会有问题,暂不修改 /* config.nBurnFileLength = 512; if (configModule.setConfig(loginHandler, NET_EM_CFG_OPERATE_TYPE.NET_EM_CFG_BURN_PARAM, config, 0, 5000)) { config = (NET_BURN_PARAM_INFO) configModule.getConfig(loginHandler, NET_EM_CFG_OPERATE_TYPE.NET_EM_CFG_BURN_PARAM, config, 0); System.out.println("修改后刻录文件长度: " + config.nBurnFileLength + "MB"); }*/ } else { System.out.println("get burn param burnLength failed."); } } /** 获取与下发语音激励 */ public void modifyAudioSpirit() { // 下发配置建议先获取设备配置,并在获取的配置基础上修改配置属性 CFG_AUDIO_SPIRIT spirit = new CFG_AUDIO_SPIRIT(); spirit.nChannelCount = 16; spirit.pstuChannels = new Memory(new CFG_AUDIO_SPIRIT_CHANNEL().size() * spirit.nChannelCount); spirit = (CFG_AUDIO_SPIRIT) configModule.getNewConfig( loginHandler, EM_NEW_CONFIG.CFG_CMD_AUDIO_SPIRIT, spirit, -1, 5000); if (spirit != null) { System.out.println("before modify audio spirit enable: " + spirit.bEnable); spirit.bEnable = !spirit.bEnable; System.out.println("nChannelCount: " + spirit.nChannelCount); CFG_AUDIO_SPIRIT_CHANNEL[] channels = new CFG_AUDIO_SPIRIT_CHANNEL[spirit.nChannelCount]; for (int i = 0; i < channels.length; i++) { channels[i] = new CFG_AUDIO_SPIRIT_CHANNEL(); } ToolKits.GetPointerDataToStructArr(spirit.pstuChannels, channels); for (CFG_AUDIO_SPIRIT_CHANNEL channel : channels) { System.out.println(channel.toString()); } spirit.pstuChannels = new Memory(channels[0].size() * channels.length); ToolKits.SetStructArrToPointerData(channels, spirit.pstuChannels); boolean result = configModule.setNewConfig( loginHandler, EM_NEW_CONFIG.CFG_CMD_AUDIO_SPIRIT, spirit, -1, 5000); if (result) { System.out.println("after modify audio spirit enable: " + spirit.bEnable); } else { System.out.println("set audio spirit failed."); } } else { System.out.println("get audio spirit enable failed."); } } /** 获取设备安装位置的GPS坐标信息 */ public void getDevlocationInfo() { // 超时时间 int waittime = 5000; // 通道号,-1为所有通道 int nChannelID = -1; // 设备安装位置的GPS坐标信息对象 CFG_DEVLOCATION_INFO info = new CFG_DEVLOCATION_INFO(); info = (CFG_DEVLOCATION_INFO) configModule.getNewConfig( loginHandler, EM_NEW_CONFIG.CFG_CMD_DEVLOCATION, info, nChannelID, waittime); if (info != null) { System.out.println("经度:" + info.unLongitude); System.out.println("纬度:" + info.unLatitude); System.out.println("海拔 :" + info.dbAltitude); System.out.println("GPS信息按照配置上报:" + info.bConfigEnable); System.out.println("设备高度:" + info.fHeight); } } /** 设置设备安装位置的GPS坐标信息 */ public void setDevlocationInfo() { // 超时时间 int waittime = 5000; // 通道号,-1为所有通道 int nChannelID = -1; // 设备安装位置的GPS坐标信息对象 CFG_DEVLOCATION_INFO info = new CFG_DEVLOCATION_INFO(); // 精度 info.unLongitude = 301200000; // 纬度 info.unLatitude = 121266670; // 海拔 info.dbAltitude = 150.0d; // GPS信息按照配置上报 info.bConfigEnable = 0; // 设备高度 info.fHeight = 15.0f; boolean result = configModule.setNewConfig( loginHandler, EM_NEW_CONFIG.CFG_CMD_DEVLOCATION, info, nChannelID, waittime); if (result) { System.out.println("设置设备安装位置的GPS坐标信息成功"); } else { System.out.println("设置设备安装位置的GPS坐标信息失败"); } } /** 获取设备参数标定配置 */ public void getLocationCalibrate() { // 超时时间 int waittime = 5000; // 通道号,-1为所有通道 int nChannelID = -1; // 设备参数标定配置对象 CFG_LOCATION_CALIBRATE_INFO info = new CFG_LOCATION_CALIBRATE_INFO(); info = (CFG_LOCATION_CALIBRATE_INFO) configModule.getNewConfig( loginHandler, EM_NEW_CONFIG.CFG_CMD_LOCATION_CALIBRATE, info, nChannelID, waittime); if (info != null) { System.out.println("可见光横向视角:" + info.nVisualMaxHFOV); System.out.println("可见光纵向视角:" + info.nVisualMaxVFOV); System.out.println("热成像横向视角:" + info.nThermoMaxHFOV); System.out.println("热成像纵向视角:" + info.nThermoMaxVFOV); System.out.println("标定点个数:" + info.nPointNum); CFG_LOCATION_CALIBRATE_POINT_INFO[] stuPointInfo = info.stuPointInfo; System.out.println("标定点信息"); for (int i = 0; i < info.nPointNum; i++) { System.out.println("-----------------标定点信开始--------------"); System.out.println("+标定点ID:" + stuPointInfo[i].nID); System.out.println("+标定点名称:" + new String(stuPointInfo[i].szName)); System.out.println("+标定点基本信息"); CFG_CALIBRATE_INFO stuCalibrateInfo = stuPointInfo[i].stuCalibrateInfo; System.out.println("++标定数量" + stuCalibrateInfo.nInfoNum); CFG_CALIBRATE_UNIT_INFO_ARR[] stuCalibrateUnitInfo = stuCalibrateInfo.stuCalibrateUnitInfo; for (int j = 0; j < stuCalibrateInfo.nInfoNum; j++) { System.out.println( "+++标定信息单元:" + JSONObject.toJSONString(stuCalibrateUnitInfo[j].unitArr)); } System.out.println("-----------------标定点信结束--------------"); } } } /** 设置设备参数标定配置 */ public void setLocationCalibrate() { // 超时时间 int waittime = 5000; // 通道号,-1为所有通道 int nChannelID = -1; // 设备参数标定配置对象 CFG_LOCATION_CALIBRATE_INFO info = new CFG_LOCATION_CALIBRATE_INFO(); // 视角 info.nVisualMaxHFOV = 1340; info.nVisualMaxVFOV = 160; info.nThermoMaxHFOV = 100; info.nThermoMaxVFOV = 100; // 标定点个数 info.nPointNum = 1; // 标定点信息 CFG_LOCATION_CALIBRATE_POINT_INFO[] stuPointInfoArr = new CFG_LOCATION_CALIBRATE_POINT_INFO[SDKStructureFieldLenth.MAX_CALIBRATE_POINT_NUM]; CFG_LOCATION_CALIBRATE_POINT_INFO stuPointInfo = new CFG_LOCATION_CALIBRATE_POINT_INFO(); // 标定点ID stuPointInfo.nID = 12; // 标定点名称 byte[] szName = "cat1".getBytes(); System.arraycopy(szName, 0, stuPointInfo.szName, 0, szName.length); // 使能 stuPointInfo.bEnable = 0; // 经度 stuPointInfo.nLongitude = 22222; // 纬度 stuPointInfo.nLatitude = 18655; // 海拔 stuPointInfo.fAltitude = 5.9d; // 标定点基本信息 CFG_CALIBRATE_INFO calibrateInfo = new CFG_CALIBRATE_INFO(); // 标定数量 calibrateInfo.nInfoNum = 1; CFG_CALIBRATE_UNIT_INFO calibrateUnitInfo = new CFG_CALIBRATE_UNIT_INFO(); // 分辨率高 calibrateUnitInfo.nHeight = 1660; // 分辨率宽 calibrateUnitInfo.nWidth = 1320; // 云台位置(P/T/Z 归一化) float[] nPosition = {0.0f, 0.0f, 0.0f}; calibrateUnitInfo.nPosition = nPosition; // 标定点坐标 int[] nLocation = {4096, 4096}; calibrateUnitInfo.nLocation = nLocation; // 横向视场角(单位:0.01度) calibrateUnitInfo.nHFOV = 100; // 纵向视场角(单位:0.01度) calibrateUnitInfo.nVFOV = 50; // 二维数组封装 CFG_CALIBRATE_UNIT_INFO[] unitArr = new CFG_CALIBRATE_UNIT_INFO[2]; unitArr[0] = calibrateUnitInfo; unitArr[1] = calibrateUnitInfo; CFG_CALIBRATE_UNIT_INFO_ARR arr = new CFG_CALIBRATE_UNIT_INFO_ARR(); arr.unitArr = unitArr; CFG_CALIBRATE_UNIT_INFO_ARR[] stuCalibrateUnitInfo = new CFG_CALIBRATE_UNIT_INFO_ARR[5]; stuCalibrateUnitInfo[0] = arr; calibrateInfo.stuCalibrateUnitInfo = stuCalibrateUnitInfo; stuPointInfo.stuCalibrateInfo = calibrateInfo; stuPointInfoArr[0] = stuPointInfo; info.stuPointInfo = stuPointInfoArr; boolean result = configModule.setNewConfig( loginHandler, EM_NEW_CONFIG.CFG_CMD_LOCATION_CALIBRATE, info, nChannelID, waittime); if (result) { System.out.println("设置设备参数标定配置成功"); } else { System.out.println("设置设备参数标定配置失败"); } } /** 多门互锁配置的获取与下发 */ public void ABLockInfo() { // 对于配置的下发,建议先获取再修改配置项下发,可以避免漏掉或误修改其他无关配置项 CFG_ACCESS_GENERAL_INFO inParam = new CFG_ACCESS_GENERAL_INFO(); inParam = (CFG_ACCESS_GENERAL_INFO) configModule.getNewConfig(loginHandler, CFG_CMD_ACCESS_GENERAL, inParam, 0, 3000); System.out.println("修改前,多门互锁使能:" + inParam.stuABLockInfo.bEnable + ",配置为:"); for (int i = 0; i < inParam.stuABLockInfo.nDoors; i++) { for (int j = 0; j < inParam.stuABLockInfo.stuDoors[i].nDoor; j++) { // 互锁信息 System.out.println(i + "," + j + ",door:" + inParam.stuABLockInfo.stuDoors[i].anDoor[j]); } } // 修改多门互锁配置 inParam.abABLockInfo = 1; inParam.stuABLockInfo.bEnable = !inParam.stuABLockInfo.bEnable; inParam.stuABLockInfo.nDoors = 1; int doors = 2; inParam.stuABLockInfo.stuDoors[0].nDoor = doors; inParam.stuABLockInfo.stuDoors[0].anDoor[0] = 1; inParam.stuABLockInfo.stuDoors[0].anDoor[1] = 2; inParam.stuABLockInfo.stuDoors[1].nDoor = doors; inParam.stuABLockInfo.stuDoors[1].anDoor[0] = 0; inParam.stuABLockInfo.stuDoors[1].anDoor[1] = 3; boolean result = configModule.setNewConfig(loginHandler, CFG_CMD_ACCESS_GENERAL, inParam, 0, 3000); // 下发配置成功,则重新获取配置信息,打印 if (result) { inParam = (CFG_ACCESS_GENERAL_INFO) configModule.getNewConfig(loginHandler, CFG_CMD_ACCESS_GENERAL, inParam, 3, 3000); System.out.println("修改后,多门互锁使能:" + inParam.stuABLockInfo.bEnable + ",配置为:"); } } public void run() { CaseMenu menu = new CaseMenu(); menu.addItem(new CaseMenu.Item(this, "获取&下发休眠策略配置", "getandSetSleepingControl")); menu.addItem(new CaseMenu.Item(this, "设置假日组", "setSpecialDayGroup")); menu.addItem(new CaseMenu.Item(this, "获取假日组", "getSpecialDayGroup")); menu.addItem(new CaseMenu.Item(this, "设置假日计划", "setSpecialDaysSchedule")); menu.addItem(new CaseMenu.Item(this, "获取假日计划", "getSpecialDaysSchedule")); menu.addItem(new CaseMenu.Item(this, "获取云台能力集", "queryPtzCaps")); menu.addItem(new CaseMenu.Item(this, "设置一大三小", "setCompose")); menu.addItem(new CaseMenu.Item(this, "获取一大三小", "getCompose")); menu.addItem(new CaseMenu.Item(this, "获取刻录文件大小", "getBurnParam")); menu.addItem(new CaseMenu.Item(this, "修改语音激励", "modifyAudioSpirit")); menu.addItem(new CaseMenu.Item(this, "获取设备安装位置的GPS坐标信息", "getDevlocationInfo")); menu.addItem(new CaseMenu.Item(this, "设置设备安装位置的GPS坐标信息", "setDevlocationInfo")); menu.addItem(new CaseMenu.Item(this, "获取设备参数标定配置", "getLocationCalibrate")); menu.addItem(new CaseMenu.Item(this, "设置设备参数标定配置", "setLocationCalibrate")); menu.addItem(new CaseMenu.Item(this, "多门互锁", "ABLockInfo")); menu.run(); } }