From f1c3921b08bb22ac6f5db22d620e01d7e8e5c49f Mon Sep 17 00:00:00 2001
From: WJC <wjc@hdlchina.com.cn>
Date: 星期一, 30 十二月 2019 13:32:33 +0800
Subject: [PATCH] 2019-12-30-1

---
 ZigbeeApp/GateWay.Ios/Reachability.cs |  151 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 151 insertions(+), 0 deletions(-)

diff --git a/ZigbeeApp/GateWay.Ios/Reachability.cs b/ZigbeeApp/GateWay.Ios/Reachability.cs
new file mode 100755
index 0000000..550e87e
--- /dev/null
+++ b/ZigbeeApp/GateWay.Ios/Reachability.cs
@@ -0,0 +1,151 @@
+锘縰sing System;
+using System.Net;
+using CoreFoundation;
+using SystemConfiguration;
+
+namespace GateWay.Ios
+{
+    public enum NetworkStatus
+    {
+        NotReachable = 0,
+        ReachableViaCarrierDataNetwork = 1,
+        ReachableViaWiFiNetwork = 2
+    }
+
+    public static class Reachability
+    {
+        public static string HostName = "service.hdlcontrol.com";
+
+        public static bool IsReachableWithoutRequiringConnection (NetworkReachabilityFlags flags)
+        {
+            // Is it reachable with the current network configuration?
+            bool isReachable = (flags & NetworkReachabilityFlags.Reachable) != 0;
+
+            // Do we need a connection to reach it?
+            bool noConnectionRequired = (flags & NetworkReachabilityFlags.ConnectionRequired) == 0
+                || (flags & NetworkReachabilityFlags.IsWWAN) != 0;
+
+            return isReachable && noConnectionRequired;
+        }
+
+        // Is the host reachable with the current network configuration
+        public static bool IsHostReachable (string host)
+        {
+            if (string.IsNullOrEmpty (host))
+                return false;
+
+            using (var r = new NetworkReachability (host)) {
+                NetworkReachabilityFlags flags;
+
+                if (r.TryGetFlags (out flags))
+                    return IsReachableWithoutRequiringConnection (flags);
+            }
+            return false;
+        }
+
+        //
+        // Raised every time there is an interesting reachable event,
+        // we do not even pass the info as to what changed, and
+        // we lump all three status we probe into one
+        //
+        public static event EventHandler ReachabilityChanged;
+
+        static void OnChange (NetworkReachabilityFlags flags)
+        {
+            var h = ReachabilityChanged;
+            if (h != null)
+                h (null, EventArgs.Empty);
+        }
+
+        //
+        // Returns true if it is possible to reach the AdHoc WiFi network
+        // and optionally provides extra network reachability flags as the
+        // out parameter
+        //
+        static NetworkReachability adHocWiFiNetworkReachability;
+
+        public static bool IsAdHocWiFiNetworkAvailable (out NetworkReachabilityFlags flags)
+        {
+            if (adHocWiFiNetworkReachability == null) {
+                adHocWiFiNetworkReachability = new NetworkReachability (new IPAddress (new byte [] { 115, 29, 191, 136 }));
+                adHocWiFiNetworkReachability.SetNotification (OnChange);
+                adHocWiFiNetworkReachability.Schedule (CFRunLoop.Current, CFRunLoop.ModeDefault);
+            }
+
+            return adHocWiFiNetworkReachability.TryGetFlags (out flags) && IsReachableWithoutRequiringConnection (flags);
+        }
+
+        static NetworkReachability defaultRouteReachability;
+
+        static bool IsNetworkAvailable (out NetworkReachabilityFlags flags)
+        {
+            if (defaultRouteReachability == null) {
+                defaultRouteReachability = new NetworkReachability (new IPAddress (new byte [] { 115, 29, 191, 136 }));
+                defaultRouteReachability.SetNotification (OnChange);
+                defaultRouteReachability.Schedule (CFRunLoop.Current, CFRunLoop.ModeDefault);
+            }
+            return defaultRouteReachability.TryGetFlags (out flags) && IsReachableWithoutRequiringConnection (flags);
+        }
+
+        static NetworkReachability remoteHostReachability;
+
+        public static NetworkStatus RemoteHostStatus ()
+        {
+            NetworkReachabilityFlags flags;
+            bool reachable;
+
+            if (remoteHostReachability == null) {
+                remoteHostReachability = new NetworkReachability (HostName);
+
+                // Need to probe before we queue, or we wont get any meaningful values
+                // this only happens when you create NetworkReachability from a hostname
+                reachable = remoteHostReachability.TryGetFlags (out flags);
+
+                remoteHostReachability.SetNotification (OnChange);
+                remoteHostReachability.Schedule (CFRunLoop.Current, CFRunLoop.ModeDefault);
+            } else {
+                reachable = remoteHostReachability.TryGetFlags (out flags);
+            }
+
+            if (!reachable)
+                return NetworkStatus.NotReachable;
+
+            if (!IsReachableWithoutRequiringConnection (flags))
+                return NetworkStatus.NotReachable;
+
+            return (flags & NetworkReachabilityFlags.IsWWAN) != 0 ?
+                NetworkStatus.ReachableViaCarrierDataNetwork : NetworkStatus.ReachableViaWiFiNetwork;
+        }
+
+        public static NetworkStatus InternetConnectionStatus ()
+        {
+            NetworkReachabilityFlags flags;
+            bool defaultNetworkAvailable = IsNetworkAvailable (out flags);
+            if (defaultNetworkAvailable && ((flags & NetworkReachabilityFlags.IsDirect) != 0))
+                return NetworkStatus.NotReachable;
+            else if ((flags & NetworkReachabilityFlags.IsWWAN) != 0)
+                return NetworkStatus.ReachableViaCarrierDataNetwork;
+            else if (flags == 0)
+                return NetworkStatus.NotReachable;
+            return NetworkStatus.ReachableViaWiFiNetwork;
+        }
+
+        public static bool Online ()
+        {
+            NetworkReachabilityFlags flags;
+            bool defaultNetworkAvailable = IsNetworkAvailable (out flags);
+            return defaultNetworkAvailable;
+        }
+
+
+        public static NetworkStatus LocalWifiConnectionStatus ()
+        {
+            NetworkReachabilityFlags flags;
+            if (IsAdHocWiFiNetworkAvailable (out flags))
+                if ((flags & NetworkReachabilityFlags.IsDirect) != 0)
+                    return NetworkStatus.ReachableViaWiFiNetwork;
+
+            return NetworkStatus.NotReachable;
+        }
+    }
+}

--
Gitblit v1.8.0