Mehrere Bluetoothverbindungen

  • Hallo,


    ich habe folgendes Problem, wenn ich nacheinander mehrere (momentan sind es 2) Bluetooth Geräte um eine Verbindung bitte.
    Ich bekomme dabei folgende Meldung:


    Code
    03-05 15:19:40.348: W/BluetoothAdapter(28027): getBluetoothService() called with no BluetoothManagerCallback03-05 15:19:40.358: D/BluetoothSocket(28027): connect(), SocketState: INIT, mPfd: {ParcelFileDescriptor: FileDescriptor[64]}03-05 15:19:45.478: W/System.err(28027): java.io.IOException: read failed, socket might closed or timeout, read ret: -103-05 15:19:45.478: W/System.err(28027): 	at android.bluetooth.BluetoothSocket.readAll(BluetoothSocket.java:505)03-05 15:19:45.478: W/System.err(28027): 	at android.bluetooth.BluetoothSocket.waitSocketSignal(BluetoothSocket.java:482)03-05 15:19:45.478: W/System.err(28027): 	at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:324)03-05 15:19:45.478: W/System.err(28027): 	at com.duw_energie.bat.DownloadData$Download.doInBackground(DownloadData.java:139)03-05 15:19:45.488: W/System.err(28027): 	at com.duw_energie.bat.DownloadData$Download.doInBackground(DownloadData.java:1)03-05 15:19:45.488: W/System.err(28027): 	at android.os.AsyncTask$2.call(AsyncTask.java:288)03-05 15:19:45.488: W/System.err(28027): 	at java.util.concurrent.FutureTask.run(FutureTask.java:237)03-05 15:19:45.488: W/System.err(28027): 	at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)03-05 15:19:45.488: W/System.err(28027): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)03-05 15:19:45.488: W/System.err(28027): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)03-05 15:19:45.488: W/System.err(28027): 	at java.lang.Thread.run(Thread.java:841)


    Dabei habe ich schon gelesen, dass es dazu kommen kann, wenn der Socket nicht vernünftig geschlossen wird. Aber genau das mache ich am Ende der Verbindung:

    Java
    in.close();out.close();sock.close();




    Ich habe keine Ahnung, was ich sonst noch machen kann.

  • Ein Feature von Sockets ist, dass diese ein paar Sekunden brauchen bis sie komplett dicht gemacht wurden und das OS wieder darauf lauschen darf.
    Dann werden im Zweifel noch ein paar Daten, die bereits im Anflug sind, noch entgegengenommen.


    Wenn Du für jede Verbindung einen eigenen Socket öffnest sollte das klappen.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Momentan sieht der Ablauf so aus:
    Ich habe ein Datenfeld mit dem Socket.
    In der Schleife dann:
    -BluetoothDevice von BluetoothAdresse
    -Socket von BluetoothDevice.createRfcommSocketToServiceRecord(UUID)
    -Abrufen der Daten
    -Schließen der Streams und des Sockets mit dem oben genannten Code
    Dann wieder von vorne. Ist das so richtig? Oder sollte ich eine lokale Variable nehmen, welche jeden Schleifendurchlauf neu reserviert wird?

  • Wie gesagt dürften Schleifen ziemlich zügig arbeiten, zumindest zügiger als der TCP Stack.
    Insofern solltest Du in jedem Schleifendurchlauf einen neuen Socket öffnen und schließen statt denselben öffnen und schließen zu wollen.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Okay, das habe ich verstanden.
    Aber wie sieht das Konkret aus?
    Erstelle ich nicht durch:
    BluetoothDevice.createRfCommSocket...();
    jedesmal einen neuen Socket?
    Dabei ändert sich natürlich auch das BluetoothDevice, abhängig von der Adresse.


    EDIT:
    Ich habe jetzt einfach in der catch Klausel noch ein

    Java
    BluetoothSocket.connect();


    eingefügt. Ist vielleicht ein wenig Prüde, aber erst wenn das auch fehlschlägt gebe ich es auf.
    Bisher funktioniert es und wenn der erste Fehler ausgeworfen wird, sobald der Socket frei ist, dann ist es so sogar relativ logisch.
    Über weitere Informationen wäre ich trotzdem denkbar :P

  • Okay, ich probiere es auf das wichtigste zu verkürzen:

    Java
    BluetoothAdapter blue = BluetoothAdapter.getDefaultAdapter();for(int index =0; index<adressandid.length;index++){ bluetoothdevice="" dev="blue.getRemoteDevice(adressAndID[index][0]);" try="" {="" uuid="" id1="UUID" .fromstring("00001101-0000-1000-8000-00805f9b34fb");="" if(sock!="null)" sock.close();="" sock="dev.createInsecureRfcommSocketToServiceRecord(id1);" method="" m="dev.getClass().getMethod("createRfcommSocket"," new="" class[]="" {int.class});
    								sock = (BluetoothSocket) m.invoke(dev, 1);			
    								try{				sock.connect();				}catch(IOException i)				{					try{					sock.connect();				}catch(IOException ea)				{					sock.connect();				}					}								Log.i("Status:", "nach connect");				in = new Scanner(sock.getInputStream());				OutputStream out = sock.getOutputStream();						// Verbunden				String start = "123;";				out.write(start.getBytes());					String tmpOut;
    				String lastOut = "";				future = executor.submit(readTask);								tmpOut = future.get(5000, TimeUnit.MILLISECONDS);				// erste Zeile								//Hier passiert einiges, aber nur Datenverarbeitung				//Socket schließen				in.close();				out.close();				sock.close();



    Hier nochmal mit Formatierung.

  • Ich verstehe diese Zeilen nicht:

    Java
    Method m = dev.getClass().getMethod("createRfcommSocket", new Class[] {int.class}); 
    sock = (BluetoothSocket) m.invoke(dev, 1);


    Was spricht gegen

    Java
    sock = dev. createRfcommSocketToServiceRecord(id1)

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Ich muss ganz ehrlich sagen, jetzt bin ich gerade total fertig.
    Ich habe über die letze Woche immer und immer wieder verschiedene Methoden ausprobiert, bei welchen ich IMMER einen Fehler bekomme habe, mal gab es eine Bad File Description, dann eine IOException read failed, socket might time out oder sonstwas.
    Mit der Methode habe ich gerade 4 Durchläufe gemacht und es hat bei allen funktioniert.
    Ich teste es mal weiter.

  • Leider muss ich jetzt wieder feststellen, dass ich die Fehlermeldung:
    "
    03-12 12:00:45.831: W/System.err(22612): java.io.IOException: Service discovery failed
    03-12 12:00:45.831: W/System.err(22612): at android.bluetooth.BluetoothSocket$SdpHelper.doSdp(BluetoothSocket.java:462)
    03-12 12:00:45.831: W/System.err(22612): at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:240)
    03-12 12:00:45.831: W/System.err(22612): at com.duw_energie.bat.DownloadData$Download.doInBackground(DownloadData.java:153)
    03-12 12:00:45.831: W/System.err(22612): at com.duw_energie.bat.DownloadData$Download.doInBackground(DownloadData.java:1)
    03-12 12:00:45.831: W/System.err(22612): at android.os.AsyncTask$2.call(AsyncTask.java:287)
    03-12 12:00:45.831: W/System.err(22612): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
    03-12 12:00:45.831: W/System.err(22612): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
    03-12 12:00:45.836: W/System.err(22612): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
    03-12 12:00:45.836: W/System.err(22612): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
    03-12 12:00:45.836: W/System.err(22612): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
    03-12 12:00:45.836: W/System.err(22612): at java.lang.Thread.run(Thread.java:856)


    "
    immer bekomme. Voran gehen dabei die folgenden Infos:
    "03-12 12:02:54.746: D/BluetoothUtils(22612): isSocketAllowedBySecurityPolicy start : device null
    "


    Kannst du mir dabei helfen? Ich habe jetzt den folgenden Code:


    Java
    UUID id1 = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
    sock = dev. createRfcommSocketToServiceRecord(id1);
    sock.connect();


    Danach bricht es ab.
    Es kann sein, dass sich das Bluetooth Modul im Microchip geändert hat, dass muss ich noch recherchieren.

  • Wenn Du die Bluetooth Verbindung änderst, dann ändert sich ja auch die UUID.
    Eventuell liegt das daran?


    War zumindest der erste Treffer bei Google. ^^


    Alternativ vorm Schließen das Discovery abschalten.
    Genauer Verlauf siehe
    http://stackoverflow.com/quest…-service-discovery-failed

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Das mit der UUID verstehe ich auch noch nicht so ganz, aber so wie ich es verstanden habe, gibt es ja für verschiedene Protokolle verschiedene UUIDs. Daran sollte es also nicht liegen.


    Das mit dem Discovery abschalten tue ich mittlerweile sogar, ändert aber leider nichts.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!