Answers:
我看不到蓝牙规范对同一区域中的设备限制有任何参考。实际上这很难确定,因为它不仅与蓝牙设备有关,而且与WiFi有关。
本文研究如何增加设备数量,增加发现设备所需的时间:http : //www.shiratori.riec.tohoku.ac.jp/~deba/PAPER/Journal/WINET-onlineFinal.pdf
还请考虑以下事项:
蓝牙设备使用2.4 GHz无线电频段,该频段与许多其他无线设备使用的未许可频率相同。如果同一区域中的许多设备都使用相同的带宽,则可能会导致整个网络问题,因为信号会发生冲突,必须重新发送信息。蓝牙信号被设计为每秒多次改变其频率,以减少这种干扰,但是,如果有足够的设备试图使用相同的小带宽,干扰是不可避免的。2010年制造的设备中使用的蓝牙3.0使用6-9 GHz频谱,因此干扰问题将大大减少。蓝牙3.0设备还能够以2.4 GHz进行传输,以与早期的蓝牙技术进行通信。蓝牙3.0,运行于2.4 GHz,
总结一下:您需要仔细考虑可能的干扰以及您将受到的时间限制。我怀疑可以完成25台设备。但是要确保您需要实际测试一下
关于可以发现多少个设备没有理论上限,它与发现时间成正比。增加发现所花费的时间将增加检测范围内所有设备的机会。
基本上,发现是通过扫描设备在32个频率之一上扫描,而广告设备在所有32个频率上发送信标来执行的。广告设备会继续重复此序列,而扫描设备收到信标后,将响应并随机退避一段时间,然后锁定到新的频率并重复相同的过程。因此,即使有多个设备以特定的频率扫描,它们的响应也会在第一次发生冲突,但是在退避之后,它们会随机以不同的频率出现,从而增加了响应不再冲突的机会。
在您使用25个活动设备的情况下,这完全不是问题,我使用的设备和环境中有50-100个设备,而10-15秒的发现可以轻松找到大多数设备。希望这可以帮助。
最近,我研究了一个相同的问题-我的发现是限制是由IC还是由软件造成的。
最好使用的芯片是基于TI且基于芯片上软件的芯片。
Android / Apple / Windows在内核中有其自身的局限性-因此使用软件来枚举BT的任何软件都将受到BT-Stack / Kernel的限制。由于IC的堆栈很简单,因此使用SoC没有限制。
使用自定义方式将信息传递到程序。
那天我决定不使用BT,因为它在整个工作过程中绝对疼痛。
除非采用新的V4标准以更好的新方式处理广告。
我还需要在一个房间里拥有无限的BT。.决定制作自己的专有PCB和接收器-为什么?因为信不信由你,它更容易,更便宜。
回到您的问题。
(使用WP7 / iPhone3,4 / Android之类的东西)
BTv2.1 BT3
一般而言,可靠的数量不超过10。我见过的最多处理了32个。
BT4
白皮书说128。。只有Apple 4S支持此版本,因此我尚未测试。
我认为没有限制。我实现附近设备检测的方法是使用InTheHand.Net库(http://32feet.codeplex.com/),对附近所有设备定期运行发现,然后不久连接到每个设备以确保它仍然可用。没有连接,我意识到无法保证您会准确知道一台设备何时到达或离开。
下面的例子:
public static List<Device> DiscoverDevices() {
BluetoothClient bc = new BluetoothClient();
m_btc = bc;
List<Device> devices = new List<Device>();
DateTime startDisc;
Boolean canConnect;
BluetoothDeviceInfo[] array = bc.DiscoverDevices(15, true, true, true);
int count = array.Length;
startDisc = DateTime.Now;
for (int i = 0; i < count; i++) {
Device device = new Device(array[i]);
if (MZPState.Instance == null) {
MLog.Log(null, "BT discovery interrupted");
return devices;
}
canConnect = CanConnect(device);
if (canConnect) {
//MLog.Log(null, "Active BT device detected " + device.ToString());
devices.Add(device);
}
//MLog.Log(null, "Discovery result="+canConnect+" on " + device.DeviceName + " " + device.Address+ " took "
// + Utilities.DurationAsTimeSpan(DateTime.Now.Subtract(startDisc)));
}
Performance.Create("Bluetooth local discovery", false, "",
Performance.PerformanceFlags.Speed, DateTime.Now.Subtract(startDisc).TotalMilliseconds);
return devices;
}
public static Boolean CanConnect(Device device) {
bool inRange;
Guid fakeUuid = new Guid("{F13F471D-47CB-41d6-9609-BAD0690BF891}"); // A specially created value, so no matches.
try {
ServiceRecord[] records = device.DevInfo.GetServiceRecords(fakeUuid);
//Debug.Assert(records.Length == 0, "Why are we getting any records?? len: " + records.Length);
inRange = true;
}
catch (Exception) {
inRange = false;
}
return inRange;
}