Я использую C ++ / winRT UWP для обнаружения и подключения к устройствам с низким энергопотреблением Bluetooth. Я использую средство отслеживания рекламы для поиска рекламы на устройствах, которые я могу поддерживать. Это работает.
Затем я выбираю один для подключения. Процедура подключения немного странная, если подумать, но в соответствии с документацией Microsoft один из них вызывает метод FromBluetoothAddressAsync () с BluetoothAddress, и происходят две вещи; Вы получаете BluetoothLEDevice И предпринимается попытка подключения. Нужно зарегистрировать обработчик для события изменения статуса подключения, НО вы не сможете сделать это, пока не получите BluetoothLEDevice.
Есть ли проблема синхронизации, вызывающая исключение? Соединение уже произошло, ДО того, как я получу объект BluetoothLEDevice? Ниже приведен код, а под ним - журнал:
void BtleHandler::connectToDevice(BluetoothLEAdvertisementReceivedEventArgs eventArgs)
{
OutputDebugStringA("Connect to device called\n");
// My God this async stuff took me a while to figure out! See https://msdn.microsoft.com/en-us/magazine/mt846728.aspx
IAsyncOperation<Windows::Devices::Bluetooth::BluetoothLEDevice> async = // assuming the address type is how I am to behave ..
BluetoothLEDevice::FromBluetoothAddressAsync(eventArgs.BluetoothAddress(), BluetoothAddressType::Random);
bluetoothLEDevice = async.get();
OutputDebugStringA("BluetoothLEDevice returned\n");
bluetoothLEDevice.ConnectionStatusChanged({ this, &BtleHandler::onConnectionStatusChanged });
// This method not only gives you the device but it also initiates a connection
}
Приведенный выше код генерирует следующий журнал:
New advertisment/scanResponse with UUID 00001809-0000-1000-8000-00805F9B34FB
New ad/scanResponse with name Philips ear thermometer and UUID 00001809-0000-1000-8000-00805F9B34FB
Connect to device called
ERROR here--> onecoreuap\drivers\wdm\bluetooth\user\winrt\common\bluetoothutilities.cpp(509)\Windows.Devices.Bluetooth.dll!03BEFDD6: (caller: 03BFB977) ReturnHr(1) tid(144) 80070490 Element not found.
ERROR here--> onecoreuap\drivers\wdm\bluetooth\user\winrt\device\bluetoothledevice.cpp(428)\Windows.Devices.Bluetooth.dll!03BFB9B7: (caller: 03BFAF01) ReturnHr(2) tid(144) 80070490 Element not found.
BluetoothLEDevice returned
Exception thrown at 0x0F5CDF2F (WindowsBluetoothAdapter.dll) in BtleScannerTest.exe: 0xC0000005: Access violation reading location 0x00000000.
Похоже, что есть проблема синхронизации. Но если это так, я понятия не имею, как это решить. Я не могу зарегистрироваться на событие, если у меня нет объекта BluetoothLEDevice! Я не могу найти способ получить объект BluetoothLEDevice без вызова соединения.
================================ ОБНОВЛЕНИЕ ============== ===============
Изменил методы на IAsyncAction и использовал co_await, как предложено @IInspectable. Нет разницы. Проблема состоит в том, что зарегистрированный обработчик находится вне области видимости или что-то не так с ним. Я попытался использовать get_strong () вместо «this» при регистрации, но компилятор не принял его (указанный идентификатор get_strong () не определен). Однако, если я закомментировал регистрацию, исключение не выдается, но я все равно получаю эти сообщения журнала
onecoreuap\drivers\wdm\bluetooth\user\winrt\common\bluetoothutilities.cpp(509)\Windows.Devices.Bluetooth.dll!0F27FDD6: (caller: 0F28B977) ReturnHr(3) tid(253c) 80070490 Element not found.
onecoreuap\drivers\wdm\bluetooth\user\winrt\device\bluetoothledevice.cpp(428)\Windows.Devices.Bluetooth.dll!0F28B9B7: (caller: 0F28AF01) ReturnHr(4) tid(253c) 80070490 Element not found.
Но программа продолжает работать, и я продолжаю обнаруживать и подключаться. Но поскольку я не могу получить событие подключения, на данном этапе это бесполезно.