2012-09-10 3 views
5

Ich muss Daten von etwa 1 bis 100 MB in Blöcken von 1024 Bytes programmgesteuert auf das Remote-Bluetooth-Gerät schreiben. Beide sind Android-Geräte. Hier ist ein Beispiel-Code-Snippet in meinem Client-Programm zur Übertragung von Daten -Android BluetoothSocket OutputStream schreiben Blöcke unendlich

bTSocket.connect(); //connect to remote BT device 
DataOutputStream outStream = new DataOutputStream(bTSocket.getOutputStream()); 
byte[] buffer = new byte[1024]; 
int bytesToTransfer = 1000000; 
while (bytesToTransfer > 0) { 
    outStream.write(buffer); 
    outStream.flush(); 
    bytesToTransfer -= 1024; 
} 
outStream.close(); 

Während dieses Stück Code auf Android läuft 2.2 (Froyo), es funktioniert gut. Im Fall von Android 2.3.4 und 4.0.4 blockiert outStream.write (Puffer) jedoch unendlich nach der Übertragung einiger Daten (zB von 100 KB). Erwähnenswert ist, dass das Remote-Gerät nicht für das Abhören von Daten konfiguriert ist. Gibt es Einschränkungen hinsichtlich der Menge an Daten, die geschrieben werden können?

+0

Sie sagen, die andere Seite liest keine Daten aus der Steckdose? –

+0

Genauer gesagt ist der Server nicht konfiguriert, Daten über den Stream zu lesen. –

Antwort

5

Der Bluetooth-Socket funktioniert im Blockiermodus sowohl für Lese- als auch für Schreibvorgänge.

Wenn Sie den Sendepuffer füllen, können Sie nur noch .write() blockieren, um zu verhindern, dass Sie weitere Daten senden. Die Alternative zur Blockierung wäre, eine "Operation würde blockieren!" Fehlercode, genau wie TCP-Sockets tun können, wenn sie im nicht blockierenden Modus platziert werden. Der Bluetooth-Socket bietet jedoch keinen solchen nicht blockierenden Modus.

Sie geben an, dass das Remote-Bluetooth-Gerät nicht von seinem Socket liest. Wenn dies der Fall ist, werden der lokale Sendepuffer und der entfernte Empfangspuffer, die jeweils nur eine bestimmte endliche Größe haben, schließlich voll werden. An diesem Punkt wird Ihre .write() Operation blockieren, bis das Remote-Ende etwas aus seinem Socket liest. Sie können nicht einfach in Megabytes an Daten pumpen und erwarten, dass alles nur irgendwo gepuffert wird.

Die Unterschiede, die Sie zwischen verschiedenen Android-Plattformen feststellen können, sind wahrscheinlich auf den unterschiedlichen verfügbaren Pufferspeicher in den entsprechenden Bluetooth-Stacks zurückzuführen.

+0

Danke für die Antwort Trevor. –

+0

@Trevor Danke für Informationen. Ich habe nie eine lange Zeit damit verbracht, Probleme zu blockieren, selbst als ich versuchte, Tausende von Kilobytes zu schreiben. Ich frage mich immer noch, was die Puffergröße ist (mit Android 2.3.3). –

Verwandte Themen