我在Android上使用Master-Slave设计为蓝牙编写应用程序。微微网中的主控可以拥有多达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个活跃的奴隶)有关,还是有另一个我不知道的事件?
答案 0 :(得分:0)
使用不同设备(平板电脑,智能设备)进行测试后,此错误与蓝牙核心规范(我查看4.2规范版本)有关,该规范仅允许微微网中的8个活动设备(主设备+最多7个从设备)。
有趣的事实: 我使用Java的BlueCove库为我的笔记本电脑创建应用程序,它充当微微网中的主设备,它不会将从设备限制为7.我设法连接9个从设备,同时处于活动状态。这不是蓝牙规范所说的。为了解决这个问题,我以编程方式将限制设置为7个从属。
答案 1 :(得分:0)
我不认为此错误与蓝牙核心规范有关。由于LT_ADDR是一个3位值,因此有超过7个活动从站不可能,其中0保留用于广播。
来自规范Vol.2 Part B Section 4.2
微微网中活动的每个从站都被分配了一个主要的3位逻辑传输 地址(LT_ADDR)。 [...] LT_ADDR只有在从机处于活动模式时才有效。
同样来自第6.4.1节
此字段[LT_ADDR]表示目标从站(或从站中的从站) 对于主从传输时隙中的分组的广播情况 表示从主站到主站传输时隙的源从站。
我认为关键是活动这个词。第8.6节定义了活动模式和活动从属。我认为你设法拥有超过7个奴隶,因为并非所有奴隶都处于活动模式,例如,有些可能被置于嗅探模式。或者主设备上的蓝牙控制器可以完成其他一些技巧。
为了了解发生了什么,我建议您检查主人的HCI日志,您可以按照here所述检索。