在使用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 + " ");
}
感谢任何帮助!