0

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

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 个主动从属)有关,或者还有其他我不知道的情况?

4

2 回答 2

0

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

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

于 2017-11-06T13:00:01.847 回答
0

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

来自规范 Vol.2 Part B 第 4.2 节

微微网中的每个活动从属设备都分配有一个主要的 3 位逻辑传输地址 (LT_ADDR)。[...] LT_ADDR 仅在从机处于活动模式时才有效。

同样来自第 6.4.1 节

该字段 [LT_ADDR] 指示主从传输时隙中的数据包的目标从属设备(或广播情况下的从属设备),并指示从属对主传输时隙的源从属设备。

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

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

于 2017-11-06T20:37:10.817 回答