示例#1
0
        public static void initWifiConnection(GTM.GHIElectronics.WiFi_RS21 wifi, string wlanName, string wlanPassword)
        {
            Debug.Print("connecting to: " + wlanName);
            if (wifi.Interface.IsOpen)
            {
                Debug.Print("interface was open");
            }
            else
            {
                Debug.Print("interface was not open");
                wifi.Interface.Open();
            }

            wifi.Interface.WirelessConnectivityChanged +=
                new WiFiRS9110.WirelessConnectivityChangedEventHandler((s, e) =>
            {
                Debug.Print("wifi conn changed!");
                if (e.IsConnected) { Debug.Print("WIFI (" + wlanName + ") connected!"); }
                else { Debug.Print("WIFI (" + wlanName + ") disconnected.."); }
            });

            wifi.DebugPrintEnabled = true;
            wifi.UseDHCP();

            GHI.Premium.Net.WiFiNetworkInfo info = new WiFiNetworkInfo();
            info.SSID = wlanName;
            info.SecMode = GHI.Premium.Net.SecurityMode.WPA2;
            info.networkType = GHI.Premium.Net.NetworkType.AccessPoint;

            wifi.Interface.Join(info, wlanPassword);
            wifi.UseThisNetworkInterface();
        }
示例#2
0
 internal bool Matches(WiFiNetworkInfo ap)
 {
     if (ap == null)
     {
         return(false);
     }
     if (!Prefix)
     {
         return(ap.SSID == SSID);
     }
     return(ap.SSID.Length >= SSID.Length && ap.SSID.Substring(0, SSID.Length) == SSID);
 }
示例#3
0
        void Interface_NetworkAddressChanged(object sender, EventArgs e)
        {
            try
            {
                if (wifi.Interface.IsLinkConnected)
                {
                    Debug.Print("WiFi up with AP " + currentAP.SSID);
                    Debug.Print("IP Address: " + wifi.Interface.NetworkInterface.IPAddress);
                    Debug.Print("Subnet Mask: " + wifi.Interface.NetworkInterface.SubnetMask);
                    Debug.Print("Gateway: " + wifi.Interface.NetworkInterface.GatewayAddress);

                    var dnsAddresses = wifi.Interface.NetworkInterface.DnsAddresses;
                    Debug.Print("DNS Server: " + (dnsAddresses == null ? "NULL" : (dnsAddresses.Length == 0 ? "none" : dnsAddresses[0])));
                    Debug.Print("Elapsed time from join: " + (GT.Timer.GetMachineTime() - joinTime).Seconds + "s");
                    wifiConnected = true;
                    SetScreen();
                    SetLed();
                    //SendUDPBroadcast();

                    WebServer.StartLocalServer(wifi.Interface.NetworkInterface.IPAddress, 80);

                    if (ConnectedToHomeNetwork)
                    {
                        OnHomeNetworkJoined();
                    }
                }
                else
                {
                    wifiConnected = false;
                    WebServer.StopLocalServer();
                    SetLed();
                    SetScreen();
                    Debug.Print("Wifi down");
                    if (firstDown)
                    {
                        firstDown = false;
                    }
                    else
                    {
                        currentAP = null;
                    }
                }
            }
            catch (Exception ex)
            {
                Debug.Print("Exception in Interface_WirelessConnectivityChanged: " + ex);
            }
        }
示例#4
0
        /// <summary>
        /// Should be called by an application when the home network credentials should be forgotten, e.g. after a reset button is held down.
        /// </summary>
        public void ResetNetworkCredentials()
        {
            Debug.Print("Forgetting home wireless network credentials");

            wifiNetworks.Clear();
            if (EnableWifiSetupNetworks)
            {
                APDetails.AddSetupAPs(wifiNetworks);
            }
            SaveData();

            WebServer.StopLocalServer();
            currentAP = null;
            SetLed();
            wifi.Interface.Disconnect();
        }
示例#5
0
文件: WiFiManager.cs 项目: radtek/MFE
        public void Start()
        {
            if (OpenWiFi() && EnableDHCP())
            {
                NetworkInterfaceExtension.AssignNetworkingStackTo(wifi);

                WiFiNetworkInfo ni = SearchForNetwork();

                if (!Join(ni))
                {
                    if (Stopped != null)
                    {
                        Stopped(this, EventArgs.Empty);
                    }
                }
            }
        }
示例#6
0
 // Step 3. Network Timer
 void NetworkTimer_Tick(GT.Timer timer)
 {
     if (NetworkTimer.IsRunning == true)
     {
         wifi_RS21.Interface.Open();
         wifi_RS21.UseDHCP();
         WiFiNetworkInfo info = new WiFiNetworkInfo();
         info.SSID              = SSID;
         info.SecMode           = SecurityMode.WPA2;
         info.networkType       = NetworkType.AccessPoint;
         wifi_RS21.NetworkUp   -= wifi_RS21_NetworkUp;
         wifi_RS21.NetworkDown -= wifi_RS21_NetworkDown;
         wifi_RS21.NetworkUp   += wifi_RS21_NetworkUp;
         wifi_RS21.NetworkDown += wifi_RS21_NetworkDown;
         wifi_RS21.Interface.Join(info, PASSWORD);
     }
 }
示例#7
0
        // secure reception of wifi credentials over wifi network - secured by receiving secret
        void CredentialsWebEventReceived(string path, WebServer.HttpMethod method, Responder responder)
        {
            if (responder.UrlParameters == null || !responder.UrlParameters.Contains("ssid") || !responder.UrlParameters.Contains("setupauthcode"))
            {
                responder.Respond("ERROR::Syntax: " + path + "?ssid=SSID&setupauthcode=SETUPAUTHCODE[&key=WIFIKEY]");
                return;
            }
            if (((string)responder.UrlParameters["setupauthcode"]) != SetupAuthCode)
            {
                responder.Respond("ERROR::Incorrect setupauthcode");
                return;
            }
            var ssid = responder.UrlParameters["ssid"] as string;

            if (ssid == null || ssid == "")
            {
                responder.Respond("ERROR::Invalid SSID");
                return;
            }
            var key = "";

            if (responder.UrlParameters.Contains("key"))
            {
                key = responder.UrlParameters["key"] as string;
            }
            Debug.Print("Received (via web event) credentials for network " + ssid);
            bool newcreds = ReceivedCredentials(ssid, key);

            if (newcreds)
            {
                responder.Respond("OK::Got new credentials");
                SaveData();
                Thread.Sleep(10);
                WebServer.StopLocalServer();
                currentAP = null;
                SetLed();
                SetScreen();
                wifi.Interface.Disconnect();
            }
            else
            {
                responder.Respond("OK::Already had those");
            }
        }
示例#8
0
文件: WiFiManager.cs 项目: radtek/MFE
        private bool Join(WiFiNetworkInfo ni)
        {
            if (wifi.IsLinkConnected)
            {
                return(true);
            }

            try
            {
                Debug.Print("Connecting to " + ni.SSID + "...");
                //blocker.Reset();
                wifi.Join(ni, password);

                while (wifi.NetworkInterface.IPAddress == "0.0.0.0")
                {
                    Debug.Print("Waiting for IPAddress");
                    Thread.Sleep(250);
                }
            }
            catch (NetworkInterfaceExtensionException e)
            {
                switch (e.errorCode)
                {
                case NetworkInterfaceExtensionException.ErrorCode.AuthenticationFailed: Debug.Print("AuthenticationFailed"); break;

                //case NetworkInterfaceExtensionException.ErrorCode.AlreadyActivated: break;
                default: Debug.Print(e.errorCode.ToString()); break;
                }
                //Debug.Print("Error Message: " + e.ErrorMsg);
                //if (e.errorCode != NetworkInterfaceExtensionException.ErrorCode.AlreadyActivated)
                return(false);
            }
            catch (Exception e)
            {
                Debug.Print("Error Message: " + e.Message);
                return(false);
            }

            Debug.Print("Done connecting...\n");
            //blocker.WaitOne();
            Debug.Print("We got NetworkAvailable event. WiFi link is ready!\n");

            return(true);
        }
示例#9
0
文件: WiFiManager.cs 项目: radtek/MFE
        private static string WiFiNetworkInfoToString(WiFiNetworkInfo info)
        {
            string str = "SSID: " + info.SSID + "\n";

            str += "Channel Number: " + info.ChannelNumber + "\n";
            str += "RSSI: -" + info.RSSI + "dB" + "\n";
            str += "Security Mode: ";
            switch (info.SecMode)
            {
            case SecurityMode.Open: str += "Open"; break;

            case SecurityMode.WEP: str += "WEP"; break;

            case SecurityMode.WPA: str += "WPA"; break;

            case SecurityMode.WPA2: str += "WPA2"; break;
            }
            ;
            str += "\n";
            str += "Network Type: ";
            switch (info.networkType)
            {
            case NetworkType.AccessPoint: str += "Access Point"; break;

            case NetworkType.AdHoc: str += "AdHoc"; break;
            }
            str += "\n";
            str += "BS MAC: " +
                   Utils.ByteToHex(info.PhysicalAddress[0]) + "-" +
                   Utils.ByteToHex(info.PhysicalAddress[1]) + "-" +
                   Utils.ByteToHex(info.PhysicalAddress[2]) + "-" +
                   Utils.ByteToHex(info.PhysicalAddress[3]) + "-" +
                   Utils.ByteToHex(info.PhysicalAddress[4]) + "-" +
                   Utils.ByteToHex(info.PhysicalAddress[5]);
            str += "\n";

            return(str);
        }
示例#10
0
        void wifiTimer_Tick(GT.Timer timer)
        {
            Debug.Print("wifiTimer start - currentAP " + (currentAP != null ? currentAP.SSID : "(null)") + " wifiUp " + wifiConnected + (wifiConnected ? " IP " + wifi.Interface.NetworkInterface.IPAddress : ""));
            if (sp != null)
            {
                var spMessage = BroadcastMessageWithNewline;
                sp.Write(spMessage, 0, spMessage.Length);
            }
            if (SkipWifiTimer())
            {
                Debug.Print("aborting wifitimer tick since SkipWifiTimer delegate is true");
                return;
            }

            if (wifiConnected && currentAP == null)
            {
                Debug.Print("ERROR: wifi is up but current AP is null! Disconnecting.");
                currentAP     = null;
                wifiConnected = false;
                SetLed();
                SetScreen();
                wifi.Interface.Disconnect();
                WebServer.StopLocalServer();
                return;
            }

            if (currentAP != null && !wifiConnected)
            {
                wifiUpTime++;
                if (wifiUpTime == wifiUpTimeout)
                {
                    Debug.Print("WARN: starting wifi for " + currentAP.SSID + " timeout - resetting currentAP");
                    currentAP     = null;
                    wifiConnected = false;
                    SetLed();
                    SetScreen();
                    wifi.Interface.Disconnect();
                    WebServer.StopLocalServer();
                    return;
                }
            }

            if (wifiConnected && currentAP != null && APDetails.IsSetupAP(currentAP))
            {
                if (GT.Timer.GetMachineTime() - joinTime > maxTimeOnSetupNetwork)
                {
                    Debug.Print("Disconnecting from setup AP due to timeout (setup should not take this long)");
                    currentAP     = null;
                    wifiConnected = false;
                    SetLed();
                    SetScreen();
                    wifi.Interface.Disconnect();
                    WebServer.StopLocalServer();
                    return;
                }
                else
                {
                    // only sending unsolicited beacons when we're not on the home network
                    Debug.Print("Sending unsolicited UDP beacon since we're on a setup network");
                    SendUDPBroadcast(BeaconPort);
                }
            }

            if (wifiConnected && currentAP != null)
            {
                if (!WebServer.IsRunning())
                {
                    WebServer.StartLocalServer(wifi.Interface.NetworkInterface.IPAddress, 80);
                }
            }

            // skip scanning when connected since it fails
            if (currentAP == null)
            {
                try
                {
                    var scan = wifi.Interface.Scan();
                    Thread.Sleep(1);
                    foreach (var ap in scan)
                    {
                        Debug.Print("Scanned AP " + ap.SSID + " rssi " + ap.RSSI);
                    }
                    if (scan != null)
                    {
                        foreach (APDetails knownAP in wifiNetworks)
                        {
                            // APs are in priority order, so break once we see the current ap
                            if (knownAP.Matches(currentAP))
                            {
                                break;
                            }
                            WiFiNetworkInfo joinAP = null;
                            foreach (var scanAP in scan)
                            {
                                if (!knownAP.Matches(scanAP))
                                {
                                    continue;
                                }
                                if (joinAP == null)
                                {
                                    joinAP = scanAP;
                                }
                                if (joinAP.RSSI > scanAP.RSSI)
                                {
                                    joinAP = scanAP;                            // lower RSSI is better
                                }
                            }
                            if (joinAP == null)
                            {
                                continue;
                            }

                            try
                            {
                                if (currentAP != null)
                                {
                                    Debug.Print("Disconnecting from WiFi network " + currentAP + " to join " + joinAP.SSID);
                                    wifi.Interface.Disconnect();
                                }

                                //// stop pictimeout and any streaming since wifi join operation hogs processor
                                //picTimeout.Stop();
                                //camera.StopStreamingBitmaps();

                                joinTime = GT.Timer.GetMachineTime();
                                Debug.Print("Joining WiFi network " + joinAP.SSID + " rssi " + joinAP.RSSI);
                                //wifi.Interface.();
                                currentAP = joinAP;
                                SetLed();
                                SetScreen();
                                wifi.Interface.Join(joinAP, knownAP.Key);
                                //Debug.Print("Joined WiFi network " + scanAP.SSID);
                                wifiUpTime = 0;
                                break;
                            }
                            catch
                            {
                                Debug.Print("Error joining wifi network: " + joinAP.SSID);
                                wifi.Interface.Disconnect();
                                timer.Stop();
                                timer.Start();
                                currentAP = null;
                                SetLed();
                                SetScreen();
                                break;
                            }
                        }
                    }
                }
                catch (GHI.Premium.Net.NetworkInterfaceExtensionException wex)
                {
                    wifi.Interface.Disconnect();
                    // restart the timer to prevent it immediately firing again
                    timer.Stop();
                    timer.Start();
                    Debug.Print("Error scanning wifi networks: " + wex);
                    currentAP = null;
                    setLedError();
                    setScreenError();
                }
            }
            Debug.Print("wifiTimer end - currentAP " + (currentAP != null ? currentAP.SSID : "(null)") + " wifiUp " + wifiConnected);
        }
示例#11
0
 internal static bool IsSetupAP(WiFiNetworkInfo ap)
 {
     return(SetupSecretAPNew.Matches(ap) || SetupSecretAP.Matches(ap) || SetupOpenAP.Matches(ap));
 }
 internal bool Matches(WiFiNetworkInfo ap)
 {
     if (ap == null) return false;
     if (!Prefix)
     {
         return ap.SSID == SSID;
     }
     return ap.SSID.Length >= SSID.Length && ap.SSID.Substring(0, SSID.Length) == SSID;
 }
示例#13
0
        private static string WiFiNetworkInfoToString(WiFiNetworkInfo info)
        {
            string str = "SSID: " + info.SSID + "\n";
            str += "Channel Number: " + info.ChannelNumber + "\n";
            str += "RSSI: -" + info.RSSI + "dB" + "\n";
            str += "Security Mode: ";
            switch (info.SecMode)
            {
                case SecurityMode.Open: str += "Open"; break;
                case SecurityMode.WEP: str += "WEP"; break;
                case SecurityMode.WPA: str += "WPA"; break;
                case SecurityMode.WPA2: str += "WPA2"; break;
            };
            str += "\n";
            str += "Network Type: ";
            switch (info.networkType)
            {
                case NetworkType.AccessPoint: str += "Access Point"; break;
                case NetworkType.AdHoc: str += "AdHoc"; break;
            }
            str += "\n";
            str += "BS MAC: " +
                Utils.ByteToHex(info.PhysicalAddress[0]) + "-" +
                Utils.ByteToHex(info.PhysicalAddress[1]) + "-" +
                Utils.ByteToHex(info.PhysicalAddress[2]) + "-" +
                Utils.ByteToHex(info.PhysicalAddress[3]) + "-" +
                Utils.ByteToHex(info.PhysicalAddress[4]) + "-" +
                Utils.ByteToHex(info.PhysicalAddress[5]);
            str += "\n";

            return str;
        }
示例#14
0
        private bool Join(WiFiNetworkInfo ni)
        {
            if (wifi.IsLinkConnected)
                return true;

            try
            {
                Debug.Print("Connecting to " + ni.SSID + "...");
                //blocker.Reset();
                wifi.Join(ni, password);

                while (wifi.NetworkInterface.IPAddress == "0.0.0.0")
                {
                    Debug.Print("Waiting for IPAddress");
                    Thread.Sleep(250);
                }
            }
            catch (NetworkInterfaceExtensionException e)
            {
                switch (e.errorCode)
                {
                    case NetworkInterfaceExtensionException.ErrorCode.AuthenticationFailed: Debug.Print("AuthenticationFailed"); break;
                    //case NetworkInterfaceExtensionException.ErrorCode.AlreadyActivated: break;
                    default: Debug.Print(e.errorCode.ToString()); break;
                }
                //Debug.Print("Error Message: " + e.ErrorMsg);
                //if (e.errorCode != NetworkInterfaceExtensionException.ErrorCode.AlreadyActivated)
                return false;
            }
            catch (Exception e)
            {
                Debug.Print("Error Message: " + e.Message);
                return false;
            }

            Debug.Print("Done connecting...\n");
            //blocker.WaitOne();
            Debug.Print("We got NetworkAvailable event. WiFi link is ready!\n");

            return true;
        }
        /// <summary>
        /// Should be called by an application when the home network credentials should be forgotten, e.g. after a reset button is held down.
        /// </summary>
        public void ResetNetworkCredentials()
        {
            Debug.Print("Forgetting home wireless network credentials");

            wifiNetworks.Clear();
            if(EnableWifiSetupNetworks) APDetails.AddSetupAPs(wifiNetworks);
            SaveData();

            WebServer.StopLocalServer();
            currentAP = null;
            SetLed();
            wifi.Interface.Disconnect();
        }
 // secure reception of wifi credentials over wifi network - secured by receiving secret 
 void CredentialsWebEventReceived(string path, WebServer.HttpMethod method, Responder responder)
 {
     if (responder.UrlParameters == null || !responder.UrlParameters.Contains("ssid") || !responder.UrlParameters.Contains("setupauthcode"))
     {
         responder.Respond("ERROR::Syntax: " + path + "?ssid=SSID&setupauthcode=SETUPAUTHCODE[&key=WIFIKEY]");
         return;
     }
     if (((string)responder.UrlParameters["setupauthcode"]) != SetupAuthCode)
     {
         responder.Respond("ERROR::Incorrect setupauthcode");
         return;
     }
     var ssid = responder.UrlParameters["ssid"] as string;
     if (ssid == null || ssid == "")
     {
         responder.Respond("ERROR::Invalid SSID");
         return;
     }
     var key = "";
     if (responder.UrlParameters.Contains("key"))
     {
         key = responder.UrlParameters["key"] as string;
     }
     Debug.Print("Received (via web event) credentials for network " + ssid);
     bool newcreds = ReceivedCredentials(ssid, key);
     if (newcreds)
     {
         responder.Respond("OK::Got new credentials");
         SaveData();
         Thread.Sleep(10);
         WebServer.StopLocalServer();
         currentAP = null;
         SetLed();
         SetScreen();
         wifi.Interface.Disconnect();
     }
     else
     {
         responder.Respond("OK::Already had those");
     }
 }
        void Interface_NetworkAddressChanged(object sender, EventArgs e)
        {
            try
            {
                if (wifi.Interface.IsLinkConnected)
                {
                    Debug.Print("WiFi up with AP " + currentAP.SSID);
                    Debug.Print("IP Address: " + wifi.Interface.NetworkInterface.IPAddress);
                    Debug.Print("Subnet Mask: " + wifi.Interface.NetworkInterface.SubnetMask);
                    Debug.Print("Gateway: " + wifi.Interface.NetworkInterface.GatewayAddress);

                    var dnsAddresses = wifi.Interface.NetworkInterface.DnsAddresses;
                    Debug.Print("DNS Server: " + (dnsAddresses == null ? "NULL" : (dnsAddresses.Length == 0 ? "none" : dnsAddresses[0])));
                    Debug.Print("Elapsed time from join: " + (GT.Timer.GetMachineTime() - joinTime).Seconds + "s");
                    wifiConnected = true;
                    SetScreen();
                    SetLed();
                    //SendUDPBroadcast();

                    WebServer.StartLocalServer(wifi.Interface.NetworkInterface.IPAddress, 80);

                    if (ConnectedToHomeNetwork)
                    {
                        OnHomeNetworkJoined();
                    }
                }
                else
                {
                    wifiConnected = false;
                    WebServer.StopLocalServer();
                    SetLed();
                    SetScreen();
                    Debug.Print("Wifi down");
                    if (firstDown)
                    {
                        firstDown = false;
                    }
                    else
                    {
                        currentAP = null;
                    }
                }
            }
            catch (Exception ex)
            {
                Debug.Print("Exception in Interface_WirelessConnectivityChanged: " + ex);
            }
        }
        void wifiTimer_Tick(GT.Timer timer)
        {
            Debug.Print("wifiTimer start - currentAP " + (currentAP != null ? currentAP.SSID : "(null)") + " wifiUp " + wifiConnected + (wifiConnected ? " IP " + wifi.Interface.NetworkInterface.IPAddress : ""));
            if (sp != null)
            {
                var spMessage = BroadcastMessageWithNewline;
                sp.Write(spMessage, 0, spMessage.Length);
            }
            if (SkipWifiTimer())
            {
                Debug.Print("aborting wifitimer tick since SkipWifiTimer delegate is true");
                return;
            }

            if (wifiConnected && currentAP == null)
            {
                Debug.Print("ERROR: wifi is up but current AP is null! Disconnecting.");
                currentAP = null;
                wifiConnected = false;
                SetLed();
                SetScreen();
                wifi.Interface.Disconnect();
                WebServer.StopLocalServer();
                return;
            }

            if (currentAP != null && !wifiConnected)
            {
                wifiUpTime++;
                if (wifiUpTime == wifiUpTimeout)
                {
                    Debug.Print("WARN: starting wifi for " + currentAP.SSID + " timeout - resetting currentAP");
                    currentAP = null;
                    wifiConnected = false;
                    SetLed();
                    SetScreen();
                    wifi.Interface.Disconnect();
                    WebServer.StopLocalServer();
                    return;
                }
            }

            if (wifiConnected && currentAP != null && APDetails.IsSetupAP(currentAP))
            {
                if (GT.Timer.GetMachineTime() - joinTime > maxTimeOnSetupNetwork)
                {
                    Debug.Print("Disconnecting from setup AP due to timeout (setup should not take this long)");
                    currentAP = null;
                    wifiConnected = false;
                    SetLed();
                    SetScreen();
                    wifi.Interface.Disconnect();
                    WebServer.StopLocalServer();
                    return;
                }
                else
                {
                    // only sending unsolicited beacons when we're not on the home network
                    Debug.Print("Sending unsolicited UDP beacon since we're on a setup network");
                    SendUDPBroadcast(BeaconPort);
                }
            }

            if (wifiConnected && currentAP != null)
            {
                if (!WebServer.IsRunning()) WebServer.StartLocalServer(wifi.Interface.NetworkInterface.IPAddress, 80);
            }

            // skip scanning when connected since it fails
            if (currentAP == null)
            {

                try
                {
                    var scan = wifi.Interface.Scan();
                    Thread.Sleep(1);
                    foreach (var ap in scan)
                    {
                        Debug.Print("Scanned AP " + ap.SSID + " rssi " + ap.RSSI);
                    }
                    if (scan != null) foreach (APDetails knownAP in wifiNetworks)
                        {
                            // APs are in priority order, so break once we see the current ap
                            if (knownAP.Matches(currentAP)) break;
                            WiFiNetworkInfo joinAP = null;
                            foreach (var scanAP in scan)
                            {
                                if (!knownAP.Matches(scanAP)) continue;
                                if (joinAP == null) joinAP = scanAP;
                                if (joinAP.RSSI > scanAP.RSSI) joinAP = scanAP; // lower RSSI is better
                            }
                            if (joinAP == null) continue;

                            try
                            {

                                if (currentAP != null)
                                {
                                    Debug.Print("Disconnecting from WiFi network " + currentAP + " to join " + joinAP.SSID);
                                    wifi.Interface.Disconnect();
                                }

                                //// stop pictimeout and any streaming since wifi join operation hogs processor 
                                //picTimeout.Stop();
                                //camera.StopStreamingBitmaps();

                                joinTime = GT.Timer.GetMachineTime();
                                Debug.Print("Joining WiFi network " + joinAP.SSID + " rssi " + joinAP.RSSI);
                                //wifi.Interface.();
                                currentAP = joinAP;
                                SetLed();
                                SetScreen();
                                wifi.Interface.Join(joinAP, knownAP.Key);
                                //Debug.Print("Joined WiFi network " + scanAP.SSID);
                                wifiUpTime = 0;
                                break;
                            }
                            catch
                            {
                                Debug.Print("Error joining wifi network: " + joinAP.SSID);
                                wifi.Interface.Disconnect();
                                timer.Stop();
                                timer.Start();
                                currentAP = null;
                                SetLed();
                                SetScreen();
                                break;
                            }
                        }
                }
                catch (GHI.Premium.Net.NetworkInterfaceExtensionException wex)
                {
                    wifi.Interface.Disconnect();
                    // restart the timer to prevent it immediately firing again
                    timer.Stop();
                    timer.Start();
                    Debug.Print("Error scanning wifi networks: " + wex);
                    currentAP = null;
                    setLedError();
                    setScreenError();
                }
            }
            Debug.Print("wifiTimer end - currentAP " + (currentAP != null ? currentAP.SSID : "(null)") + " wifiUp " + wifiConnected);
        }
 internal static bool IsSetupAP(WiFiNetworkInfo ap)
 {
     return SetupSecretAPNew.Matches(ap) || SetupSecretAP.Matches(ap) || SetupOpenAP.Matches(ap);
 }