Довольно просто прослушать рекламу BLE и узнать адрес Bluetooth, уровень сигнала и т. Д. Из объявления. Эта страница говорит
Получив адрес, вы можете вызвать BluetoothLEDevice.FromBluetoothAddressAsync, чтобы получить ссылку на устройство.
так я и сделал, и это дало мне объект BluetoothLEDevice со свойством Name. К сожалению, имя часто - но не всегда - пустая строка.
Когда я в интерактивном режиме сканирую устройства Bluetooth, Windows показывает мне список имен для устройств, которые он может видеть (исключая уже подключенные устройства). Он делает это очень быстро и показывает количество устройств, которые никогда не появляются в именах, набранных из рекламы.
Существует ли надежная стратегия для быстрого получения имени, которое обычно отображается, когда компьютеры и телефоны отображают список непарных устройств?
Я попробовал предложение от Эмиля, и хотя это упрощает мой код, устраняя необходимость в получении объекта BluetoothLEDevice, остается фундаментальная проблема: нельзя полагаться на рекламные объявления, предоставляющие имя. Они даже не содержат значимых данных производителя.
Код в настоящее время выглядит следующим образом
BluetoothLEAdvertisementWatcher watcher = new BluetoothLEAdvertisementWatcher();
...
watcher.Received += OnAdvertisementReceived;
watcher.Start();
...
private void BleAdvertHandlerAsync(BluetoothLEAdvertisementReceivedEventArgs args)
{
var localName = args.Advertisement.LocalName;
...
}
Добавление локального имени в переменную обходит тот факт, что разрешение значения влечет за собой вызов COM, который недопустим в выражении точки останова.
Играя с переключателями на моей мыши и клавиатуре, которые могут быть соединены с тремя разными хостами и переключаться между ними, я замечаю, что когда я говорю им подключиться к другому хосту, я немедленно получаю рекламу, содержащую имена. Если хост не присутствует, существует их постоянный поток, который прекращается, когда я снова переключаюсь на свой компьютер, и сеанс устанавливается.
Это говорит о том, что реклама - это не то, как Windows заполняет свой список непарных хостов.