ERROR_ACCESS_DENIED при использовании BluetoothLEAdvertWatcher в C ++ / WinRT - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь использовать BluetoothLEAdvertWatcher для обнаружения рекламных пакетов BLE.Однако после вызова Start () объект-наблюдатель всегда прерывается с ошибкой «Доступ запрещен».

Код довольно прост и имеет следующий вид:

auto filter = BluetoothLEAdvertisementFilter();
auto advert = BluetoothLEAdvertisement();
advert.LocalName(L"Greeny");
filter.Advertisement(advert);
m_watcher.AdvertisementFilter(filter);

// setup event handlers
m_watcher.Received({ this, &MainPage::OnAdvertisementRecieved });
m_watcher.Stopped({ this, &MainPage::OnAdvertisementStopped });

m_watcher.Start();

m_watcher - член класса, объявленный как:

BluetoothLEAdvertisementWatcher m_watcher;

Обработчики событий объявлены как:

void MainPage::OnAdvertisementRecieved(BluetoothLEAdvertisementWatcher const& watcher, BluetoothLEAdvertisementReceivedEventArgs const& args)
{
    OutputDebugString(L"Bluetooth advertisement received!\n");
}

void MainPage::OnAdvertisementStopped(Windows::Devices::Bluetooth::Advertisement::BluetoothLEAdvertisementWatcher const & watcher, Windows::Devices::Bluetooth::Advertisement::BluetoothLEAdvertisementWatcherStoppedEventArgs const & args)
{
    OutputDebugString(L"Advertising stopped\n");
}

Этот код очень похож на пример кода в SDK, который находится в C #.Я пытаюсь сделать то же самое в C ++, поскольку я более знаком с ним.

Есть идеи, что может пойти не так?Я попытался удалить все фильтры, то есть с помощью наблюдателя в его состоянии по умолчанию.Это тоже дает ту же ошибку.Удаление обработчиков событий также приводит к той же ошибке.

Заранее спасибо.

РЕДАКТИРОВАТЬ: изменил заголовок, добавив ERROR_ACCESS_DENIED.

EDIT2: Точное место, где происходит ошибкаявляется: onecoreuap \ drivers \ wdm \ bluetooth \ user \ winrt \ advertising \ bluetoothleadvertisingwatcher.cpp (1510) \ Windows.Devices.Bluetooth.dll! 0F479314: (вызывающий абонент: 0F47AD40) Исключение (2) tid (2c1c) 80070005 Доступ запрещен.

Ответы [ 2 ]

0 голосов
/ 21 июня 2018

Хорошей идеей будет установить m_watcher.ScanningMode = Active;перед вызовом Start ();

Кроме того, если вы разрабатываете не UWP (классическое) приложение, вы должны быть уверены, что WinRT инициализирован правильно.Как WinRT, основанный на технологии COM, хорошо инициализировать WinRT до того, как будет сделан любой другой вызов COM.Однако некоторые приложения, основанные на любых платформах (например, MFC, Delphi VCL или другие), могут внутренне инициализировать COM с помощью пользовательских параметров.В этом случае рекомендуется вызывать RoInitialize (RO_INIT_MULTITHREADED) из отдельного потока.

Microsoft пишет, что WinRT должен быть инициализирован с флагом RO_INIT_MULTITHREADED.Однако наш опыт показывает, что использование других флагов также работает, но все события WinRT будут выполняться синхронно.Не подходит для работы.

И, наконец, если вы разрабатываете приложение UWP , не забудьте настроить возможности устройства приложения, как описано здесь: https://docs.microsoft.com/en-us/uwp/schemas/appxpackage/how-to-specify-device-capabilities-for-bluetooth

Это важная вещь.

0 голосов
/ 20 июня 2018

Solution Explorer -> Package.appxmanifest -> Возможности -> Bluetooth (проверка)

...