我有一个通过蓝牙连接到设备的项目.它曾经相当可靠地工作,但现在它BluetoothSocket.connect()
每次都无法通话.(好吧,我在4小时内的数千次尝试中连接了一次.)大部分代码都取自API中的标准示例聊天代码,但获取BluetoothSocket
设备本身的常见修改除外:
Method m = device.getClass().getMethod(
"createRfcommSocket", new Class[] { int.class });
tmp = (BluetoothSocket) m.invoke(device, Integer.valueOf(1));
Run Code Online (Sandbox Code Playgroud)
这是感兴趣的方法,一旦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);
}
Run Code Online (Sandbox Code Playgroud)
相关的日志条目(在调用时捕获异常时打印connect()
)是这样的:
11-30 10:23:51.685:E/BluetoothChatService(2870):在00:06:66:42:8E:01失败时连接到ZYNO-700091:读取失败,插座可能关闭,读取返回:-1
此错误曾经偶尔出现过.我有一个积极的重新连接系统 - 它基本上反复锤击连接,直到它连接,如果它永远断开,它开始再次锤击它.因此,它会终止连接线程并从头开始.我曾经考虑过那里可能存在一个问题 - 可能是多线程的,或者可能是处理套接字清理/初始化.但是,如果是这种情况,我仍然期望第一次连接尝试成功,因为在连接尝试失败之前该系统不会启动.
我查看了抛出异常的源代码.问题似乎是基础InputStream
没有数据.当然,这不是一个真正的答案,只是迈向它的一步.为什么流没有数据?
我试图对潜在的问题保持开放的态度.我得到了BluetoothSocket
正确的答案吗?事实上,它曾经是一个间歇性问题,现在几乎不变,这让我怀疑多线程,但与C++相比,这是一个相对简单的Java主题 - 如果你知道自己在做什么,很难搞砸.此外,这些代码的大部分(特别是处理同步线程的部分)直接来自示例代码.
另一端的设备是嵌入式蓝牙设备,因此从这一点调试问题的希望不大.
更新===========================
在我看来,它可能是由于操作系统升级(我在Galaxy Nexus手机上运行 - 我有几个要测试).所以我用4.0.4拆开了一个新手机,它工作了!然后回到两个原始测试手机上测试,两个都运行4.2,期待我一直看到的失败.奇怪的是,现在它也适用于那些手机.我想说我做了一些让这项工作重新开始的事情,但事实并非如此.我仍然感到神秘,现在还怀疑当我真的需要它时这个东西会起作用.
我想知道是否有可能以某种方式连接使用4.0.4可以正确设置服务器模块的状态,使其接受4.2设备?我猜想只是在黑暗中拍摄......
更新2 ===========================
我发现不配对和重新配对将允许设备连接.这是一种解决方法,但总比没有好.
Jellybean有一个完全不同的蓝牙堆栈,因此版本差异肯定会触发某些东西,但这本身并不能解释为什么它在连接旧设备后仍能正常工作或无法正常工作.这可能与配对有关吗?如果再次发生,请尝试从设备取消配对并再次配对.
归档时间: |
|
查看次数: |
27806 次 |
最近记录: |