3

Ich habe zwei Windows UWP Apps. Einer von ihnen (der "Server") läuft auf einem Raspberry Pi 2 unter Windows IoT (10586.0). Der andere (der "Client") läuft auf jedem Windows 10-Gerät im selben Netzwerk.Netzwerkverbindung mit UWP Apps

Ich möchte, dass die Apps miteinander "sprechen". Für den Moment möchte ich einfach String vom Client zum Server senden. Später sollten serialisierte Daten über das Netzwerk übertragen werden.

Dies ist der Code für den Server App:

namespace LCARSHomeAutomation 
{ 
/// <summary> 
/// Eine leere Seite, die eigenständig verwendet oder zu der innerhalb eines Rahmens navigiert werden kann. 
/// </summary> 
public sealed partial class MainPage : Page 
{ 
    public MainPage() 
    { 
     this.InitializeComponent(); 

     try { 
      EstablishNetworking(); 
      txb_Events.Text += "Server Running"; 
     }catch (Exception ex) 
     { 
      txb_Events.Text += ex.Message; 
     } 


    } 

    private async void EstablishNetworking() 
    { 
     await StartListener(); 
    } 

    public async Task StartListener() 
    { 
     StreamSocketListener listener = new StreamSocketListener(); 
     listener.ConnectionReceived += OnConnection; 

     listener.Control.KeepAlive = true; 

     try 
     { 
      await listener.BindServiceNameAsync("5463"); 

     } 
     catch (Exception ex) 
     { 
      if (SocketError.GetStatus(ex.HResult) == SocketErrorStatus.Unknown) 
      { 
       throw; 
      } 
      //Logs.Add(ex.Message); 
      txb_Events.Text += ex.Message; 
     } 

    } 

    private async void OnConnection(StreamSocketListener sender, StreamSocketListenerConnectionReceivedEventArgs args) 
    { 
     Stream inStream = args.Socket.InputStream.AsStreamForRead(); 
     StreamReader reader = new StreamReader(inStream); 
     string request = await reader.ReadLineAsync(); 

     await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, 
            () => 
            { 
             // Your UI update code goes here! 
             txb_Events.Text += (String)request; 
            }); 


    } 

    private async Task ConnectSocket() 
    { 
     StreamSocket socket = new StreamSocket(); 

     socket.Control.KeepAlive = false; 

     HostName host = new HostName("localhost"); 

     try 
     { 
      await socket.ConnectAsync(host, "5463"); 

      Stream streamOut = socket.OutputStream.AsStreamForWrite(); 
      StreamWriter writer = new StreamWriter(streamOut); 
      string request = "Test Self App \n"; 
      await writer.WriteLineAsync(request); 
      await writer.FlushAsync(); 

      socket.Dispose(); 
     } 
     catch (Exception ex) 
     { 
      txb_Events.Text += ex.Message; 
      //Logs.Add(ex.Message) 
     } 


    } 

    private async void btn_Send_Click(object sender, RoutedEventArgs e) 
    { 
     await ConnectSocket(); 
    } 

} 
} 

Wie Sie sehen, ich bin auf dem gleichen Host eine Netzwerkverbindung mit den gleichen App Aufbau und die Zeichenfolge „Test Selbst App“ senden. Das funktioniert schon seit geraumer Zeit in Ordnung, aber nach einer Weile habe ich den Fehler:

Exception thrown: 'System.Runtime.InteropServices.COMException' in mscorlib.ni.dll

WinRT information: No connection could be made because the target machine actively refused it.

Also, das ist meine erste Frage: Was ist dieser Fehler und wie kann ich dieses Problem beheben?

Die andere Sache ist: Ich kann keine Netzwerkverbindung zwischen dem Server und dem Client herstellen. Ich weiß nicht, was ich falsch mache. Dies ist der Code des "Client":

namespace LCARSRemote 
{ 
/// <summary> 
/// Eine leere Seite, die eigenständig verwendet oder zu der innerhalb eines Rahmens navigiert werden kann. 
/// </summary> 
public sealed partial class MainPage : Page 
{ 
    public MainPage() 
    { 
     this.InitializeComponent(); 
    } 

    private async void btn_Send_Click(object sender, RoutedEventArgs e) 
    { 
     StreamSocket socket = new StreamSocket(); 

     HostName host = new HostName("localhost"); //Replace with coorect hostname when running on RPi 

     try 
     { 
      try { 
       await socket.ConnectAsync(host, "5463"); 
      } 
      catch(Exception ex) 
      { 
       txb_Events.Text += ex.Message; 
      } 

      Stream streamOut = socket.OutputStream.AsStreamForWrite(); 
      StreamWriter writer = new StreamWriter(streamOut); 
      string request = "Remote App Test"; 
      await writer.WriteLineAsync(request); 
      await writer.FlushAsync(); 

      socket.Dispose(); 

     } 
     catch (Exception ex) 
     { 
      txb_Events.Text += ex.Message; 
      //Logs.Add(ex.Message) 
     } 

    } 
} 
} 

Wenn ich auf dem btn_Send klicken, erhalte ich die Fehlermeldung

A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.

und

A method was called at an unexpected time. (Exception from HRESULT: 0x8000000E)

Was mache ich falsch? Vielleicht sollte ich sagen, dass ich relativ neu in der Programmierung von Netzwerkverbindungen, Sockets etc. bin.

Danke für jede Hilfe!

+0

Haben Sie verändert den Hostnamen etwas Vernünftiges ausgeführt werden soll? Hast du deine Firewall-Regeln überprüft? –

+0

Ich habe es auch versucht mit der Firewall ausgeschaltet. Ich habe "127.0.0.1" als Hostname versucht, ich habe auch "minwinpc" (der Name des RPi im LAN) ausprobiert, aber nichts schien zu funktionieren. – drummercrm

+0

Hast du es mit der IP-Adresse deines Pi versucht? –

Antwort

1

Sie sollten versuchen, StreamSocket API in UWP verwenden. Dieses Beispiel Repo-Inhalte sowohl Server als auch Client-Code: https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/StreamSocket

A method was called at an unexpected time. (Exception from HRESULT: 0x8000000E)

Dieser Fehler für mich passiert, wenn ich versuche ConnectAsync zweimal in einer Reihe zu nennen, ich glaube, Sie Ihre Logik oder Debug überprüfen können in Ihrem Fall zu bestätigen.

+0

Ich habe mir diese Beispiele angesehen, aber sie waren nicht wirklich hilfreich. Die Fehler sind immer noch vorhanden. Ich habe auch versucht, DataWriter/DataWriter anstelle von StreamReader/-Writer (wie im obigen Beispiel) zu verwenden, aber es hat auch nicht funktioniert. – drummercrm

0

Je nachdem, über wie viele Daten Sie sprechen und was der Endanwendungsfall ist, könnte die AWS IoT-Plattform von Amazon etwas zum Anschauen sein. Es ist ziemlich cool für eine Reihe von Gründen. Speziell gefällt mir, dass das Zielgerät zum Zeitpunkt der Übertragung offline sein kann.

Es ist kostenlos (250.000 Nachrichten) für das erste Jahr und $ 5 pro eine Million Nachrichten danach. Jeder 512-Byte-Block zählt als 1 Nachrichtengutschrift.

+0

Dies ist für mich keine Lösung, da ich möchte, dass die Apps auch dann miteinander kommunizieren, wenn keine Internetverbindung besteht. – drummercrm

1

Der erste Fehler

Exception thrown: 'System.Runtime.InteropServices.COMException' in mscorlib.ni.dll

WinRT information: No connection could be made because the target machine actively refused it.

Dies liegt daran, die Fassung noch offen mit einer früheren Anfrage erhältlich und hat noch nicht geschlossen. Also fangen Sie diesen Fehler und versuchen Sie es erneut zu verbinden.Diese

A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.

ist, da der Server und Client auf derselben Maschine, ich laufe in das gleiche Problem angeblich können Sie an einer erhöhten Eingabeaufforderung ausführen

checknetisolation loopbackexempt -d -n= {package family} 

es zu lösen.

Diese Lösung hat nicht für mich funktioniert. Ihr Server muss also auf einem Pi laufen und der Client muss auf Ihrem Desktop-PC laufen, damit Windows 10 UWP sich mit ihm verbinden kann. Windows 10 erlaubt keine Loopback-Verbindung für UWP-Anwendungen, soweit ich das beurteilen kann.

Wenn Sie wirklich ein Socket-Server/Web-Server node.js Fenster Universal-Anwendungen könnte ein guter Ansatz

https://ms-iot.github.io/content/en-US/win10/samples/NodejsWU.htm 

oder

RestUP https://github.com/tomkuijsten/restup