我正在编写一个应用程序,它将接收来自其他设备的串行数据(不是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);
我总是遇到Service Discovery Failed或Connection Refused。这就是我管理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)
答案 0 :(得分:1)
所以我终于能够做到这一点。唯一的问题是UUID。在我发布的代码中,我使用了众所周知的SPP UUID,但我的笔记本电脑的蓝牙适配器有一个不同的UUID,这就是为什么两者无法连接的原因。
当我配置Bluesmirf模块(默认情况下具有SSP UUID)并尝试从应用程序连接时,它运行良好。