[英]Android: BluetoothSocket connect throws IOException
我正在編寫一個將從其他設備接收串行數據的應用程序(不是Android,如果需要的話,它將是Bluesmirf Silver模塊,但現在我只嘗試使用筆記本電腦的藍牙適配器)。 這是我正在使用的代碼:
public class ListenThread extends Thread {
private BluetoothSocket socket;
private InputStream istream;
private Handler handler;
private BluetoothAdapter adapter;
public ListenThread(BluetoothAdapter adapter, Handler handler) {
Log.v(TAG, "creating ListenThread");
this.adapter = adapter;
this.handler = handler;
if (adapter.isDiscovering()) {
adapter.cancelDiscovery();
}
}
public void run() {
if (running == false) {
// Thread is cancelled
Log.v(TAG, "run(): running == false");
return;
}
if (adapter == null) {
// No BT adapter supplied
Log.v(TAG, "run(): adapter == null");
return;
}
if (btDevice == null) {
// No btDevice is paired
Log.v(TAG, "run(): btDevice == null");
return;
}
try {
socket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
adapter.cancelDiscovery();
socket.connect();
Log.v(TAG, "run(): socket connected");
} catch (IOException e) {
Log.v(TAG, "run(): socket not connected");
Log.v(TAG, "IOException: " + e.toString());
e.printStackTrace();
socket = null;
}
if (socket == null) {
// Connection to device failed
Log.v(TAG, "run(): socket is null");
return;
}
InputStream tmpIn = null;
try {
tmpIn = socket.getInputStream();
} catch (IOException e) {
// getInputStream always returns InputStream
// but operations will throw IOException until
// the stream is ready
}
istream = tmpIn;
StringBuffer sb = new StringBuffer();
byte[] buffer = new byte[1024]; // buffer store for the stream
int bytes; // bytes returned from the read();
String message;
int idx;
HashMap<String, String> hm;
String[] chunks;
Log.v(TAG, "run(): listening loop starting");
while (true) {
try {
// Read from the InputStream
bytes = istream.read();
sb.append(new String(buffer, 0, bytes));
while ((idx = sb.indexOf("\r\n\r\n")) > -1) {
message = sb.substring(0, idx);
sb.replace(0, idx + 4, "");
hm = new HashMap<String, String>();
for (String line : message.split("\n")) {
chunks = line.trim().split("=", 2);
if (chunks.length != 2) continue;
hm.put(chunks[0], chunks[1]);
}
handler.obtainMessage(0x2a, hm).sendToTarget();
}
} catch (IOException e) {
break;
}
}
}
我總是在socket.connect()行上得到IOException。 我嘗試了幾種建立連接的方法,但沒有一種起作用,但是每種方法都引發了不同的IO異常:
方法1:
socket=BluetoothAdapter.getDefaultAdapter().getRemoteDevice(device.getAddress()).createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
方法2:
socket = device.createInsecureRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
方法3:
socket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
我也這樣嘗試過:
Method m = device.getClass().getMethod("createRfcommSocket", new Class[] {int.class});
socket = (BluetoothSocket) m.invoke(device, 1);
我總是遇到服務發現失敗或連接被拒絕的情況。 這就是我管理ListenThread的方式:
public void startListening() {
Log.v(TAG, "starting to listen");
running = true;
}
public void stopListening() {
Log.v(TAG, "stoping listening");
running = false;
}
我搜索了Google,但發現的只是連接套接字的不同方法,但是正如我所說,它們都不起作用。 任何想法? 非常感謝!
編輯:
這就是Log.v(TAG,“ IOException:” + e.toString()); 和e.printStackTrace(); 打印:
IOException: java.io.IOException: Service discovery failed
java.io.IOException: Service discovery failed
W/System.err(8604): at android.bluetooth.BluetoothSocket$SdpHelper.doSdp(BluetoothSocket.java:397)
W/System.err(8604): at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:207)
W/System.err(8604): at com.ginger.kanarci_android.communication.BluetoothService$ListenThread.run(BluetoothService.java:133)
因此,我終於能夠獨善其身。 唯一的問題是UUID。 在我發布的代碼中,我使用了眾所周知的SPP UUID,但是我的筆記本電腦的藍牙適配器具有不同的UUID,這就是我認為兩者無法連接的原因。
當我配置Bluesmirf模塊(默認情況下具有SSP UUID)並嘗試從該應用程序連接時,它可以正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.