package com.netsdk.demo.customize.transmitInfoDemo; import java.util.HashMap; import java.util.Map; import java.util.Scanner; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; import com.netsdk.demo.customize.transmitInfoDemo.callback.RegisterServiceCallBack; import com.netsdk.demo.customize.transmitInfoDemo.entity.DeviceInfo; import com.netsdk.demo.customize.transmitInfoDemo.entity.ListenInfo; import com.netsdk.demo.customize.transmitInfoDemo.module.AutoRegisterModule; import com.netsdk.demo.customize.transmitInfoDemo.module.ConfigModule; import com.netsdk.demo.customize.transmitInfoDemo.module.LoginModule; import com.netsdk.demo.customize.transmitInfoDemo.module.SdkUtilModule; import com.netsdk.demo.util.CaseMenu; import com.netsdk.lib.NetSDKLib; import com.netsdk.lib.ToolKits; import com.netsdk.lib.NetSDKLib.CFG_DVRIP_INFO; import com.netsdk.lib.NetSDKLib.CFG_REGISTER_SERVER_INFO; import com.netsdk.lib.NetSDKLib.CFG_SERVER_INFO; import com.netsdk.lib.enumeration.ENUMERROR; /** * @author 251823 * @description AutoRegister Demo * @date 2022/3/23 */ public class AutoRegisterExDemo { // 初始化测试 public void InitTest() { SdkUtilModule.Init(); // 初始化SDK库 } ///////////////////////////// 主动注册 ///////////////////////////// /////////////////////////////////////////////////////////////////// // 用户存储注册上来的设备信息的缓存 Map 项目中请替换成其他中间件 private final Map deviceInfoMap = new ConcurrentHashMap<>(); // 监听句柄 private NetSDKLib.LLong m_hListenHandle = new NetSDKLib.LLong(0); private NetSDKLib.LLong m_hLoginHandle = new NetSDKLib.LLong(0); /** * 开启监听 */ public void serverStartListen() { m_hListenHandle = AutoRegisterModule.ServerStartListen(serverIpAddr, serverPort, RegisterServiceCallBack.getInstance()); if (m_hListenHandle.longValue() == 0) return; taskIsOpen = true; new Thread(this::eventListTask).start(); } /** * 结束监听 */ public void serverStopListen() { AutoRegisterModule.ServerStopListen(m_hListenHandle); // 清空队列 taskIsOpen = false; deviceInfoMap.clear(); RegisterServiceCallBack.ServerInfoQueue.clear(); } private volatile Boolean taskIsOpen = false; // 获取监听回调数据并放入缓存 public void eventListTask() { while (taskIsOpen) { try { // 稍微延迟一下,避免循环的太快 Thread.sleep(10); // 阻塞获取 ListenInfo listenInfo = RegisterServiceCallBack.ServerInfoQueue.poll(50, TimeUnit.MILLISECONDS); if (listenInfo == null) continue; // 结果放入缓存 if (deviceInfoMap.containsKey(listenInfo.devSerial)) { deviceInfoMap.remove(key); } deviceInfoMap.put(listenInfo.devSerial, new DeviceInfo(listenInfo.devIpAddress, listenInfo.devPort)); System.out.println("New Device AutoRegister Info... Serial:" + listenInfo.devSerial); } catch (InterruptedException e) { e.printStackTrace(); } } } /** * 查看上报的监听数据 */ public void checkRegisterDevInfo() { // 浅拷贝一个快照 Map deviceInfos = new HashMap<>(deviceInfoMap); if (deviceInfos.isEmpty()) System.out.println("没有任何设备上报注册信息."); StringBuilder info = new StringBuilder(); for (String label : deviceInfos.keySet()) { info.append(String.format("Serial: %s %s\n", label, deviceInfos.get(label).printRegisterInfo())); } System.out.println(info.toString()); } String key = ""; /** * 登录指定设备 */ public void deviceLogin() { Scanner sc = new Scanner(System.in); System.out.println("请输入设备的注册 Serial"); key = sc.nextLine().trim(); DeviceInfo deviceInfo = deviceInfoMap.get(key); if (deviceInfo == null) { System.out.println("注册上报的设备中没有该 Serial"); return; } String ipAddr = deviceInfo.ipAddress; int port = deviceInfo.port; System.out.println("请输入用户名"); String username = sc.nextLine().trim(); System.out.println("请输入密码"); String password = sc.nextLine().trim(); // 高安全登录 主动注册 m_hLoginHandle = LoginModule.AutoRegisterLoginWithHighSecurity(key, ipAddr, port, username, password, deviceInfo.m_stDeviceInfo); if (m_hLoginHandle.longValue() == 0) { System.err.println("登录失败:" + ENUMERROR.getErrorMessage()); return; } // deviceInfo.m_hLoginHandle = m_hLoginHandle; // deviceInfo.isLogin = true; // 启动业务 Demo System.out.println("Start business demo"); deviceInfoMap.remove(key); // 清除此注册信息 请等待重新上报后再重新登录 } /** * 登出指定设备 */ public void deviceLogout() { // 结束测试后登出设备 LoginModule.logout(m_hLoginHandle); } /** * 查询设备在线状态 * */ public void QueryOnlineState() { ConfigModule.QueryOnlineState(m_hLoginHandle); } /** * 获取网络协议配置 * */ public void getDVRIPConfig() { CFG_DVRIP_INFO msg = ConfigModule.getDVRIPConfig(m_hLoginHandle); if(msg != null) { System.out.println("TCP服务端口 : " + msg.nTcpPort); System.out.println("主动注册配置个数 "+msg.nRegistersNum); CFG_REGISTER_SERVER_INFO[] stuRegisters = msg.stuRegisters; for (int i = 0; i < msg.nRegistersNum; i++) { System.out.println("主动注册使能: "+stuRegisters[i].bEnable); System.out.println("设备ID: "+new String(stuRegisters[i].szDeviceID)); System.out.println("服务器个数: "+stuRegisters[i].nServersNum); CFG_SERVER_INFO[] stuServers = stuRegisters[i].stuServers; for (int j = 0; j < stuRegisters[i].nServersNum; j++) { System.out.println("服务器端口号: "+stuServers[j].nPort); System.out.println("IP地址或网络名: "+new String(stuServers[j].szAddress)); } } } } /** * 下发网络协议配置 * */ public void setDVRIPConfig() { // 获取网络协议配置 CFG_DVRIP_INFO msg = ConfigModule.getDVRIPConfig(m_hLoginHandle); /******修改配置信息******/ // 主动注册配置个数 msg.nRegistersNum = 1; // 主动注册使能 boolean enable = true; msg.stuRegisters[0].bEnable = enable? 1:0; // 服务器个数 msg.stuRegisters[0].nServersNum = 1; // 服务器地址 String address = "10.33.121.50"; StringToByteArray(address, msg.stuRegisters[0].stuServers[0].szAddress); // 服务器端口号 int nPort = 9500; msg.stuRegisters[0].stuServers[0].nPort = nPort; // 设备ID String deviceId = "none"; ByteArrayToByteArray(deviceId.getBytes(), msg.stuRegisters[0].szDeviceID); ConfigModule.setDVRIPConfig(m_hLoginHandle, msg); } /** * 字符串拷贝,用于先获取,再设置(src → dst) * @param src * @param dst */ public static void StringToByteArray(String src, byte[] dst) { for(int i = 0; i < dst.length; i++) { dst[i] = 0; } System.arraycopy(src.getBytes(), 0, dst, 0, src.getBytes().length); } /** * 数组拷贝, 用于先获取,再设置(src → dst) * @param b * @param dst */ public static void ByteArrayToByteArray(byte[] src, byte[] dst) { for(int i = 0; i < dst.length; i++) { dst[i] = 0; } System.arraycopy(src, 0, dst, 0, src.length); } // 加载测试内容 public void RunTest() { CaseMenu menu = new CaseMenu(); menu.addItem(new CaseMenu.Item(this, "开始监听", "serverStartListen")); menu.addItem(new CaseMenu.Item(this, "结束监听", "serverStopListen")); menu.addItem(new CaseMenu.Item(this, "查看上报信息", "checkRegisterDevInfo")); menu.addItem(new CaseMenu.Item(this, "登录设备", "deviceLogin")); // 登录成功后启动业务demo menu.addItem(new CaseMenu.Item(this, "登出设备", "deviceLogout")); // 登录成功 menu.addItem(new CaseMenu.Item(this, "查询设备在线状态", "QueryOnlineState")); menu.addItem(new CaseMenu.Item(this, "获取网络协议配置", "getDVRIPConfig")); menu.addItem(new CaseMenu.Item(this, "下发网络协议配置", "setDVRIPConfig")); menu.run(); System.out.println("主测试已退出"); } // 结束测试 public void EndTest() { System.out.println("End Test"); if (m_hListenHandle.longValue() != 0) serverStopListen(); System.out.println("See You..."); SdkUtilModule.cleanup(); // 清理资源 } /////////////// 注册地址(服务器 这里是运行此Demo的电脑IP) 监听端口 ////////////////////// private final String serverIpAddr = "10.33.121.50"; private final int serverPort = 9500; // 注意不要和其他程序发生冲突 ///////////////////////////////////////////////////////////////////////////////////// public static void main(String[] args) { AutoRegisterExDemo launcher = new AutoRegisterExDemo(); launcher.InitTest(); launcher.RunTest(); launcher.EndTest(); } }