none
IoT Core (UWP) WiFi Verbindung mit Raspberry Pi3 zu PC, Windows Phone... (ConnectAsync schlägt fehl) RRS feed

  • Frage

  • Hallo Community,

    möchte eine WiFi-Verbindung zwischen Raspberry und einem anderen Gerät (Windows Phone, PC...) herstellen, um zunächst einfach nur auf dem an den Raspberry angeschlossenen Display einen Kreis mit einer anderen Farbe zu füllen (Funktionstest...).

    Ich orientiere mich an dem Beispiel einen SenseHat (dessen LEDs) remote zu steuern aus dem Buch "Programming for the Internet of Things" von Dawid Borycki. Master und Slave App nutzen denselben Code, um sich mit dem WLAN (demselben) zu verbinden.

    PC-App: Funktioniert MANCHMAL. Verbindung lässt sich öfter mal herstellen und Befehle werden versendet. 

    Ich habe Zugang zum WiFiAdapter (WiFiAccessStatus.Allowed). Öfter kommt es beim Scannen des Netzwerks zu folgendem Fehler:

    //...                    var wiFiAdapters = await WiFiAdapter.FindAllAdaptersAsync(); var firstWiFiAdapterAvailable = wiFiAdapters.FirstOrDefault(); if (firstWiFiAdapterAvailable != null) { // Scan networks await firstWiFiAdapterAvailable.ScanAsync(); // Löst nach ein paar Sekunden erst Exception aus

    //...

    Fehlermeldung:

    "Vorgang abgebrochen (Exeption from HRESULT: 0x80004004 (E_ABORT))"

    --> Vielleicht weil ich mich mit dem PC, mit dem ich debugge, schon im selben WLAN befinde?

    Raspberry-App: Funktioniert gar nicht: Im Gegensatz zur PC-App wird das Netzwerk scheinbar jedes mal erfolgreich gescannt (und zwar auch viel schneller), sowie das (mein) richtiges Netzwerk erkannt.

    //...

    if (firstWiFiAdapterAvailable != null) { // Scan networks await firstWiFiAdapterAvailable.ScanAsync(); // Geht beim Raspberry auf Anhieb sehr schnell // Filter the list of available networks by the SSID, var wiFiNetwork = firstWiFiAdapterAvailable.NetworkReport. AvailableNetworks.Where(network => network.Ssid == ssid).FirstOrDefault(); // ssid vorher festgelegt if (wiFiNetwork != null) { // Try to connect to network using password provided       var passwordCredential = new PasswordCredential()       { Password = password }; // password vorher festgelegt

          var connectionResult = await firstWiFiAdapterAvailable.ConnectAsync(wiFiNetwork, WiFiReconnectionKind.Automatic, passwordCredential); // Hier steigt der Raspberry einfach aus // Return connection status       connectionStatus = connectionResult.ConnectionStatus;    } }

    //...

    Nachdem das richtige Netzwerk gefunden ist, und auch das Password eingelesen ist, soll eine Verbindung hergestellt werden (ConnectAsync()). Dass Zugangsdaten korrekt sind / korrekt verarbeitet werden, weiß ich dadurch, dass die Verbindung mit dem PC (manchmal) klappt. Was passiert: Die Verbindung beim Debuggen (über WLAN) wird bei ConnectAsync() unterbrochen, der Raspberry schließt die App und wechselt zur Default-IoTApp.

    Microsoft Visual Studio Fehlermeldung: "Es ist keine Netzwerkverbidnung mehr mit 192.168.0.20:8117" vorhanden. Das Debugging wird abgebrochen."

    Im Programmcode verwende ich den Port 8080 (habe einfach auch mal 8117 versucht, ohne Erfolg), hat aber nichts damit zu tun (erst beim Connecten zum Host (Raspberry)?

    Dasselbe passiert auch, wenn ich nicht Debugge, sondern via Device Portal die App starte. Stelle ich sie als Startup-App ein, endet es in einer Schleife (Starten, Abstürzen, Starten, Abstürzen...). In jedem Fall ist der Raspberry per "Betriebssystem" schon mit demselben Netzwerk verbunden. Da ich keine weitere Fehlermeldung sehen kann, fällt es mir schwer die Ursache zu finden.

    Ich bin sicher nicht der erste, der eine WLAN-Verbindung zum Raspberry mit IoT Core herstellt, denke ich. Gibt es hier vielleicht Erfahrungen?

    Raspberry Pi3:

    Betriebssystemversion: 10.0.15063.0

    Verweis in App: Windows IoT Extensions for the UWP, Version 10.0.10586.0. (auch versucht mit Version 10.0.14393.0)

    PC: 

    Betriebssystemversion: 10.0.15063.0

    Visual Studio Community 2015, Version 4.7.02046 Update 3

    Gruß René

    Samstag, 26. August 2017 12:03

Alle Antworten

  • Hallo René

    hast Du dir auch mal das Samples angeschaut WifiScan

    In diesem wird das auch etwas anders gemacht:

    protected override async void OnNavigatedTo(NavigationEventArgs e)
    {
        ResultCollection = new ObservableCollection<WiFiNetworkDisplay>();
        rootPage = MainPage.Current;
    
        // RequestAccessAsync must have been called at least once by the app before using the API
        // Calling it multiple times is fine but not necessary
        // RequestAccessAsync must be called from the UI thread
        var access = await WiFiAdapter.RequestAccessAsync();
        if (access != WiFiAccessStatus.Allowed)
        {
            rootPage.NotifyUser("Access denied", NotifyType.ErrorMessage);
        }
        else
        {
            DataContext = this;
    
            var result = await Windows.Devices.Enumeration.DeviceInformation.FindAllAsync(WiFiAdapter.GetDeviceSelector());
            if (result.Count >= 1)
            {
                firstAdapter = await WiFiAdapter.FromIdAsync(result[0].Id);
    
                var button = new Button();
                button.Content = string.Format("Scan");
                button.Click += Button_Click;
                Buttons.Children.Add(button);
            }
            else
            {
                rootPage.NotifyUser("No WiFi Adapters detected on this machine", NotifyType.ErrorMessage);
            }
        }
    }
    
    private async void Button_Click(object sender, RoutedEventArgs e)
    {
        await firstAdapter.ScanAsync();
        DisplayNetworkReport(firstAdapter.NetworkReport);
    }


    Gruß Thomas

    Sage nie, ich kann es nicht - sage nur, ich kann es noch nicht!

    Icon für UWP

    Cross Platform Canvas for UWP, Android, iOS

    UWP Community Toolkit Sample App

    Alle Größenangaben in UWP müssen durch 4 teilbar sein

    Samstag, 26. August 2017 16:37