package com.ycl.api.YS; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; import com.ycl.api.DH.utils.DHApi; import com.ycl.api.YS.lib.NetDEVSDKLib; import com.ycl.api.YS.login.Login; import com.ycl.platform.domain.entity.TMonitor; import com.ycl.platform.domain.result.OSDResult; import com.ycl.utils.StringUtils; import enumeration.DeviceType; import lombok.extern.slf4j.Slf4j; import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; import java.util.Date; import java.util.regex.Pattern; import static com.ycl.api.YS.lib.NetDEVSDKLib.NETDEV_LOGIN_PROTO_E.NETDEV_LOGIN_PROTO_ONVIF; @Slf4j public class YSApi { public static OSDResult getOsd(TMonitor monitor, String ip, String userName, String password) { //登录 NetDEVSDKLib.NETDEV_DEVICE_LOGIN_INFO_S stDevLoginInfo = new NetDEVSDKLib.NETDEV_DEVICE_LOGIN_INFO_S(); NetDEVSDKLib.NETDEV_SELOG_INFO_S stSELogInfo = new NetDEVSDKLib.NETDEV_SELOG_INFO_S(); System.arraycopy(userName.getBytes(), 0, stDevLoginInfo.szUserName, 0, userName.getBytes().length); System.arraycopy(password.getBytes(), 0, stDevLoginInfo.szPassword, 0, password.getBytes().length); System.arraycopy(ip.getBytes(), 0, stDevLoginInfo.szIPAddr, 0, ip.getBytes().length); stDevLoginInfo.dwPort = 80; //登录协议 stDevLoginInfo.dwLoginProto = NETDEV_LOGIN_PROTO_ONVIF; Pointer lpUserID = YSInit.netdevsdk.NETDEV_Login_V30(stDevLoginInfo, stSELogInfo); if (lpUserID != null) { OSDResult osdResult = new OSDResult(); //获取通道 int nMaxChlCount = 256; IntByReference dwChlCount = new IntByReference(nMaxChlCount); NetDEVSDKLib.NETDEV_VIDEO_CHL_DETAIL_INFO_EX_S[] stVideoChlList = (NetDEVSDKLib.NETDEV_VIDEO_CHL_DETAIL_INFO_EX_S[]) new NetDEVSDKLib.NETDEV_VIDEO_CHL_DETAIL_INFO_EX_S().toArray(nMaxChlCount); boolean bRe = YSInit.netdevsdk.NETDEV_QueryVideoChlDetailListEx(lpUserID, dwChlCount, stVideoChlList); if (!bRe) { // log.error("error code" + YSInit.netdevsdk.NETDEV_GetLastError()); return null; } //获取时间 NetDEVSDKLib.NETDEV_TIME_CFG_S stTimeCfg = new NetDEVSDKLib.NETDEV_TIME_CFG_S(); stTimeCfg.write(); boolean bRetime = NetDemo.netdevsdk.NETDEV_GetSystemTimeCfg(lpUserID, stTimeCfg); Date checkTime = new Date(); osdResult.setCheckTime(checkTime); if (!bRetime) { // log.error("error code" + YSInit.netdevsdk.NETDEV_GetLastError()); return null; } else { stTimeCfg.read(); String strTime = "" + stTimeCfg.stTime.dwYear + "-"; if (stTimeCfg.stTime.dwMonth < 10) { strTime += "0"; } strTime = strTime + stTimeCfg.stTime.dwMonth + "-"; if (stTimeCfg.stTime.dwDay < 10) { strTime += "0"; } strTime = strTime + stTimeCfg.stTime.dwDay + " "; if (stTimeCfg.stTime.dwHour < 10) { strTime += "0"; } strTime = strTime + stTimeCfg.stTime.dwHour + ":"; if (stTimeCfg.stTime.dwMinute < 10) { strTime += "0"; } strTime = strTime + stTimeCfg.stTime.dwMinute + ":"; if (stTimeCfg.stTime.dwSecond < 10) { strTime += "0"; } strTime = strTime + stTimeCfg.stTime.dwSecond; SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { osdResult.setOsdTime(format.parse(strTime)); } catch (Exception e) { // log.error(ip + "时间解析有误"); } } //获取osd NetDEVSDKLib.NETDEV_VIDEO_OSD_CFG_S stOSDInfo = new NetDEVSDKLib.NETDEV_VIDEO_OSD_CFG_S(); stOSDInfo.write(); IntByReference dwBytesReturned = new IntByReference(); boolean bRet = YSInit.netdevsdk.NETDEV_GetDevConfig(lpUserID, stVideoChlList[0].dwChannelID, NetDEVSDKLib.NETDEV_CONFIG_COMMAND_E.NETDEV_GET_OSDCFG, stOSDInfo.getPointer(), 616, dwBytesReturned); if (!bRet) { // log.error("error code" + YSInit.netdevsdk.NETDEV_GetLastError()); return null; } stOSDInfo.read(); String name = new String(stOSDInfo.stNameOSD.szOSDText, StandardCharsets.UTF_8).trim(); //正则名字 如果出现特殊字符 则调用dh的接口 log.error("YSname:{}" , name); // 正则表达式(匹配包含 � 字符的字符串) String regex = ".*\\uFFFD.*"; // 核心逻辑:匹配任意位置出现 � 的字符串 // 编译正则表达式 Pattern pattern = Pattern.compile(regex); boolean isMatch = pattern.matcher(name).matches(); if(isMatch){ log.error("出现正则名字中有特殊字符:{}" , name); //大华 OSDResult osd = DHApi.getOsd(monitor.getName(),monitor.getSerialNumber(),monitor.getIp(), monitor.getUsername(),monitor.getPassword()); OSDResult osdResult2 = checkSuccess(monitor, osd); log.error("osdResult2"); if (osdResult2!=null) { return osd; }else { return null; } } if (StringUtils.isNotEmpty(name) && name.contains("|")){ String[] osdNames = name.split("\\|"); for (int i = 0; i < osdNames.length; i++) { if (i == 0) { osdResult.setOSD1(osdNames[i]); } if (i == 1) { osdResult.setOSD2(osdNames[i]); } if (i == 2) { osdResult.setOSD3(osdNames[i]); } if (i == 3) { osdResult.setName(osdNames[i]); } } }else { //省份 osdResult.setOSD1(name); // log.info("YSname"+name); int num = 0; for (NetDEVSDKLib.NETDEV_OSD_TEXT_OVERLAY_S osd : stOSDInfo.astTextOverlay) { String text = new String(osd.szOSDText, StandardCharsets.UTF_8).trim(); log.info("YSnum:"+num+",YStexr:"+text); if (num == 0) { osdResult.setOSD2(text); } else if (num == 1) { osdResult.setOSD3(text); } else if (num == 2) { osdResult.setName(text); } else if (num == 3) { osdResult.setOSD4(text); } num++; } } //登出 YSInit.netdevsdk.NETDEV_Logout(lpUserID); osdResult.setDeviceBrand(DeviceType.YS.getType()); return osdResult; } else { // log.error("ip:"+ip+",error code" + YSInit.netdevsdk.NETDEV_GetLastError()); return null; } } //OSDCheckThread方法 private static OSDResult checkSuccess(TMonitor monitor, OSDResult osd) { if (osd != null) { osd.setSerialNumber(monitor.getSerialNumber()); return osd; } else { return null; } } public static void demo() { Login.loginIn(); } }