2016-06-28 8 views
0

In einem Programm, an dem ich arbeite, habe ich zwei Geräte, die über Bluetooth miteinander kommunizieren. Wenn die Anwendung zum ersten Mal gestartet wird, werden beide Geräte ordnungsgemäß verbunden. Wenn die Verbindung getrennt und neu initialisiert wird (d. H. Der Serverthread wird beendet und dann neu erstellt), schlägt die Verbindung trotz der akzeptierten Verbindungen fehl. Auf der Serverseite habe ichBluetooth ServerSocket akzeptiert nicht

void handleConnection() throws Exception { 
    bss = BluetoothAdapter.getDefaultAdapter().listenUsingRfcommWithServiceRecord(Constants.BITMAP_NAME, 
         UUID.fromString(Constants.BITMAP_UUID)); 
    running.set(true); 
    Logger.logE("accepting"); 
    BluetoothSocket socket = bss.accept(); 
    Logger.logE("accepted"); 
    context.runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      if (connectionCallback != null) 
       connectionCallback.onConnectionMade(); 
     } 
    }); 
    //handle connection in a loop... 
    try { 
     is.close(); 
     is = null; 
    } catch (IOException ignored) { 
     Logger.exception(ignored); 
    } 
    try { 
     socket.close(); 
     socket = null; 
    } catch (IOException ignored) { 
     Logger.exception(ignored); 
    } 
} 

Und auf der Client-Seite Ich habe

void handleConnection() throws Exception { 
    BluetoothSocket socket = connect. 
      createRfcommSocketToServiceRecord(UUID.fromString(Constants.BITMAP_UUID)); 
    Logger.logE("preparing to connect"); 
    socket.connect(); 
    Logger.logE("Connected"); 
    if (connectionCallback != null) { 
     context.runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       connectionCallback.onConnectionMade(); 
      } 
     }); 
     Logger.logE("callback fired"); 
    } 
    //Handle the connection... 
    Logger.logE("closing client"); 
    try { 
     os.close(); 
     os = null; 
    } catch (Exception ex) { 
     Logger.exception(ex); 
    } 
    try { 
     socket.close(); 
     socket = null; 
    } catch (Exception ex) { 
     Logger.exception(ex); 
    } 
} 

Nach dem Neustart des Servers und der Client-mal aus mit der Meldung

java.io.IOException: read failed, socket might closed or timeout, read ret: -1 

wieder zu verbinden versucht, auf der socket.connect(); Linie. Ich sehe die Nachricht preparing to connect in Logcat bei der Überwachung des Clients und die Nachricht accepting bei der Überwachung des Servers, aber es geht nie über diesen Punkt hinaus.

+0

Könnten Sie "wenn die Verbindung getrennt und neu initialisiert wird" und bei welcher Aussage der Fehler (java.io.IOException: lesen fehlgeschlagen, Socket möglicherweise geschlossen oder Timeout, lesen ret: -1) geworfen werden? – solosodium

+0

@solosodium aktualisiert es für Sie. – sjyn

Antwort

1

Der clientseitige Code scheint in Ordnung zu sein. Ich denke das Problem ist vom Server.

Wenn Sie Android documentation für Bluetooth gehen, werden Sie ein Beispiel für Bluetooth-Server finden Sie unter:

private class AcceptThread extends Thread { 
    private final BluetoothServerSocket mmServerSocket; 

    public AcceptThread() { 
     // Use a temporary object that is later assigned to mmServerSocket, 
     // because mmServerSocket is final 
     BluetoothServerSocket tmp = null; 
     try { 
      // MY_UUID is the app's UUID string, also used by the client code 
      tmp = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID); 
     } catch (IOException e) { } 
     mmServerSocket = tmp; 
    } 

    public void run() { 
     BluetoothSocket socket = null; 
     // Keep listening until exception occurs or a socket is returned 
     while (true) { 
      try { 
       socket = mmServerSocket.accept(); 
      } catch (IOException e) { 
       break; 
      } 
      // If a connection was accepted 
      if (socket != null) { 
       // Do work to manage the connection (in a separate thread) 
       manageConnectedSocket(socket); 
       mmServerSocket.close(); 
       break; 
      } 
     } 
    } 

    /** Will cancel the listening socket, and cause the thread to finish */ 
    public void cancel() { 
     try { 
      mmServerSocket.close(); 
     } catch (IOException e) { } 
    } 
} 

Der Punkt ist, müssen Sie den Server in einem Thread ausgeführt, um zu verfolgen alle eingehenden Verbindungen. Da benötigen Sie das Handle des eingehenden Sockets für die Kommunikation.

Es ist auch sehr wichtig, dass Sie daran denken, die SOCKET ZU SCHLIESSEN, wenn Sie mit der Kommunikation fertig sind. Ein nicht ordnungsgemäß geschlossener Socket kann zu einer fehlenden Hardware-Verbindung führen, ohne dass die Softwareschicht dies erkennt, was auch die Ursache für Ihr aktuelles Problem sein könnte (aufgrund des Mangels an Code für die tatsächliche Kommunikation ist dies nicht eindeutig). Weitere Informationen finden Sie unter this.

+0

Sie waren zu 100% richtig. Ich glaube, dass die Steckdose nicht richtig geschlossen wurde, was genau die Wirkung hatte, die Sie beschrieben haben. – sjyn

Verwandte Themen