#windows #bluetooth #windows-runtime #bluetooth-lowenergy #midi
#Windows #bluetooth #windows-среда выполнения #bluetooth — низкое энергопотребление #midi
Вопрос:
Моя команда столкнулась с довольно странной проблемой при использовании WinRT / C API для Windows для подключения как к MIDI-порту, так и к получению уведомлений BLE через проприетарную службу на том же устройстве.
Сама библиотека WinRT / C действительно хороша и предоставляет простые и современные интерфейсы C для доступа к управляемым классам среды выполнения Windows.
Я отправил образец репозитория на Github, где мы воспроизвели проблему с минимальным примером.
Readme репозитория подробно описывает проблему, но я опубликую соответствующие фрагменты здесь для полноты картины.
Примерная программа выполняет примерно следующие шаги:
-
Проверьте наличие доступных MIDI-устройств с помощью DeviceWatcher.
-
Проверьте наличие доступных устройств Bluetooth LE, используя другой экземпляр DeviceWatcher.
-
Сопоставьте обнаруженные устройства MIDI и BluetoothLE по их свойству containerId (подробности см. в DeviceInfo). Этот метод JUCE использует в собственном коде WinRT для своей библиотеки и работает, как ожидалось.
-
Откройте MIDI-порт и присоедините обработчик к событию MessageReceived (см. Код).
-
Это приводит к тому, что система создает соединение с устройством Bluetooth LE. Программа обнаруживает это изменение состояния, создает Bluetooth-устройство, мы выполняем обнаружение службы GATT и прикрепляем обработчик к событию valueChanged для характеристики, от которой нас интересуют уведомления (см. Код).
Затем программа подсчитывает, сколько MIDI-сообщений получено на каждом порту и сколько уведомлений BLE получено от соответствующего устройства.
Поведение, которое мы замечаем, заключается в том, что данные с последнего подключенного устройства передаются нормально, в то время как пропускная способность для других сильно ограничена. Мы находимся в тупике в отношении этой проблемы и не уверены, в чем может заключаться проблема.
Мы здесь в тупике. Я был бы более готов принять это, если бы все устройства демонстрировали такое поведение, но это не так. Есть ли какая-либо причина, по которой создание как MidiInPort, так и BluetoothLEDevice с одного и того же периферийного устройства должно вызывать эту проблему?
Ответ №1:
Радио BLE может принимать или отправлять только в любой момент времени. И поэтому в любой момент времени связывается только с одним устройством. Он использует планировщик для выделения времени радиосвязи для каждого устройства, когда у вас много устройств. Таким образом, второе соединение может «прервать» событие подключения с другого устройства, уменьшая пропускную способность для этого устройства. См. https://infocenter.nordicsemi.com/topic/sds_s132/SDS/s1xx/multilink_scheduling/central_connection_timing.html
Комментарии:
1. Привет, спасибо за ответ. Хотя это хорошая догадка, я не решаюсь принять это как основную причину. Мы разрабатываем кроссплатформенное программное обеспечение, и версия macOS не демонстрирует такого поведения (даже на том же оборудовании). В среде выполнения Windows должно быть что-то, что мы либо неправильно понимаем, либо в корне неверно.
2. Затем используйте анализатор BLE, чтобы увидеть, что на самом деле происходит в воздухе. И, кстати, какой у вас интервал подключения?