蓝牙插座信号大小错误

Bluetooth socket wrong signal size

我正在为 Android 上的蓝牙主从设计编写一个应用程序。 piconet 中的主机最多可以有 7 个活动的从机。我已经阅读了 Android 蓝牙开发指南和 BluetoothSocket.java 源代码,但是没有提到最大从机数量。所以我在下面的代码中尝试接受7个以上的slave:

private void startServerSocket(String name) {
    BluetoothServerSocket serverSocket = null;
    try {
        serverSocket = mAdapter.listenUsingInsecureRfcommWithServiceRecord(macMap.get(name), uuidMap.get(name));
        for (int i = 0; i < 8; i++) {
            BluetoothSocket socket = null;

            Log.d(TAG, i + " waitting for " + name + " to accpet...");
            socket = serverSocket.accept();
            Log.d(TAG, i + " " + name + " accepted");

            // corresponding slave thread on master side
            MasterSocketThread mst = new MasterSocketThread(socket, socket.getRemoteDevice().getName());
            mst.start();

            // register slave thread to master manager
            mCallback.registerSocketThread(mst);
        }
        serverSocket.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

作为第 8 次迭代的结果,我从 accept() 方法中得到了这个异常:

android io.IOException: Connection failure, wrong signal size: 27763

我的问题是它是否与蓝牙标准(7 个活动从设备)有关,或者还有其他我不知道的情况?

在使用不同设备(平板电脑、smartfons)进行测试后,此错误与蓝牙核心规范(我查看了 4.2 规范版本)有关,该规范仅允许微微网中的 8 个活动设备(主设备 + 最多 7 个从设备)。

有趣的事实: 我使用 Java 的 BlueCove 库为我的笔记本电脑创建了应用程序,它在 piconet 中充当主设备,它不会将从设备限制为 7 个。我设法连接了 9 个从设备,同时处于活动状态。这不是蓝牙规范所说的。为了解决这个问题,我以编程方式将限制设置为 7 个奴隶。

我认为这个错误与蓝牙核心规范无关。 不可能 有超过 7 个活动从站,因为 LT_ADDR 是一个 3 位值,其中 0 保留用于广播。

来自规范第 2 卷 B 部分第 4.2 节

Each slave active in a piconet is assigned a primary 3-bit logical transport address (LT_ADDR). [...] The LT_ADDR shall only be valid for as long as a slave is in the active mode.

也来自第 6.4.1 节

This field [LT_ADDR] indicates the destination slave (or slaves in the case of a broadcast) for a packet in a master-to-slave transmission slot and indicates the source slave for a slave-to-master transmission slot.

我认为关键是 active 这个词。第 8.6 节定义了主动模式和主动从站。我想你设法拥有了 7 个以上的奴隶,因为并非所有奴隶都处于活动模式,例如,有些可能处于嗅探模式。或者您的主设备上的蓝牙控制器可能会完成其他一些技巧。

要了解发生了什么,我建议您检查主机上的 HCI 日志,您可以按照 here 所述检索该日志。