2017-05-05 4 views
3

Ich habe auf einer einfachen UPnP-Client-Implementierung arbeiten, aber ich habe Probleme mit Ereignissen zu empfangen. Um zu versuchen, Fehler in den Nachrichten zu finden, die ich sende, testete ich meinen Anwendungsfall mit CLing (was eine großartige Bibliothek ist, aber es hängt von Java 1.5 ab, während ich nur Zugriff auf 1.4 habe), die perfekt funktioniert, aber ich kann nicht finden irgendein bedeutungsvoller Unterschied zwischen seinen Nachrichten und meins.UPnP Ereignisse nicht empfangen oder empfangen spät

Ich abonnieren/Mediarenderer/AVTransport/Event-Veranstaltungen, testen, um zu sehen, ob ich die neueste TransportState bekommen kann.

Hier ist mein Testcode:

private static final String PLAYER_IP = "192.168.10.101"; 

public static void main(String[] args) throws Exception { 
    ServerSocket serverSocket = new ServerSocket(); 
    serverSocket.bind(null); 

    System.out.println("Started server on port " + serverSocket.getLocalPort() + ", ready for connections"); 

    sendSubscription(serverSocket.getLocalPort()); 

    while (!serverSocket.isClosed()) 
     handle(serverSocket.accept()); 
} 

private static void sendSubscription(int port) throws Exception { 
    Socket socket = new Socket(PLAYER_IP, 1400); 
    PrintWriter out = new PrintWriter(socket.getOutputStream()); 

    out.print("SUBSCRIBE /MediaRenderer/AVTransport/Event HTTP/1.1\r\n" 
      + "HOST: " + PLAYER_IP + ":1400\r\n" 
      + "USER-AGENT: MacOSX/10.12.4 UPnP/1.0 MyApp/0.1\r\n" 
      + "CALLBACK: <http://" + InetAddress.getLocalHost().getHostAddress() + ":" + port + "/dev>\r\n" 
      + "NT: upnp:event\r\n" 
      + "TIMEOUT: Second-3600\r\n" 
      + "\r\n"); 
    out.flush(); 

    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
    String line; 
    while ((line = in.readLine()) != null) 
     System.out.println(line); 
} 

private static void handle(final Socket clientSocket) { 
    new Thread(new Runnable() { 
     public void run() { 
      System.out.println(); 
      System.out.println("Request incoming " + new Date()); 
      try { 
       BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
       String line; 
       while ((line = in.readLine()) != null) { 
        System.out.println(line); 
        if (line.contains("TransportState")) 
         System.out.println("TransportState: " + line.substring(line.indexOf("TransportState") + 25)); 
       } 
      } 
      catch (IOException e) {} 

      try { 
       PrintWriter out = new PrintWriter(clientSocket.getOutputStream()); 
       out.print("HTTP/1.1 200 OK\r\n" 
         + "Server: MacOSX/10.12.4 UPnP/1.0 MyApp/0.1\r\n" 
         + "Connection: close\r\n" 
         + "\r\n"); 
       out.flush(); 
      } 
      catch (IOException e) {} 
     } 
    }).start(); 
} 

Es sendet eine Anfrage Abonnement und liest dann kontinuierlich Benachrichtigungen. Sie werden vielleicht bemerken, dass ich keine Bibliotheken für irgendetwas verwende, aber ich habe sie wegen Paranoia beseitigt, bis ich diesen grundlegenden Anwendungsfall zum Laufen bringen kann.

Das Ergebnis ist, dass, wenn ich mein Handy zum Beispiel verwenden, um zu spielen/einen Titel oder Radiosender zu stoppen, die Ereignisse nicht immer ankommen und wenn sie es tun, sind sie oft sehr spät. Dieses Verhalten ist konsistent für meine App und nicht für CLing. Daher kam ich zu dem Schluss, dass ich mein Netzwerk ausschließen kann. Ich habe den Unterschied zwischen meiner App und CLing Wiresharked und die Abo-Nachrichten sind fast identisch (ich habe sogar die genaue Nachricht versucht, CLing sendet). Beide Anwendungen laufen auf demselben PC, beide auf derselben JVM.

Per UPnP-Spezifikation sendet der Datenträger-Renderer eine Benachrichtigung sofort nach der Anmeldung, die immer kommen wird, und ich sehe keine unerwartete Verzögerung gibt.

Das ist mir sehr seltsam, und ich bin an einem Verlust dessen, was ich als nächstes versuchen. Ich wäre jedem dankbar, der eine Vorstellung davon hat, was die Ursache dieses Problems sein könnte!

+0

Werden die Benachrichtigungen zur erwarteten Zeit gesendet oder nicht? Wie in welchem ​​Gerät passiert die Verzögerung? – jku

+0

Mit Wireshark auf dem gleichen PC, auf dem meine Apps laufen, kann ich sehen, dass die Benachrichtigungen zu spät kommen. Sie werden grundsätzlich sofort von meiner App bearbeitet. Ich habe zwei verschiedene Router ausprobiert, um zu sehen, ob das einen Unterschied macht, aber die Verzögerung ist die gleiche. – delucasvb

Antwort

1

Das Problem lag bei einer HTTP-Serverimplementierung, die in einigen Fällen keine HTTP-Antwortcodes gesendet hat. Der Medien-Renderer würde das nächste Ereignis nicht senden, bevor es eine HTTP 200-Antwort erhalten hat. Scheint, ein guter, leichter HTTP-Server für Java 1.4 ist ein harter Fund.

Verwandte Themen