zxl
21 小时以前 3b0516a2959e25576e4f3fda697a3b025d06c8c9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
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();
    }
}