我可以在一个空间中可靠地检测到多少个活动蓝牙设备?


9

我正在设计一个低成本的景点,希望使用蓝牙设备识别进行邻近检测-即访客A是否在静态位置X范围内。将为每个访客提供定制的移动设备(基于iPod或Android)。

在枚举附近所有设备不可靠之前,蓝牙设备“密度”的实际上限是多少?例如,在一台固定的支持蓝牙功能的PC附近是否有25个活动设备太多而无法完全可靠地检测到(所有设备)?这太拥挤了吗?

(要明确:我不需要建立连接。我只需要通过名称可靠地检测设备的存在或不存在。)


您找到问题编号了吗?
拉米斯

Answers:


9

我看不到蓝牙规范对同一区域中的设备限制有任何参考。实际上这很难确定,因为它不仅与蓝牙设备有关,而且与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台设备。但是要确保您需要实际测试一下


5

关于可以发现多少个设备没有理论上限,它与发现时间成正比。增加发现所花费的时间将增加检测范围内所有设备的机会。

基本上,发现是通过扫描设备在32个频率之一上扫描,而广告设备在所有32个频率上发送信标来执行的。广告设备会继续重复此序列,而扫描设备收到信标后,将响应并随机退避一段时间,然后锁定到新的频率并重复相同的过程。因此,即使有多个设备以特定的频率扫描,它们的响应也会在第一次发生冲突,但是在退避之后,它们会随机以不同的频率出现,从而增加了响应不再冲突的机会。

在您使用25个活动设备的情况下,这完全不是问题,我使用的设备和环境中有50-100个设备,而10-15秒的发现可以轻松找到大多数设备。希望这可以帮助。


1

最近,我研究了一个相同的问题-我的发现是限制是由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支持此版本,因此我尚未测试。


0

蓝牙设备一次最多可以连接7台设备。
但是根据设备配置的不同而有所不同。
问题
Question1
检查一下上面的链接,这可能对您有帮助


3
问题不是要连接多少设备,而是要检测多少设备。不会进行配对。
Kortuk

0

我认为没有限制。我实现附近设备检测的方法是使用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;

    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.