using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; using Common; using Commonlib; using LogCap.Entity; using MathNet.Numerics.Distributions; using Microsoft.Extensions.Caching.Memory; using Newtonsoft.Json; using NLog; using RCUHost.Implement; using RCUHost.Protocols; using RestSharp; namespace LogCap.Common { public class DealWithData { private static Logger _logger = LogManager.GetCurrentClassLogger(); public static void HandleData(List data, string source_ip, ushort source_port, string dest_ip, ushort dest_port) { try { string fg = Tools.ByteToString(data.ToArray()); Program.CurrentTime = DateTime.Now; List Header = data.Take(2).ToList(); List Len = data.Skip(2).Take(2).ToList(); int Len_int = BitConverter.ToInt16(Len.ToArray(), 0); //系统 ID 的四个字节。固定“T3SA” List ID = data.Skip(4).Take(4).ToList(); //命令字 List CMD = data.Skip(8).Take(1).ToList(); //Frame List Frame = data.Skip(9).Take(2).ToList(); //Project_Code List Project_Code = data.Skip(11).Take(2).ToList(); List IP3 = data.Skip(13).Take(1).ToList(); List IP4 = data.Skip(14).Take(1).ToList(); List MsgData = data.Skip(15).Take(Len_int - 15 - 2).ToList(); List CRC_byte = data.TakeLast(2).ToList(); string Key = string.Format("{0}_{1}_{2}", CacheKey.RoomIP_Port_Prefix, source_ip, source_port); string Dest_Key = string.Format("{0}_{1}_{2}", CacheKey.RoomIP_Port_Prefix, dest_ip, dest_port); //Console.WriteLine("Key is: " + Key); byte cmdType_byte = CMD[0]; BLWCommandType cmdtype = (BLWCommandType)cmdType_byte; string CommandType = cmdtype.ToString(); string? iii = ReadConfig.Instance.monitor_server_ip; int ppp = ReadConfig.Instance.monitor_server_port; var QQQSSS = Program.Cache.Get>(CacheKey.MonitorEndPointList); if (QQQSSS.Count > 0) { string S_R_Type = ""; if (source_port == ppp && source_ip.Equals(iii)) { S_R_Type = ConstKey.Send_TX; } else { S_R_Type = ConstKey.Receive_RX; } foreach (var item in QQQSSS) { if (item.Port == 0 && item.IPAddress.Equals(source_ip)) { EndPoint_Monitor(data, source_ip, source_port, CommandType, S_R_Type); } else { if (item.Port == source_port && item.IPAddress.Equals(source_ip)) { EndPoint_Monitor(data, source_ip, source_port, CommandType, S_R_Type); } } } } //主机注册 if (cmdType_byte == 0x01) { //00 00 00 00 服务器 IP 地址 //FF FF FC 00 子网掩码 //C0 A8 64 01 网关 //0D 0D 端口 //34 D0 B8 11 38 89--MAC List IP = MsgData.Take(4).ToList(); List MaskNet = MsgData.Skip(4).Take(4).ToList(); List GetWay = MsgData.Skip(8).Take(4).ToList(); List Port = MsgData.Skip(12).Take(2).ToList(); List MAC_byte = MsgData.Skip(14).Take(6).ToList(); string MACstring = Tools.ByteToString(MAC_byte.ToArray()); MACstring = MACstring.Trim().Replace(" ", "-"); if (Frame.All(A => A == 0xFF)) { CommandType = "服务器注册命令"; } if (source_port == ppp && source_ip.Equals(iii)) { ReallyDealWith(true, data, dest_ip, dest_port, CommandType, ConstKey.Send_TX); } else { ReallyDealWith(true, data, source_ip, source_port, CommandType); } } //心跳包,其实会维持 连接 else if (cmdType_byte == 0x02) { //心跳包 //心跳包 里面有这个 MAC地址 //AA 55 17 00 54 33 53 41 //02 //F9 FF //A4 06 //2C 69 --这个是IP //34 D0 B8 11 2C 69 //91 F5 //BLWCommandType cmdtype = (BLWCommandType)cmdType_byte; //心跳包可能大于17个 //有一些项目的 心跳包是 这样的 // aa 55 17 00 54 33 53 41 02 26 ae e9 03 46 b6 34 d0 b8 11 46 b6 29 7e if (source_port == ppp && source_ip.Equals(iii)) { ReallyDealWith(true, data, dest_ip, dest_port, CommandType, ConstKey.Send_TX); } else { ReallyDealWith(true, data, source_ip, source_port, CommandType); } } else { //有时候经常上报这样的数据: //AA 55 11 00 54 33 53 41 0E FF FF BF 06 0A C8 E7 72 //AA 55 11 00 54 33 53 41 0E FF FF BF 06 0A C6 66 B6 //设备状态上报 if (cmdType_byte == 0x0E) { if (MsgData != null && MsgData.Count > 0) { //设备的数量 byte[] couont = MsgData.Skip(7).Take(1).ToArray(); int Count = couont[0]; var MMN = MsgData.Skip(8); for (int j = 0; j < Count; j++) { var DeviceData = MMN.Skip(j * 5).Take(5).ToArray(); if (DeviceData[0] == 0x0A) { byte n1 = DeviceData[0]; byte n2 = DeviceData[1]; byte[] vvv = new byte[] { DeviceData[4] }; BitArray bitArray = new BitArray(vvv); //卡身份 var qqq1 = bitArray.Cast().Take(1).ToArray(); var qqq2 = bitArray.Cast().Skip(1).Take(3).ToArray(); var qqq3 = qqq2.ToArray().Prepend(false).ToArray(); //节能状态 byte hhhg1 = Tools.CombineBitsToByte(qqq3[3], qqq3[2], qqq3[1], qqq3[0]); } } } } if (source_port == ppp && source_ip.Equals(iii)) { ReallyDealWith(false, data, dest_ip, dest_port, CommandType, ConstKey.Send_TX); } else { ReallyDealWith(false, data, source_ip, source_port, CommandType); } } } catch (Exception ex) { _logger.Error(ex.Message); _logger.Error(ex.StackTrace); Console.WriteLine(ex.Message + " \r\n" + ex.StackTrace); } } /// /// IP 和端口 端结点监控 /// /// /// /// /// /// /// private static void EndPoint_Monitor(List data, string source_ip, ushort source_port, string cmdtype, string Send_Or_Receive = ConstKey.Receive_RX) { try { ////系统 ID 的四个字节。固定“T3SA” //List ID = data.Skip(4).Take(4).ToList(); ////命令字 //List CMD = data.Skip(8).Take(1).ToList(); ////Frame //List Frame = data.Skip(9).Take(2).ToList(); //Project_Code List Project_Code = data.Skip(11).Take(2).ToList(); ushort hotel_code_o = BitConverter.ToUInt16(Project_Code.ToArray(), 0); ////MAC //List IP3 = data.Skip(13).Take(1).ToList(); //List IP4 = data.Skip(14).Take(1).ToList(); long hotel_code = hotel_code_o; string hostnumber = ""; string hexdata = Tools.ByteToString(data.ToArray()); HttpSend.SendLog_2(cmdtype, hotel_code, 0, "", hostnumber, source_ip, source_port, "", 0, "", Send_Or_Receive, hexdata); } catch (Exception) { throw; } } private static void ReallyDealWith(bool isRegister, List data, string source_ip, ushort source_port, string cmdtype, string Send_Or_Receive = ConstKey.Receive_RX) { try { if (data == null || data.Count == 0) { return; } ReceiverContext context = new ReceiverContext(data.ToArray()); context.SystemHeader = DecodeSystemHeader(context.Data); string Ghostnumber = context.SystemHeader.Value.HostNumber.ToString() ?? ""; if (string.IsNullOrEmpty(Ghostnumber)) { return; } var list = Program.Cache.Get>(CacheKey.Key); if (list == null) { return; } if (list.Count == 0) { return; } if (isRegister) { if (list != null && list.Count > 0) { #region 删除过期的数据 try { list.RemoveAll((Item) => { if (Item != null) { var ddt = Item.CreateDateTime; if (!string.IsNullOrEmpty(ddt)) { DateTime dta = DateTime.Parse(ddt); DateTime nnn = dta.AddDays(30); if (DateTime.Now >= nnn) { return true; } } } return false; }); } catch (Exception) { } #endregion foreach (Monitor_Host item in list) { try { if (item == null) { continue; } string HostNNN = item.Key_HostNumber; if (HostNNN == null) { continue; } string room_num = item.RoomNumber; string TakeOut_MAC = item.MAC; string hotelcode = item.HotelCode; //如果 要监控的MAC 和 当前上传的MAC相等 if (HostNNN.Equals(Ghostnumber)) { //心跳包可以注册 if (isRegister) { var llg = Tools.ByteToString(data.ToArray()); string KeyHeartBeat = string.Format("{0}_{1}_{2}", CacheKey.RoomIP_Port_Prefix, source_ip, source_port); //Console.WriteLine("TakeOut_HostNUMBER: " + HostNNN + " Key: " + KeyHeartBeat + " MAC: " + TakeOut_MAC + " data:" + llg); Program.Cache.Set(KeyHeartBeat, HostNNN); } string Key = string.Format("{0}_{1}", CacheKey.RoomIP_Port_Prefix, HostNNN); var takeMM = Program.Cache.Get(Key); //如果房间为空 if (takeMM == null) { #region 查询房间信息 //从数据库里面查询得 Dictionary dic = new Dictionary(); dic.Add("key", "blw_ws@2015"); dic.Add("roomnumber", room_num); dic.Add("hotelcode", hotelcode); string sttr = ""; string KKK = "ChaXunData_" + hotelcode + "_" + room_num; string GGG = Program.Cache.Get(KKK); if (!string.IsNullOrEmpty(GGG)) { sttr = GGG; } else { sttr = Send_Http_Request_Params("api/GetHostByMAC_POST", dic); Program.Cache.Set(KKK, GGG, new MemoryCacheEntryOptions() { SlidingExpiration = TimeSpan.FromMinutes(10) }); } if (!string.IsNullOrEmpty(sttr)) { //Console.WriteLine( "查询的数据:"+sttr); var msghost = JsonConvert.DeserializeObject(sttr); var dtrow = msghost.Result.FirstOrDefault(); if (dtrow != null) { string? hotelid = dtrow["HotelID"].ToString(); string? hostid = dtrow["ID"].ToString(); string? roomno = dtrow["RoomNumber"].ToString(); string? hostnumber = dtrow["HostNumber"].ToString(); string? LanIP = dtrow["LanIP"] ?? ""; string? LanPort = dtrow["LanPort"].ToString(); string? HotelID = dtrow["HotelID"].ToString(); //string? XiaoDuCUID = dtrow["XiaoDuCUID"].ToString(); //string? TiaoMaoCUID = dtrow["TiaoMaoCUID"].ToString(); string? XiaoDuCUID = ""; string? TiaoMaoCUID = ""; MonitorRedis mm = new MonitorRedis(); long hhh = 0; long.TryParse(hotelcode, out hhh); int hid = 0; int.TryParse(HotelID, out hid); mm.TiaoMaoCUID = TiaoMaoCUID; mm.XiaoDuCUID = XiaoDuCUID; mm.HotelCode = hhh; mm.HotelID = hid; mm.HostID = int.Parse(hostid); mm.RoomNo = roomno; mm.HostNumber = hostnumber; mm.WWW_IP = source_ip; mm.WWW_Port = source_port; mm.LanIP = LanIP; mm.LanPort = int.Parse(LanPort); mm.MAC = TakeOut_MAC; mm.CommandType = cmdtype.ToString(); mm.SendOrReceive = Send_Or_Receive; mm.RemoteEndPointIP = source_ip; mm.RemoteEndPointPort = source_port; Program.Cache.Set(Key, mm); string dataHex = Tools.ByteToString(data.ToArray()); HttpSend.SendLog(mm.XiaoDuCUID, mm.TiaoMaoCUID, mm.CommandType, hhh, mm.HostID, mm.RoomNo, mm.HostNumber, source_ip, source_port, mm.LanIP, mm.LanPort, mm.MAC, Send_Or_Receive, dataHex); } } #endregion } else { long hotel_code = takeMM.HotelCode; int host_id = takeMM.HostID; string hostnumber = takeMM.HostNumber; string roomnumber = takeMM.RoomNo; string lan_ip = takeMM.LanIP; int lan_port = takeMM.LanPort; string www_ip = takeMM.WWW_IP; int www_port = takeMM.WWW_Port; string mac_take_out = takeMM.MAC; string dataHex = Tools.ByteToString(data.ToArray()); HttpSend.SendLog(takeMM.XiaoDuCUID, takeMM.TiaoMaoCUID, cmdtype, hotel_code, host_id, roomnumber, hostnumber, www_ip, www_port, lan_ip, lan_port, mac_take_out, Send_Or_Receive, dataHex); } break; } } catch (Exception ex) { continue; } } } } else { if (list != null && list.Count > 0) { string KeyHeartBeat = string.Format("{0}_{1}_{2}", CacheKey.RoomIP_Port_Prefix, source_ip, source_port); string Hostnumber_TTT = Program.Cache.Get(KeyHeartBeat); if (!string.IsNullOrEmpty(Hostnumber_TTT)) { string Key = string.Format("{0}_{1}", CacheKey.RoomIP_Port_Prefix, Hostnumber_TTT); //Console.WriteLine("KeyHeartBeat is " + KeyHeartBeat); if (!string.IsNullOrEmpty(Key)) { //string bbbaaa=Tools.ByteToString(data.ToArray()); //Console.WriteLine("111111111111111111: "+Key+" data: "+bbbaaa); var takeMM = Program.Cache.Get(Key); if (takeMM != null) { //Console.WriteLine("22222222222"); long hotel_code = takeMM.HotelCode; int host_id = takeMM.HostID; string hostnumber = takeMM.HostNumber; string roomnumber = takeMM.RoomNo; string lan_ip = takeMM.LanIP; int lan_port = takeMM.LanPort; string www_ip = takeMM.WWW_IP; int www_port = takeMM.WWW_Port; string mac_take_out = takeMM.MAC; string dataHex = Tools.ByteToString(data.ToArray()); HttpSend.SendLog("", "", cmdtype, hotel_code, host_id, roomnumber, hostnumber, www_ip, www_port, lan_ip, lan_port, mac_take_out, Send_Or_Receive, dataHex); } } } } } } catch (Exception ex) { Console.WriteLine("出错了" + ex.Message); Console.WriteLine("出错了" + ex.StackTrace); _logger.Error(ex.Message); _logger.Error(ex.StackTrace); } } private static SystemHeader? DecodeSystemHeader(byte[] data) { return StructConverter.BytesToStruct(data, typeof(SystemHeader)) as SystemHeader?; } public static string Send_Http_Request_Params(string Url, Dictionary Params) { string BaseUrl = ReadConfig.Instance.CRICS_URL; var options = new RestClientOptions(BaseUrl); var client = new RestClient(options); var request = new RestRequest(Url); foreach (var item in Params) { request.AddParameter(item.Key, item.Value); } //RoomNumber // The cancellation token comes from the caller. You can still make a call without it. string? hostlist = client.Post(request).Content; return hostlist; } } }