UWP BLE останавливает уведомления при использовании внутреннего Bluetooth - PullRequest
1 голос
/ 23 марта 2020

У меня есть датчик BLE, который отправляет данные с частотой 100 Гц, и я разработал приложение UWP для получения этих данных. У меня странная проблема, когда через пару секунд все работает нормально, я прекращаю получать уведомления о новых данных.

Теперь я говорю, что это странно, потому что это происходит, когда я использую внутренний Bluetooth ноутбука но не при использовании Bluetooth-ключа. При использовании ключа он работает нормально и никогда не останавливается. Как внутренние драйверы Bluetooth, так и драйверы ключей обновляются до последней версии, которую Windows может найти.

Как только уведомление прекращается, датчик отключается.

Датчик основан на Nordi c nRF52832 Итак C.

Теперь немного информации о моем коде:

  • У меня есть класс Sensor.cs, в котором я обрабатываю соединение и потоковую передачу данных.
  • Я использую BluetoothLEAdvertisementWatcher, чтобы найти датчик.
  • * GattCharacteristic являются частными членами класса Sensor.
  • Я подписываюсь на уведомления по телефону:
await _gattDataSensorsCharacteristic.WriteClientCharacteristicConfigurationDescriptorAsync(
   GattClientCharacteristicConfigurationDescriptorValue.Notify);

Приложение не делает ничего особенного. Просто подключается к датчику, запускает потоковую передачу и распечатывает данные.

Я провел достаточно исследование и не смог найти ничего подобного. Я нашел сообщения об остановке уведомлений, потому что объект был забран G C, характеристики были локальными переменными вместо членов класса, или не ожидались вызовы.

Почему это происходит?

1-е редактирование

@ Эмиль Извините, я виноват в том, что не упомянул, что, как только прекращаются уведомления, датчик отключается. Я редактирую вопрос, чтобы упомянуть это, а также что-то актуальное. Во всяком случае, я пытаюсь, что вы упоминаете как можно скорее.

@ GrooverFromHolland Эта опция была отмечена. Я пытался снять этот флажок на нескольких компьютерах, но, к сожалению, снятие флажка делает его продолжительностью всего несколько секунд.

@ Нико Чжу - MSFT Я перешел по ссылке, которую вы разместили, и прочитал документацию. c также обратился к руководству по эксплуатации моего датчика, чтобы дважды проверить, позволяет ли характеристика c уведомлять, и она разрешает чтение и уведомление. Я также делаю то же самое characteristic.ValueChanged += Characteristic_ValueChanged;, как упомянуто в do c.

Об отключении датчика при прекращении уведомлений / прекращении срабатывания измененного значения. Я должен добавить, что в моем MainWindow сенсорный объект является классом-членом, и он никогда не удаляется. Так что не имеет смысла, что G C забирает объект, верно?

2-е редактирование

Я пробовал код, который я использую как с подключенным ноутбуком, так и отключен от источника питания, и он всегда настроен на максимальную производительность. Код, который я использую, можно найти здесь: ссылка

3-е редактирование

Следуя рекомендациям @Emil, я наконец смог отсканировать трафик c. Пытался понять, что такое файл pcap, сгенерированный USBPcap, но я просто не понимаю. Я пробовал проблему с 2 датчиками, и шаблон остановки отключения / уведомления выглядит по-разному для каждого датчика. Я сделал папку Dropbox, содержащую два файла pcap: ссылка

Из того, что я понял, в файле "ble-FE592382586F.pcap" интересная строка No: 12647 и 12681 Он говорит, что источником является контроллер, а местом назначения является хост. Является ли контроллер драйвером Bluetooth для ноутбука?

1 Ответ

1 голос
/ 27 марта 2020

Контроллер означает чип Bluetooth (внутри или снаружи компьютера), а хост является основным процессором. Они разговаривают друг с другом через USB. В пакете 12681 в первом файле причиной отключения является время ожидания подключения (0x08). Это означает, что соединение было разорвано неожиданно (радиопомехи / плохой сигнал?). В пакете 613 в другом файле мы имеем такую ​​же ситуацию. Разница лишь в том, что только во втором файле была предпринята новая попытка переподключения устройства.

Поскольку вы не используете связывание, вы должны обязательно переписать дескриптор конфигурации характеристики клиента c при каждом новом подключении. Не похоже, что вы делаете это.

...