public static string GetMacMsg(byte[] msg, HeartBeatType htype) { if (msg != null && msg.Length > 0) { if (htype == HeartBeatType.HANFEN) { var msg_str = Encoding.UTF8.GetString(msg); //66ff00ff+ACCF23B87DAB,172.20.10.4 var hanfeng = msg_str.Split(new string[] { "+", "," }, StringSplitOptions.RemoveEmptyEntries); if (hanfeng.Length >= 3) { //66ff00ff+ACCF2349A932,192.168.1.150 var mac = hanfeng[1].ToLower(); return(mac); } } else if (htype == HeartBeatType.YILIN) { var trans_data = StrHelper.GetHexStr(msg); var split_data = trans_data.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries); var mac_flag = "0079"; ///开始是mac 地址 ///长度6个字节 var mac_len = 12; ///心跳包开始标识 var heartBeatStart = "55ff"; /////表示心跳包 //var index_18_len_2 = "ff"; trans_data = trans_data.Replace(" ", ""); if (trans_data.IndexOf(mac_flag) != -1) { if (trans_data.Length > 20) { var flag_char = trans_data.Substring(18, 2); if (trans_data.StartsWith(heartBeatStart) && flag_char.Equals("ff")) { var index = trans_data.IndexOf(mac_flag); ///mac地址 if (trans_data.IndexOf(mac_flag) != -1) { var start = trans_data.IndexOf(mac_flag) + mac_flag.Length; if (trans_data.Length >= start && trans_data.Length >= (start + mac_len)) { var mac = trans_data.Substring(start, mac_len).ToLower(); return(mac); } } } } } } } return(string.Empty); }
/// <summary> /// 设备重启 /// </summary> /// <param name="socket"></param> /// <param name="info"></param> /// <param name="bys"></param> private void DEVICE_RESTART(Socket socket, MacIPVersionInfo info, byte[] bys) { var msg = StrHelper.GetHexStr(bys).Replace(" ", ""); //0x55 + 0xFF + 0x13 + mac(6B) + CRC if (msg.Length == 20) { var mac = msg.Substring(6, 12); LogHelper.LogFilter(true, $"设备重启=>{mac},{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")},{msg}"); } }
/// <summary> /// 汉枫 /// </summary> /// <param name="socket"></param> /// <param name="info"></param> /// <param name="bys"></param> private void HanFengMethod(Socket socket, MacIPVersionInfo info, byte[] bys) { var ipEnd = (IPEndPoint)socket.RemoteEndPoint; var mac = info.mac; if (!string.IsNullOrEmpty(mac)) { Program.upgradeDevice(mac, socket); } var heartBeatKey = "HeartBeat:" + ipEnd.Address.ToString() + "" + ipEnd.Port; if (RedisHelper <string> .IsKeyExist(heartBeatKey) == false) { var task = new TaskFactory(); task.StartNew(() => { var ip = info.IP; var orgText = StrHelper.GetHexStr(bys); if (!string.IsNullOrEmpty(mac) && (mac.Equals("98d8634a034e") || mac.Equals("98d8634a0344") || mac.Equals("98d8638c7fa2"))) { LogHelper.LogFilter(true, $"心跳包=>{info.mac},{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}"); } DALMacIPInfo.MacIPInfo_Add(new MacIPInfo() { mac = info.mac, IP = ipEnd.Address.ToString(), localip = ip, ssid = "", OrgText = orgText }); }); RedisHelper <string> .StoreOneKey(heartBeatKey, "1", heartbeatTime); } }
/// <summary> /// 忆林的 /// </summary> /// <param name="socket"></param> /// <param name="info"></param> /// <param name="bys"></param> private void YiLinMethod(Socket pox, MacIPVersionInfo info, byte[] bys) { var mac = info.mac; if (!string.IsNullOrEmpty(mac)) { Program.upgradeDevice(mac, pox); } //LogWriteLock.EnterWriteLock(); //var st = new SocketTime(); //st.socket = pox; //st.time = DateTime.Now; //socketMap[mac] = st; //LogWriteLock.ExitWriteLock(); var ipEnd = (IPEndPoint)pox.RemoteEndPoint; var heartBeatKey = "HeartBeat:" + ipEnd.Address.ToString() + "" + ipEnd.Port; var key = "Socket.Tcp.SetTime." + mac; #region 设置时间 if (!RedisHelper <string> .IsKeyExist(key)) { Task.Factory.StartNew(() => { try { ///60*60*24 RedisHelper <string> .StoreOneKey(key, "1", 86400); var set_time_str = "55ff00010091010110a1000a0461" + StrHelper.BackTime(); var set_time_bytes = CRC16.CRC_XModem(set_time_str); pox.Send(set_time_bytes); Thread.Sleep(50); } catch (SocketException se) { Func <bool> func1 = () => true; var msgx = "TCP:670:" + se.ErrorCode + " " + se.Message; LogHelper.LogFilter(func1, msgx); } }); } #endregion #region 设置心跳包 if (RedisHelper <string> .IsKeyExist(heartBeatKey) == false) { var task = new TaskFactory(); task.StartNew(() => { var orgText = StrHelper.GetHexStr(bys); if (!string.IsNullOrEmpty(mac) && (mac.Equals("98d8634a034e") || mac.Equals("98d8634a0344") || mac.Equals("98d8638c7fa2"))) { LogHelper.LogFilter(true, $"心跳包=>{mac},{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}"); } DALMacIPInfo.MacIPInfo_Add(new MacIPInfo() { mac = mac, IP = ipEnd.Address.ToString(), localip = "", ssid = "", OrgText = orgText }); }); ///缓存2分钟 RedisHelper <string> .StoreOneKey(heartBeatKey, "1", heartbeatTime); } else { } #endregion }
private static void SendMsgToClient(byte[] ds, MacTcpUdp mu) { var rdata = StrHelper.GetHexStr(ds); var mac = mu.mac; if (!string.IsNullOrEmpty(mac)) { if (mac.Equals("98d8634a0344", StringComparison.OrdinalIgnoreCase)) { LogHelper.LogFilter(true, "返回=>" + rdata); } } else { mac = string.Empty; } var bdata = Encoding.UTF8.GetBytes(JsonHelper <Status <string> > .GetJson(new Status <string>() { code = "1", data = rdata, mac = mac, msg = "", commandType = "1" })); var queue = mu.clients; ///能否正常发通UDP var flag = true; while (queue != null && queue.Count > 0) { var el = queue.Dequeue(); if (el != null && !(el.time.AddSeconds(10) < DateTime.Now)) { try { if (mu.udpServer != null) { LogHelper.Info("设备mac:" + mac + " 数据" + rdata); var iet = (IPEndPoint)el.point; if (!iet.Address.Equals(IPAddress.Any)) { try { if (flag) { mu.udpServer.SendTo(bdata, el.point); } } catch (SocketException ex) { flag = false; queue.Clear(); //LogHelper.Info("TCP:378: " + ex.Message); LogHelper.LogFilter(true, ex.StackTrace); } } } } catch (Exception ex) { Console.WriteLine("TCP:395" + ex.Message); //Func<bool> func1 = () => true; //var msgx = "TCP:395" + ex.Message; //LogHelper.LogFilter(func1, msgx); LogHelper.LogFilter(true, ex.StackTrace); } } } }
public static MacIPVersionInfo GetHearBeatInfo(byte[] msg) { HeartBeatType ht = GetMsgType(msg); var mo = new MacIPVersionInfo(); mo.heartBeatType = ht; if (ht == HeartBeatType.HANFEN) { var mac = string.Empty; mo.IP = GetHANFENIP(msg, out mac); mo.mac = mac; mo.version = ""; } else if (ht == HeartBeatType.YILIN) { var mac = string.Empty; mo.IP = ""; mo.mac = GetMacMsg(msg, HeartBeatType.YILIN); mo.version = ""; } else if (ht == HeartBeatType.DEFAULT) { var mac = string.Empty; mo.heartBeatType = ht; mo.IP = ""; mo.mac = mac; mo.version = ""; } else if (ht == HeartBeatType.CMD) { var mac = string.Empty; mo.heartBeatType = ht; mo.IP = ""; mo.mac = mac; mo.version = ""; } else if (ht == HeartBeatType.BUFANGCHEFANG) { var mac = string.Empty; mo.heartBeatType = ht; mo.IP = ""; mo.mac = mac; mo.version = ""; } else if (ht == HeartBeatType.CHECK_TIME) { var mac = string.Empty; mo.heartBeatType = ht; mo.IP = ""; mo.mac = mac; mo.version = ""; } else if (ht == HeartBeatType.BAOJING) { var mac = string.Empty; mo.heartBeatType = ht; mo.IP = ""; mo.mac = mac; mo.version = ""; } else if (ht == HeartBeatType.DEVICE_RESTART) { string mac = string.Empty; mo.heartBeatType = ht; mo.IP = ""; mo.mac = mac; mo.version = ""; } else if (ht == HeartBeatType.NUANTONG) { /* * 16) 暖通设备控制支持 * 目前暖通控制通过云端执行操作,格式如 * 0x55 + 0xFF + 0x11 + mac(6B) +tCount(1B) + [cCount(1B) + command]+ CRC * * tCount:表示有几个指令 * []:表示的是指令集,个数由tCount决定, 每个指令为指令长度+指令内容组成; * 云端收到操作后按照指令集依次发送到对应mac设备, 如mac设备离线忽略操作; */ mo.heartBeatType = ht; mo.IP = ""; mo.version = ""; var str = StrHelper.GetHexStr(msg).Replace(" ", ""); if (str.Length >= 20) { ///mac var mac = str.Substring(6, 12); LogHelper.LogFilter(true, "暖通==>" + str); var tcount = str.Substring(18, 2); var count = Convert.ToInt32(tcount, 16); //index=14 //55ff11 262040589573 01 07 0110660130fc9b //55ff11 262040589573 02 07 0110660130fc9b 78070110660130fc9b78 //55ff11 262040589573 02 07 0110660130fc9b 07 0110660130fc9b78 var start = 20; for (var i = 0; i < count; i++) { if (start >= str.Length) { break; } var cmdCount = Convert.ToInt32(str.Substring(start, 2).ToLower(), 16); var cmd = str.Substring(start + 2, cmdCount * 2); mo.listcmd.Add(cmd); start = start + cmdCount * 2 + 2; } } } return(mo); }