+-
android – BluetoothSocket.connect()抛出异常“读取失败”
我有一个通过蓝牙连接到设备的项目.它过去工作相当可靠,但现在每次都无法通过BluetoothSocket.connect()调用. (好吧,我在4小时内的数千次尝试中连接了一次.)大部分代码都来自API中的标准示例聊天代码,但获取BluetoothSocket设备的常见修改除外本身:

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 ===========================

我发现不配对和重新配对将允许设备连接.这是一种解决方法,但总比没有好.

最佳答案
Jellybean有一个完全不同的蓝牙堆栈,因此版本差异肯定会触发某些东西,但这本身并不能解释为什么它在连接旧设备后仍能正常工作或无法正常工作.这可能与配对有关吗?如果再次发生,请尝试从设备取消配对并再次配对.
点击查看更多相关文章

转载注明原文:android – BluetoothSocket.connect()抛出异常“读取失败” - 乐贴网