蓝牙LE设备作为接近传感器,BluetoothLEAdvertisementWatcher循环停止收听广告

时间:2016-11-10 08:27:39

标签: c# bluetooth-lowenergy proximity

在使用C#学习BLE编程的过程中,我正在尝试编写一个winform应用程序,该应用程序应检测BLE设备并将其用作接近传感器。为此,我应用了BluetoothAdvertisementWatcher类,使用提供的信号强度过滤广告。问题是检测似乎很糟糕......即使设备与我的电脑没有距离,听众通常也会返回-127的RSSI值,这正如我所理解的那样代表“无法检测”。我已经尝试将OutOfRangeTimeout设置为10秒,即使事情变得更好,问题仍然很严重。主要问题是检测可以在没有中断的情况下流动大约几秒钟,然后调试器向我发出一个退出代码为0的线程,并且监听器无法接收新的广告(将设备放在PC旁边) 30-40秒,然后重新启动,所以它循环。 你知道这是打算如何工作,还是我错过了什么?最终是否有办法拦截这种中断并立即重新启动监听器?

这是我初始化观察者的方式:

public BLEScanner(short maxDBRange, TimeSpan outOfRangeTimeout) {

        this.InRange = maxDBRange;
        this.OutOfRange = (short)(this.InRange + BLEScanner.BUFFER_RANGE);
        this.OutOfRangeTimeout = outOfRangeTimeout;

        this.watcher = new BluetoothLEAdvertisementWatcher();
        this.watcher.SignalStrengthFilter.InRangeThresholdInDBm = this.InRange;
        this.watcher.SignalStrengthFilter.OutOfRangeThresholdInDBm = this.OutOfRange;
        this.watcher.SignalStrengthFilter.OutOfRangeTimeout = this.OutOfRangeTimeout;
        this.watcher.SignalStrengthFilter.SamplingInterval = TimeSpan.FromSeconds(1);
        this.watcher.ScanningMode = BluetoothLEScanningMode.Active;
    }

虽然这是事件处理程序:

private async void OnAdvertisementReceived(BluetoothLEAdvertisementWatcher watcher, BluetoothLEAdvertisementReceivedEventArgs eventArgs) {

        var deviceAddress = eventArgs.BluetoothAddress;
        BluetoothLEDevice device = await BluetoothLEDevice.FromBluetoothAddressAsync(deviceAddress);

        UpdateUiDelegate update = new UpdateUiDelegate(
            (dev, args) => {
                if (eventArgs.RawSignalStrengthInDBm == -127) {
                    this.form.spyLabel.BackColor = System.Drawing.Color.Red;
                    this.form.nameLabel.Text = "(none)";
                    this.form.addressLabel.Text = "(none)";
                    this.form.rssiLabel.Text = "(none)";
                    this.form.connectedLabel.Text = device.ConnectionStatus.ToString();
                } else {
                    this.form.spyLabel.BackColor = System.Drawing.Color.Green;
                    this.form.nameLabel.Text = device.Name;
                    this.form.addressLabel.Text = device.BluetoothAddress.ToString();
                    this.form.rssiLabel.Text = eventArgs.RawSignalStrengthInDBm.ToString();
                    this.form.connectedLabel.Text = device.ConnectionStatus.ToString();
                }
            });
        this.form.Invoke(update, device, eventArgs);

        Console.Write(eventArgs.RawSignalStrengthInDBm + " ");
    }

感谢任何帮助!

0 个答案:

没有答案