Устройство Bluetooth LE в качестве датчика приближения, BluetoothLEAdvertisementWatcher циклически прекращает прослушиваC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Устройство Bluetooth LE в качестве датчика приближения, BluetoothLEAdvertisementWatcher циклически прекращает прослушива

Сообщение Anonymous »

При изучении программирования BLE с использованием C# я пытаюсь написать приложение winform, которое должно обнаруживать устройства BLE и использовать их в качестве датчиков приближения. Для этой цели я применил класс BluetoothAdvertisementWatcher, фильтрующий рекламу с заданным уровнем сигнала.
Проблема в том, что обнаружение кажется довольно дрянным... Даже при отсутствии устройства на расстоянии от моего компьютера прослушиватель часто возвращает значение 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»