我正在尝试使用BluetoothLEAdvertisementWatcher来检测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");
}
此代码非常类似于C#中SDK中的示例代码。我正在尝试用C ++做同样的事情,因为我对它更熟悉。
知道可能出现什么问题吗?我尝试删除所有过滤器,即使用处于默认状态的观察程序。这也给出了同样的错误。删除事件处理程序也会导致相同的错误。
提前致谢。
编辑:更改了标题,添加了ERROR_ACCESS_DENIED。
EDIT2:发生错误的确切位置是: onecoreuap \ drivers \ wdm \ bluetooth \ user \ winrt \ advertisement \ bluetoothleadvertisementwatcher.cpp(1510)\ Windows.Devices.Bluetooth.dll!0F479314 :(来电者:0F47AD40)异常(2)tid(2c1c)80070005访问被拒绝。< / p>
答案 0 :(得分:0)
设置m_watcher.ScanningMode = Active为好主意;在调用Start()之前;
此外,如果您开发非UWP(经典)应用程序,则应确保WinRT正确初始化。作为基于COM技术的WinRT,最好在对COM进行任何其他调用之前初始化WinRT。但是,某些基于任何框架的应用程序(例如MFC,Delphi VCL或其他)都可以使用自定义参数在内部初始化COM。在这种情况下,最好从单独的线程调用RoInitialize(RO_INIT_MULTITHREADED)。
Microsoft写道,必须使用RO_INIT_MULTITHREADED标志初始化WinRT。但是,我们的经验表明,使用其他标志也可以,但是所有WinRT事件将随后同步执行。对工作不利。
最后,如果您开发UWP应用程序,请不要忘记,按照此处所述设置应用程序设备功能:https://docs.microsoft.com/en-us/uwp/schemas/appxpackage/how-to-specify-device-capabilities-for-bluetooth
这很重要。
答案 1 :(得分:-1)
解决方案资源管理器-> Package.appxmanifest->功能->蓝牙(检查)