From 25429f085093d89d543a0b90e30d0d62d1b7dac9 Mon Sep 17 00:00:00 2001 From: hxb <hxb@hdlchina.com.cn> Date: 星期二, 30 八月 2022 09:37:38 +0800 Subject: [PATCH] 合并了IOS的代码 --- ZigbeeApp/Shared/Phone/ZigBee/Common/Application.cs | 663 ++++++++++++++++++++++++++++++------------------------ 1 files changed, 369 insertions(+), 294 deletions(-) diff --git a/ZigbeeApp/Shared/Phone/ZigBee/Common/Application.cs b/ZigbeeApp/Shared/Phone/ZigBee/Common/Application.cs index 04c6a57..d5f60c1 100755 --- a/ZigbeeApp/Shared/Phone/ZigBee/Common/Application.cs +++ b/ZigbeeApp/Shared/Phone/ZigBee/Common/Application.cs @@ -12,20 +12,29 @@ { public static class Application { + #region 鈻� 鍙橀噺澹版槑___________________________ + public static bool isInited; - static bool isEncry; /// <summary> /// 鏄惁姝e湪鎼滅储缃戝叧 /// </summary> public static bool IsSearchingGateway = false; - /// <summary> - /// 鏂板彂鐜扮殑缃戝叧閫氱煡 - /// </summary> - public static Action<ZigBee.Device.ZbGateway> NewGateWayAction; /// <summary> + /// 鍙戦�佺殑鏃堕棿闂撮殧(鍗曚綅:绉�) + /// </summary> + public static int SendTime = 3; + /// <summary> /// 涓婁竴娆$殑浣忓畢ID /// </summary> private static string oldHomeID = string.Empty; + /// <summary> + /// 鎺ユ敹鐨処P + /// </summary> + private static List<string> listReceiveIP = new List<string>(); + + #endregion + + #region 鈻� 鍒濆鍖朹____________________________ public static void Init() { @@ -33,274 +42,273 @@ { return; } - isInited = true; + isInited = true; + + //鍒濆鍖朣ocket + FindGateWaySocket.Start(); + //鍙戦�佸箍鎾暟鎹� + StartSendBroadcastData(); + + //鎺ユ敹骞挎挱鏁版嵁 + StartReceiveBroadcastData(); + + ///寮�鍚繙绋嬭繛鎺� + StartRemoteMqtt(); + } + + #endregion + + #region 鈻� 鍙戦�佸箍鎾暟鎹甠______________________ + + /// <summary> + /// 鍙戦�佸箍鎾暟鎹� + /// </summary> + private static void StartSendBroadcastData() + { + new System.Threading.Thread(() => + { + var broadBytes = new byte[44]; + var waitCount = 0; + + while (true) + { + try + { + //妫�娴嬭兘鍚﹀彂閫佸箍鎾� 0:涓嶈兘鍙戦�佸箍鎾� 1:鍙互鍙戦�佸箍鎾� 2:浣忓畢ID鍙樻洿 + int result = CheckCanSendBroadcast(); + if (result == 0) + { + continue; + } + if (result == 2) + { + //閲嶆柊鍒濆鍖栧箍鎾暟鎹� + broadBytes = new byte[44]; + broadBytes[0] = 0xfe; + broadBytes[1] = 0x29; + broadBytes[2] = 0x00; + broadBytes[3] = 0x00; + broadBytes[4] = 0x00; + broadBytes[5] = 0x00; + broadBytes[6] = 0x00; + broadBytes[43] = 0x02; + var tempBytes = System.Text.Encoding.UTF8.GetBytes(oldHomeID); + System.Array.Copy(tempBytes, 0, broadBytes, 7, 36 < tempBytes.Length ? 36 : tempBytes.Length); + } + + var broadcastIpAddress = new Shared.Net.NetWiFi().BroadcastIpAddress; + + //娓呯┖鎺ユ敹鍒扮殑IP + listReceiveIP.Clear(); + if (broadcastIpAddress.ToString() != "0.0.0.0") + { + //骞挎挱鍑哄幓 + FindGateWaySocket.BeginSend(new System.Net.IPEndPoint(broadcastIpAddress, 7624), broadBytes); + } + //绛夊緟3绉�,涓嬮潰鐨勬帴鏀舵柟娉曚細鍘绘帴鏀跺箍鎾� + System.Threading.Thread.Sleep(SendTime * 1000); + + if (listReceiveIP.Count > 0) + { + waitCount = 0; + //灞�鍩熺綉鑳藉骞挎挱寰楀埌缃戝叧 + ZbGateway.IsRemote = false; + //褰撶綉鍏崇殑杩炴帴鏂瑰紡鏀瑰彉鏃�,璁板綍褰撳墠鐨勮繛鎺ユ柟寮� + Shared.Phone.UserCenter.HdlGatewayLogic.Current.CheckGatewayByConnectChanged(Shared.Phone.UserCenter.GatewayConnectMode.WIFI); + } + else + { + waitCount++; + if (waitCount >= 2) + { + //涓ゆ閮芥悳涓嶅埌,鎵嶆爣璁颁负杩滅▼ + continue; + } + waitCount = 0; + //灞�鍩熺綉骞挎挱涓嶅埌缃戝叧 + ZbGateway.IsRemote = true; + //褰撶綉鍏崇殑杩炴帴鏂瑰紡鏀瑰彉鏃�,璁板綍褰撳墠鐨勮繛鎺ユ柟寮� + Shared.Phone.UserCenter.HdlGatewayLogic.Current.CheckGatewayByConnectChanged(Shared.Phone.UserCenter.GatewayConnectMode.Remote); + } + } + catch { } + } + }) + { IsBackground = true }.Start(); + } + + #endregion + + #region 鈻� 鎺ユ敹骞挎挱鏁版嵁_______________________ + + /// <summary> + /// 鎺ユ敹骞挎挱鏁版嵁 + /// </summary> + private static void StartReceiveBroadcastData() + { + //鏁版嵁鎺ユ敹 new System.Threading.Thread(async () => { - var gateWayList = new List<ZbGateway> { }; - var searchCount = 6; - var broadBytes = new byte[44];// byteHomeId[0] ,//H - broadBytes[0] = 0xfe; - broadBytes[1] = 0x29; - broadBytes[2] = 0x00; - broadBytes[3] = 0x00; - broadBytes[4] = 0x00; - broadBytes[5] = 0x00; - broadBytes[6] = 0x00; - broadBytes[43] = 0x02; while (true) { try { - if (string.IsNullOrEmpty(Shared.Common.Config.Instance.HomeId)) - { - //浣忓畢ID涓虹┖鍙湁涓�绉嶅彲鑳藉氨鏄��鍑轰簡鐧诲綍锛岃繖閲岀殑涓婁竴娆′綇瀹匢D瑕佹竻绌� - oldHomeID = "?"; - System.Threading.Thread.Sleep(1000); + if (FindGateWaySocket.udpClient == null || FindGateWaySocket.udpClient.Available <= 0) + { + System.Threading.Thread.Sleep(500); continue; - } - //棣栨杩涘叆缃戝叧锛屽拰鍒囨崲浣忓畢浼氭竻闄ょ綉鍏冲垪琛紝閲嶆柊鎼滅储瀛樺偍 - if (Shared.Common.Config.Instance.HomeId != oldHomeID) + } + var ipEndPoint = new System.Net.IPEndPoint(IPAddress.Any, 0); + var bytes = FindGateWaySocket.udpClient.Receive(ref ipEndPoint); + if (bytes.Length > 43 && bytes[43] == 0xA2) { - //鍥犱负閭d竴鐬棿锛屾湁鍙兘mqtt浼氬姞鍥炴潵,鎵�浠ュ厛鍔犵紦瀛� - var list = new List<ZbGateway>(); - list.AddRange(ZbGateway.GateWayList); - //鐒跺悗娓呯┖鎺� - ZbGateway.GateWayList.Clear(); - //鏈�鍚庡啀鏂紑mqtt杩炴帴 - for (int i = 0; i < list.Count; i++) + //骞挎挱鍥炲缃戝叧鐨勫熀鏈俊鎭鐞� + var ipAddress = $"{bytes[3]}.{bytes[4]}.{bytes[5]}.{bytes[6]}"; + var homeID = System.Text.Encoding.UTF8.GetString(bytes, 7, 36); + homeID = homeID.Replace('\0', ' ').Trim(); + var isMainGateWay = bytes[44] == 1; + var time = (bytes[48] & 0xff) << 24 | (bytes[47] & 0xff) << 16 | (bytes[46] & 0xff) << 8 | (bytes[45] & 0xff); + var gwNameLength = bytes[49]; + var gwName = System.Text.Encoding.UTF8.GetString(bytes, 50, gwNameLength); + var gwIdLength = bytes[49 + gwNameLength + 1]; + var id = Encoding.UTF8.GetString(bytes, 49 + gwNameLength + 2, gwIdLength); + var pubKeyLengthByte0 = bytes[49 + gwNameLength + 1 + gwIdLength + 1]; + var pubKeyLengthByte1 = bytes[49 + gwNameLength + 1 + gwIdLength + 2]; + int pubKeyLength = ((pubKeyLengthByte1 & 0xff) << 8 | (pubKeyLengthByte0 & 0xff)); + var pubKey = Encoding.UTF8.GetString(bytes, 49 + gwNameLength + 1 + gwIdLength + 2 + 1, pubKeyLength); + var zbGateWay = new ZbGateway { - list[i].DisConnectLocalMqttClient("1"); - } - list.Clear(); - oldHomeID = Shared.Common.Config.Instance.HomeId; - var tempBytes = System.Text.Encoding.UTF8.GetBytes(Shared.Common.Config.Instance.HomeId); - System.Array.Copy(tempBytes, 0, broadBytes, 7, 36 < tempBytes.Length ? 36 : tempBytes.Length); - //浣忓畢涓凡缁忓瓨鍦ㄧ殑缃戝叧濡傛灉灞�鍩熺綉涓嶅瓨鍦紝闇�瑕佸湪褰撳墠浣忓畢涓櫄鎷熶竴涓綉鍏矷D鐩稿悓鐨勭綉鍏� - var gateWayFileList = Global.FileListByHomeId().FindAll(obj => obj.StartsWith("Gateway_")); - foreach (var filePath in gateWayFileList) + GwIP = ipAddress, + GwName = gwName, + HomeId = homeID, + IsMainGateWay = isMainGateWay, + GwId = id, + PubKey = pubKey + }; + //閫氳鍒扮綉鍏冲垪琛� + if (listReceiveIP.Find(obj => obj == zbGateWay.GwId) == null) { - var paths = filePath.Split('_'); - if (paths.Length < 3) - continue; - - var gateWay = ZbGateway.GateWayList.Find(obj => (obj != null) && (obj.getGatewayBaseInfo != null) && (obj.getGatewayBaseInfo.gwID == paths[2])); - if (gateWay == null) - { - gateWay = new ZbGateway { IsVirtual = true }; - gateWay.getGatewayBaseInfo.gwID = paths[2]; - gateWay.getGatewayBaseInfo.HomeId = Shared.Common.Config.Instance.HomeId; - ZbGateway.GateWayList.Add(gateWay); - } - } - } - - var broadcastIpAddress = new Shared.Net.NetWiFi().BroadcastIpAddress; - - - if (Shared.Application.IsWifi) - { - if (0 < gateWayList.Count) - { - searchCount = 6; - ZbGateway.IsRemote = false; - //褰撶綉鍏崇殑杩炴帴鏂瑰紡鏀瑰彉鏃�,璁板綍褰撳墠鐨勮繛鎺ユ柟寮� - Shared.Phone.UserCenter.HdlGatewayLogic.Current.CheckGatewayByConnectChanged(Shared.Phone.UserCenter.GatewayConnectMode.WIFI); - } - else - { - if (searchCount < 0) + //缃戝叧鍖归厤褰撳墠浣忓畢涓埌缃戝叧 + if (Shared.Common.Config.Instance.HomeId == homeID) { - ZbGateway.IsRemote = true; - //褰撶綉鍏崇殑杩炴帴鏂瑰紡鏀瑰彉鏃�,璁板綍褰撳墠鐨勮繛鎺ユ柟寮� - Shared.Phone.UserCenter.HdlGatewayLogic.Current.CheckGatewayByConnectChanged(Shared.Phone.UserCenter.GatewayConnectMode.Remote); - } - } - } - else - { - ZbGateway.IsRemote = true; - //褰撶綉鍏崇殑杩炴帴鏂瑰紡鏀瑰彉鏃�,璁板綍褰撳墠鐨勮繛鎺ユ柟寮� - Shared.Phone.UserCenter.HdlGatewayLogic.Current.CheckGatewayByConnectChanged(Shared.Phone.UserCenter.GatewayConnectMode.Remote); - - for (int i = 0; i < ZbGateway.GateWayList.Count; i++) + listReceiveIP.Add(ipAddress); + } + //UI鐣岄潰姝e湪鎼滅储锛屼笉蹇呴厤褰撳墠浣忓畢鍒板埌缃戝叧姝ゆ椂涔熼�氳 + else if (IsSearchingGateway) + { + listReceiveIP.Add(ipAddress); + } + //2020.08.07杩藉姞:鍗充娇绌虹殑浣忓畢id涔熷缓绔嬮摼鎺�,瀵瑰簲鎵嬪姩鎭㈠缃戝叧鍑哄巶璁剧疆鏃�,鍥犱负娌℃湁瑙g粦,浣嗘槸浣忓畢id涓虹┖鐨勯棶棰� + else if (Shared.Phone.UserCenter.HdlGatewayLogic.Current.HomeIdIsEmpty(homeID) == true) + { + listReceiveIP.Add(ipAddress); + } + } + //缃戝叧鍒楄〃瀛樺偍澶勭悊 + var gateWay = ZbGateway.GateWayList.Find(obj => obj.GwId == zbGateWay.GwId); + if (gateWay == null) { - ZbGateway.GateWayList[i].DisConnectLocalMqttClient("1"); - } - } - - searchCount--; - - #region 1绉掓悳绱竴娆$綉鍏� - //姣�0.5绉掑箍鎾彂鐜颁竴娆$綉鍏筹紝鍏�1s - int count = 2; - new System.Threading.Thread(() => - { - gateWayList.Clear(); - while (0 < count--) - { - try - { - //鐐瑰鐐瑰彂閫�(鍏堝彂涓�鏉″凡鏈夌殑鐐规挱锛屽洖澶嶅嚑鐜囬珮涓�鐐癸級 - for (int i = 0; i < gateWayList.Count; i++) - { - FindGateWaySocket.BeginSend(new System.Net.IPEndPoint(System.Net.IPAddress.Parse(gateWayList[i].getGatewayBaseInfo.IpAddress), 7624), broadBytes); - } - //骞挎挱鍙戦�� - if (broadcastIpAddress.ToString() != "0.0.0.0") - { - FindGateWaySocket.BeginSend(new System.Net.IPEndPoint(broadcastIpAddress, 7624), broadBytes); - } - } - catch - { - //鍏抽棴Socket,涓嬫鍙戦�佷細鑷姩杩炴帴 - FindGateWaySocket.Stop(); - } - System.Threading.Thread.Sleep(500); - } - }) - { IsBackground = true }.Start(); - - while (0 < count) - { - try - { - if (FindGateWaySocket.busSocket == null) - { - System.Threading.Thread.Sleep(100); - continue; - } - var bytes = new byte[1024]; - - var len = FindGateWaySocket.busSocket.Receive(bytes, bytes.Length, System.Net.Sockets.SocketFlags.None); - - if (bytes[43] == 0xA2) - { - //骞挎挱鍥炲缃戝叧鐨勫熀鏈俊鎭鐞� - var ipAddress = $"{bytes[3]}.{bytes[4]}.{bytes[5]}.{bytes[6]}"; - var homeID = System.Text.Encoding.UTF8.GetString(bytes, 7, 36); - homeID = homeID.Replace('\0', ' ').Trim(); - var isMainGateWay = bytes[44] == 1; - var time = (bytes[48] & 0xff) << 24 | (bytes[47] & 0xff) << 16 | (bytes[46] & 0xff) << 8 | (bytes[45] & 0xff); - var gwNameLength = bytes[49]; - var gwName = System.Text.Encoding.UTF8.GetString(bytes, 50, gwNameLength); - var gwIdLength = bytes[49 + gwNameLength + 1]; - var id = Encoding.UTF8.GetString(bytes, 49 + gwNameLength + 2, gwIdLength); - var pubKeyLengthByte0 = bytes[49 + gwNameLength + 1 + gwIdLength + 1]; - var pubKeyLengthByte1 = bytes[49 + gwNameLength + 1 + gwIdLength + 2]; - int pubKeyLength = ((pubKeyLengthByte1 & 0xff) << 8 | (pubKeyLengthByte0 & 0xff)); - var pubKey = Encoding.UTF8.GetString(bytes, 49 + gwNameLength + 1 + gwIdLength + 2 + 1, pubKeyLength); - var zbGateWay = new ZbGateway - { - getGatewayBaseInfo = new ZbGateway.GatewayBaseInfo - { - IpAddress = ipAddress, - GwName = gwName, - HomeId = homeID, - IsMainGateWay = isMainGateWay, - gwID = id, - }, - GatewayOnlineFlage = true, - PubKey = pubKey - }; - //閫氳鍒扮綉鍏冲垪琛� - if (gateWayList.Find(obj => obj.getGatewayBaseInfo.gwID == zbGateWay.getGatewayBaseInfo.gwID) == null) - { - //缃戝叧鍖归厤褰撳墠浣忓畢涓埌缃戝叧 - if (Shared.Common.Config.Instance.HomeId == homeID) - { - gateWayList.Add(zbGateWay); - } - //UI鐣岄潰姝e湪鎼滅储锛屼笉蹇呴厤褰撳墠浣忓畢鍒板埌缃戝叧姝ゆ椂涔熼�氳 - else if (IsSearchingGateway) - { - gateWayList.Add(zbGateWay); - } - //缃戝叧涓埌浣忓畢ID涓虹┖姝ゆ椂涔熼�氳 2020.01.14鍙樻洿锛氭病杩欎釜蹇呰,涓婇潰閭d釜鍙橀噺灏辫兘澶勭悊 - //else if (homeID == string.Empty) - //{ - // gateWayList.Add(zbGateWay); - //} - } - //缃戝叧鍒楄〃瀛樺偍澶勭悊 - var gateWay = ZbGateway.GateWayList.Find(obj => obj.getGatewayBaseInfo != null && obj.getGatewayBaseInfo.gwID == zbGateWay.getGatewayBaseInfo.gwID); - if (gateWay == null) - { - ZbGateway.GateWayList.Add(zbGateWay); - await zbGateWay.StartLocalMqtt(ipAddress); - NewGateWayAction?.Invoke(zbGateWay); - } - else - { - gateWay.IsVirtual = false; - //灏嗚缃戝叧鏍囪瘑涓恒�愬彲鎼滅储鍒帮紝鍗筹細鍦ㄧ嚎銆� - gateWay.GatewayOnlineFlage = true; - if (gateWay.getGatewayBaseInfo.IpAddress != ipAddress) - { - await gateWay.DisConnectLocalMqttClient("2"); - ZbGateway.GateWayList.Remove(gateWay); - gateWay = zbGateWay; - ZbGateway.GateWayList.Add(gateWay); - await zbGateWay.StartLocalMqtt(ipAddress); - } - else - { - gateWay.PubKey = pubKey; - gateWay.getGatewayBaseInfo.GwName = gwName; - gateWay.getGatewayBaseInfo.HomeId = homeID; - await gateWay.StartLocalMqtt(ipAddress); - } - - //涓荤綉鍏宠缃� - if (isMainGateWay && oldHomeID == gateWay.getGatewayBaseInfo.HomeId) - { - for (int i = 0; i < ZbGateway.GateWayList.Count; i++) - { - var gw = ZbGateway.GateWayList[i]; - //缃戝叧ID涓嶆槸褰撳墠鐨勭綉鍏筹紝鍒欐妸缃戝叧鍒楄〃涓叾浠栫綉鍏虫爣璁颁负涓嶆槸涓荤綉鍏� - if (gw.getGatewayBaseInfo.gwID != id && oldHomeID == gw.getGatewayBaseInfo.HomeId) - { - gw.getGatewayBaseInfo.IsMainGateWay = false; - } - } - //鏍囪褰撳墠缃戝叧鏄富缃戝叧 - gateWay.getGatewayBaseInfo.IsMainGateWay = true; - } - } + //鍒锋柊缃戝叧鐨勫湪绾挎椂闂寸偣 + Shared.Phone.UserCenter.HdlGatewayLogic.Current.RefreshGatewayOnlineTime(zbGateWay.GwId); - //娴嬭瘯鑳藉惁骞挎挱寰楀埌缃戝叧,閫氬父鎯呭喌涓嬩笉妫�娴� - if (Shared.Phone.UserCenter.UserCenterResourse.HideOption.CheckCanReceiveGateway == 1) - { - if (Shared.Phone.UserCenter.UserCenterResourse.DicReceiveGatewayTest.ContainsKey(id) == false) - { - if (gateWay == null) - { - Shared.Phone.UserCenter.UserCenterResourse.DicReceiveGatewayTest[id] = zbGateWay; - } - else - { - Shared.Phone.UserCenter.UserCenterResourse.DicReceiveGatewayTest[id] = gateWay; - } - } - } - } + ZbGateway.GateWayList.Add(zbGateWay); + await zbGateWay.StartLocalMqtt(ipAddress); } - catch - { - //鍏抽棴Socket,涓嬫鍙戦�佷細鑷姩杩炴帴 - FindGateWaySocket.Stop(); + else + { + //鍒锋柊缃戝叧鐨勫湪绾挎椂闂寸偣 + Shared.Phone.UserCenter.HdlGatewayLogic.Current.RefreshGatewayOnlineTime(gateWay.GwId); + + gateWay.IsVirtual = false; + if (gateWay.GwIP != ipAddress) + { + await gateWay.DisConnectLocalMqttClient("2"); + ZbGateway.GateWayList.Remove(gateWay); + gateWay = zbGateWay; + ZbGateway.GateWayList.Add(gateWay); + await zbGateWay.StartLocalMqtt(ipAddress); + } + else + { + gateWay.PubKey = pubKey; + gateWay.GwName = gwName; + gateWay.HomeId = homeID; + await gateWay.StartLocalMqtt(ipAddress); + } + + //涓荤綉鍏宠缃� + if (isMainGateWay && oldHomeID == gateWay.HomeId) + { + for (int i = 0; i < ZbGateway.GateWayList.Count; i++) + { + var gw = ZbGateway.GateWayList[i]; + //缃戝叧ID涓嶆槸褰撳墠鐨勭綉鍏筹紝鍒欐妸缃戝叧鍒楄〃涓叾浠栫綉鍏虫爣璁颁负涓嶆槸涓荤綉鍏� + if (gw.GwId != id && oldHomeID == gw.HomeId) + { + gw.IsMainGateWay = false; + } + } + //鏍囪褰撳墠缃戝叧鏄富缃戝叧 + gateWay.IsMainGateWay = true; + } + } + + //娴嬭瘯鑳藉惁骞挎挱寰楀埌缃戝叧,閫氬父鎯呭喌涓嬩笉妫�娴� + if (Shared.Phone.UserCenter.UserCenterResourse.HideOption.CheckCanReceiveGateway == 1) + { + if (Shared.Phone.UserCenter.UserCenterResourse.DicReceiveGatewayTest == null) + { + //闃叉寮傚父,铏界劧鍑犵巼寰堜綆 + Shared.Phone.UserCenter.UserCenterResourse.HideOption.CheckCanReceiveGateway = 0; + continue; + } + if (Shared.Phone.UserCenter.UserCenterResourse.DicReceiveGatewayTest.ContainsKey(id) == false) + { + if (gateWay == null) + { + Shared.Phone.UserCenter.UserCenterResourse.DicReceiveGatewayTest[id] = zbGateWay; + } + else + { + Shared.Phone.UserCenter.UserCenterResourse.DicReceiveGatewayTest[id] = gateWay; + } + } } } - #endregion + else + { + //璋冭瘯鐢� + if (Shared.Phone.UserCenter.UserCenterResourse.HideOption.WriteSocketReceiveDataToFile == 1) + { + var data33 = Encoding.UTF8.GetString(bytes).Replace("锟�)", string.Empty).TrimStart('\0').TrimEnd('\0'); + Shared.Phone.UserCenter.HdlLogLogic.Current.WriteLog(3, data33); + } + } + await System.Threading.Tasks.Task.Delay(20); } - catch { } - System.Threading.Thread.Sleep(500); + catch (Exception ex) + { + //璋冭瘯鐢� + if (Shared.Phone.UserCenter.UserCenterResourse.HideOption.WriteSocketReceiveDataToFile == 1) + { + Shared.Phone.UserCenter.HdlLogLogic.Current.WriteLog(3, "Receive寮傚父\r\n" + ex.Message); + } + } } }) { IsBackground = true }.Start(); + } - ///杩滅▼涓荤綉鍏虫洿鏂� + #endregion + + #region 鈻� 寮�鍚繙绋嬭繛鎺______________________ + + /// <summary> + /// 寮�鍚繙绋嬭繛鎺� + /// </summary> + private static void StartRemoteMqtt() + { new System.Threading.Thread(async () => { while (true) @@ -317,6 +325,10 @@ { IsBackground = true }.Start(); } + #endregion + + #region 鈻� 涓�鑸柟娉昣__________________________ + /// <summary> /// 閲嶆柊鎼滅储,娉ㄦ剰锛氳皟鐢ㄨ鏂规硶,鍒欎績浣垮叏閮ㄧ綉鍏崇殑mqtt鍏ㄩ儴鏂紑,鐒跺悗閲嶆柊鎼滅储(鍙兘浼氭湁1绉掑欢杩�) /// </summary> @@ -324,7 +336,65 @@ { //涓轰簡閭d箞澶氬皯涓囧垎涔嬩竴鐨勫嚑鐜�,杩欓噷璁剧疆鎴愬埆鐨勫彟涓�绫荤殑鍊� oldHomeID = "**"; + } + + /// <summary> + /// 妫�娴嬭兘鍚﹀彂閫佸箍鎾�(0:涓嶈兘鍙戦�佸箍鎾� 1:鍙互鍙戦�佸箍鎾� 2:浣忓畢ID鍙樻洿) + /// </summary> + /// <returns></returns> + private static int CheckCanSendBroadcast() + { + if (string.IsNullOrEmpty(Config.Instance.HomeId)) + { + //浣忓畢ID涓虹┖鍙湁涓�绉嶅彲鑳藉氨鏄��鍑轰簡鐧诲綍锛岃繖閲岀殑涓婁竴娆′綇瀹匢D瑕佹竻绌� + oldHomeID = "?"; + System.Threading.Thread.Sleep(1000); + return 0; + } + //棣栨杩涘叆缃戝叧锛屽拰鍒囨崲浣忓畢浼氭竻闄ょ綉鍏冲垪琛紝閲嶆柊鎼滅储瀛樺偍 + if (Config.Instance.HomeId == oldHomeID) + { + return 1; + } + + //鍥犱负閭d竴鐬棿锛屾湁鍙兘mqtt浼氬姞鍥炴潵,鎵�浠ュ厛鍔犵紦瀛� + var list = new List<ZbGateway>(); + list.AddRange(ZbGateway.GateWayList); + //鐒跺悗娓呯┖鎺� + ZbGateway.GateWayList.Clear(); + //鏈�鍚庡啀鏂紑mqtt杩炴帴 + for (int i = 0; i < list.Count; i++) + { + list[i]?.DisConnectLocalMqttClient("1"); + } + list.Clear(); + + //浣忓畢涓凡缁忓瓨鍦ㄧ殑缃戝叧濡傛灉灞�鍩熺綉涓嶅瓨鍦紝闇�瑕佸湪褰撳墠浣忓畢涓櫄鎷熶竴涓綉鍏矷D鐩稿悓鐨勭綉鍏� + var gateWayFileList = Global.FileListByHomeId().FindAll(obj => obj.StartsWith("Gateway_")); + foreach (var filePath in gateWayFileList) + { + var paths = filePath.Split('_'); + if (paths.Length < 3) + continue; + + var gateWay = ZbGateway.GateWayList.Find(obj => (obj != null) && (obj.GwId == paths[2])); + if (gateWay == null) + { + gateWay = new ZbGateway { IsVirtual = true }; + gateWay.GwId = paths[2]; + gateWay.HomeId = Config.Instance.HomeId; + ZbGateway.GateWayList.Add(gateWay); + } + } + //浣忓畢ID鍙樻洿 + oldHomeID = Config.Instance.HomeId; + + return 2; } + + #endregion + + #region 鈻� Socket_____________________________ /// <summary> /// 鎺ユ敹澶勭悊UDP鏁版嵁鍖� @@ -333,24 +403,35 @@ public static class FindGateWaySocket { //鏈湴Socket - public static System.Net.Sockets.Socket busSocket; + public static UdpClient udpClient; /// <summary> /// 鍚姩Socket鎺ユ敹鍜屽彂閫佸姛鑳� /// </summary> /// <param name="port"></param> - public static void Start(int port = 7624) + public static bool Start() { - if (IsRunning) + if (udpClient != null) { - return; + return true; } - //瀹氫箟缃戠粶绫诲瀷锛屾暟鎹繛鎺ョ被鍨嬪拰缃戠粶鍗忚UDP - busSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); - busSocket.EnableBroadcast = true; - busSocket.ReceiveTimeout = 1000; - busSocket.SendTimeout = 1000; - busSocket.Bind(new IPEndPoint(IPAddress.Any, port)); + + //鑾峰彇鎵嬫満鐨剋ifi鍦板潃 +#if Android + var netwifi = new Shared.Net.NetWiFi(); + string phoneIp = netwifi.GetIPAddress(); +#endif +#if iOS + string phoneIp = Shared.Net.NetWiFi.GetIPAddress(); +#endif + //"127.0.0.1"鏄簳灞傚簱閲岄潰璁剧疆鐨勫垵濮嬮粯璁ゅ�� + if (phoneIp != "127.0.0.1") + { + udpClient = new UdpClient(new IPEndPoint(IPAddress.Parse(phoneIp), 7624)); + udpClient.EnableBroadcast = true; + return true; + } + return false; } /// <summary> @@ -358,29 +439,14 @@ /// </summary> public static void Stop() { - if (!IsRunning) - { - return; - } try { - busSocket.Close(); + udpClient?.Close(); } catch { } - busSocket = null; + udpClient = null; Console.WriteLine("BusSocket鍏抽棴鎴愬姛!"); - } - - /// <summary> - /// 褰撳墠鐨凷ocket鏄惁杩愯 - /// </summary> - public static bool IsRunning - { - get - { - return null == busSocket ? false : true; - } } /// <summary> @@ -391,24 +457,33 @@ { try { - Start(7624); - busSocket.BeginSendTo(bytes, 0, bytes.Length, SocketFlags.None, iPEndPoint, new AsyncCallback(asyncEndSend), null); + if (Start() == false) + { + //璋冭瘯鐢� + if (Shared.Phone.UserCenter.UserCenterResourse.HideOption.WriteSocketReceiveDataToFile == 1) + { + Shared.Phone.UserCenter.HdlLogLogic.Current.WriteLog(3, "udp New涓嶈捣鏉�"); + } + return; + } + int value = udpClient.Send(bytes, bytes.Length, iPEndPoint); + //璋冭瘯鐢� + if (Shared.Phone.UserCenter.UserCenterResourse.HideOption.WriteSocketReceiveDataToFile == 1) + { + Shared.Phone.UserCenter.HdlLogLogic.Current.WriteLog(3, "鍙戦�侀暱搴�(BeginSendTo)锛�" + value + " 鍙戦�佸唴瀹�:" + System.Text.Encoding.UTF8.GetString(bytes)); + } } - catch { } - } - - /// <summary> - /// 寮傛鍙戦�佹暟鎹粨鏉� - /// </summary> - /// <param name="iar"></param> - private static void asyncEndSend(IAsyncResult iar) - { - try - { - int bytesSent = busSocket.EndSendTo(iar); + catch (Exception ex) + { + //璋冭瘯鐢� + if (Shared.Phone.UserCenter.UserCenterResourse.HideOption.WriteSocketReceiveDataToFile == 1) + { + Shared.Phone.UserCenter.HdlLogLogic.Current.WriteLog(3, "鍙戦�佸紓甯�(BeginSendTo)\r\n" + ex.Message); + } } - catch { } } } + + #endregion } -} +} \ No newline at end of file -- Gitblit v1.8.0