Проблема в том, что обнаружение кажется довольно дрянным... Даже при отсутствии устройства на расстоянии от моего компьютера прослушиватель часто возвращает значение RSSI -127, что, как я понял, означает «нет обнаружения». Я попробовал установить OutOfRangeTimeout на 10 секунд, и даже если ситуация улучшится, проблемы все равно останутся серьезными. Основная проблема заключается в том, что обнаружение может проходить без перерыва всего лишь в течение нескольких секунд, затем отладчик сигнализирует мне о завершении потока с кодом 0, и прослушиватель не может получать новые рекламные объявления (когда устройство всегда находится в стороне от компьютера) даже в течение 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 + " ");
}
Подробнее здесь: https://stackoverflow.com/questions/405 ... er-cyclica