Android BluetoothSocket.connect()引发异常;“读取失败”;

Android BluetoothSocket.connect()引发异常;“读取失败”;,android,bluetooth,Android,Bluetooth,我有一个通过蓝牙连接到设备的项目。它过去工作得相当可靠,但现在每次调用BluetoothSocket.connect()都失败了。(嗯,我在4小时内的数千次尝试中让它连接了一次。)大部分代码都取自API中的标准示例聊天代码,但获取BluetoothSocket设备本身的常见修改除外: Method m = device.getClass().getMethod( "createRfcommSocket", new Class[] { int.class }); tmp

我有一个通过蓝牙连接到设备的项目。它过去工作得相当可靠,但现在每次调用
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):连接到 ZYNO-700091 00:06:66:42:8E:01失败:读取失败,套接字可能 关闭,读取ret:-1

这个错误过去常常偶尔出现。我有一个积极的重新连接系统-它基本上反复敲打连接,直到它连接,如果它曾经断开,它开始再次敲打它。因此,它会终止连接线程并不断从头开始。我曾经考虑过可能存在一个问题——可能是多线程问题,也可能是处理套接字清理/初始化问题。然而,如果是这样的话,我仍然希望第一次连接尝试会成功,因为系统只有在连接尝试失败后才会启动

我调查了引发异常的原因。问题似乎是底层的
InputStream
没有数据。当然,这不是一个真正的答案,只是朝着它迈出了一步。为什么流没有数据

我正试图对潜在的问题保持开放的态度。我是否正确获得了
BluetoothSocket
?它曾经是一个间歇的问题,现在几乎是恒定的,这让我怀疑多线程,但是在java中,C++是一个相对简单的主题,如果你知道你在做什么,那么它很难拧紧。另外,这段代码的大部分(特别是处理线程同步的部分)都是直接从示例代码中提取出来的

另一端的设备是嵌入式蓝牙设备,因此从这一端调试问题的希望不大

更新===========================

我突然想到,这可能是由于操作系统升级(我在Galaxy Nexus手机上运行-我有几个要测试)。所以我用4.0.4打开了一部新手机,它工作了!于是,我又回去在两款最初的测试手机上进行测试,都运行4.2,期待着我一直看到的失败。奇怪的是,现在它也能在那些手机上工作。我想说我做了些什么让这一切再次成功,但我没有。我仍然迷惑不解,现在也怀疑这个东西在我真正需要它的时候会起作用

我想知道是否有一种可能性,使用4.0.4进行连接可以正确设置服务器模块的状态,使其能够接受4.2设备?我想,只是在黑暗中开了一枪

更新2===========================


我发现,取消配对和重新配对将允许设备连接。这是一个解决办法,但总比什么都没有好。

Jellybean有一个完全不同的蓝牙协议栈,因此版本差异肯定会触发一些问题,但这本身并不能解释为什么它在与旧设备连接后仍然工作或不工作。这可能与结对有关吗?如果这种情况再次发生,请尝试从设备中取消配对并再次配对。

我知道这是一个老问题。但由于我无法在网络上找到任何解决方案,我最近创建了一个解决方案:

我在通过蓝牙模块连接arduino时遇到了相同的问题。该问题仅在与arduino连接时出现,因为它与另一款安卓手机蓝牙连接顺畅。
对我有效的是更改UUID字符串。

在我的例子中,这是由于
createrFComSocketToServiceRecord()
函数中的UUID错误造成的。 我想连接到raspberry pi 3中的SPP串行配置文件,我使用了以下UUID:

private static final UUID MY_UUID_SECURE =
            UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

我在android文档页面的某个地方找到了SPP。

我也有同样的问题,我有一个将vía bluetooth打印到Datamax o'neil APEX4打印机的代码。适用于Galaxy Tab 7 plus和蜂巢3.2。但在其他具有IC或更高版本的设备中,则不起作用。我比较的是BluetoothSocket对象,它们非常不同。你确定你没有添加任何代码吗?Jellybean有一个完全不同的蓝牙协议栈,所以版本差异肯定会触发一些东西,但这本身并不能解释为什么它在与旧设备连接后仍然工作或不工作。这可能与结对有关吗?如果这种情况再次发生,请尝试从设备中取消配对并再次配对,然后看看会发生什么。@DanHulme我认为你是对的,是不同的蓝牙堆栈导致了这种情况。我用4.1做了一些测试,效果很好。如果你想把它写下来作为一个答案,我很乐意接受它。“它基本上会反复地敲打连接,直到它连接起来”——谢谢!那句话对我帮助很大。我不知道你应该这么做,所以在我正在编写的蓝牙应用程序中,当连接失败时我放弃了。但在将其改为循环后,它就可以工作了。@Kent Andersen:(但请注意,该应用程序是内部使用的概念证明,而不是生产质量程序。)我只有Nexus 7、Android4.2.1存在同样的问题——在所有其他安卓版本和其他手机/设备上,它都能完美工作。重新配对没有帮助。为了让它再次发挥作用,还需要做些什么吗?非常感谢!ps die UUID Is OKI也遇到同样的问题,任何帮助都将不胜感激。非常有趣。我必须尝试一下,看看它是否也适用于我的设备。谢谢酷。可以吗