
Method m = device.getClass().getMethod(
"createRfcommSocket", new Class[] { int.class });
tmp = (BluetoothSocket) m.invoke(device, Integer.valueOf(1));
这是感兴趣的方法,一旦获得BluetoothSocket就会运行:
public void run() {
setName("ConnectThread" + mSocketType);
// Always cancel discovery because it will slow down a connection
mAdapter.cancelDiscovery();
// Make a connection to the BluetoothSocket
try {
mmSocket.connect();
} catch (Exception e) {
Log.e(TAG, "Connection to " + mmDevice.getName() + " at "
+ mmDevice.getAddress() + " failed:" + e.getMessage());
// Close the socket
try {
mmSocket.close();
} catch (Exception e2) {
Log.e(TAG, "unable to close() " + mSocketType
+ " socket during connection failure", e2);
}
connectionFailed(e.getMessage());
return;
}
// Reset the ConnectThread because we're done
synchronized (BluetoothChatService.this) {
mConnectThread = null;
}
// Start the connected thread
connected(mmSocket, mmDevice, mSocketType);
}
相关的日志条目(在调用connect()时捕获异常时打印)是这样的:
11-30 10:23:51.685: E/BluetoothChatService(2870): Connection to
ZYNO-700091 at 00:06:66:42:8E:01 failed:read failed, socket might
closed, read ret: -1
此错误曾经偶尔出现过.我有一个积极的重新连接系统 – 它基本上反复锤击连接,直到它连接,如果它永远断开,它开始再次锤击它.因此,它会终止连接线程并从头开始.我曾经考虑过那里可能存在一个问题 – 可能是多线程的,或者可能是处理套接字清理/初始化.但是,如果是这种情况,我仍然期望第一次连接尝试成功,因为在连接尝试失败之前该系统不会启动.
我调查了source code抛出异常.问题似乎是底层的InputStream没有数据.当然,这不是一个真正的答案,只是迈向它的一步.为什么流没有数据?
我试图对潜在的问题保持开放的态度.我是否正确使用BluetoothSocket?事实上,它曾经是一个间歇性的问题,现在几乎不变,这让我怀疑多线程,但与C相比,这是一个相对简单的Java主题 – 如果你知道自己在做什么,很难搞砸.此外,这些代码的大部分(特别是处理同步线程的部分)直接来自示例代码.
另一端的设备是嵌入式蓝牙设备,因此从这一点调试问题的希望不大.
更新===========================
在我看来,它可能是由于操作系统升级(我在Galaxy Nexus手机上运行 – 我有几个要测试).所以我用4.0.4拆开了一个新手机,它工作了!然后回到两个原始测试手机上测试,两个都运行4.2,期待我一直看到的失败.奇怪的是,现在它也适用于那些手机.我想说我做了一些让这项工作重新开始的事情,但事实并非如此.我仍然感到神秘,现在还怀疑当我真正需要它时这个东西会起作用.
我想知道是否有可能以某种方式连接使用4.0.4可以正确设置服务器模块的状态,使其接受4.2设备?我猜想只是在黑暗中拍摄……
更新2 ===========================
我发现不配对和重新配对将允许设备连接.这是一种解决方法,但总比没有好.
转载注明原文:android – BluetoothSocket.connect()抛出异常“读取失败” - 乐贴网