2016-10-06 5 views
0

Кто-нибудь уже выяснил, как получить BLE Beacons в настольных приложениях C++?Получение маяков BLE на C++ Windows 10 Desktop Application

У меня есть некоторый код из следующих веб-сайтах, чтобы сделать это в C#:
msdn sozial site
и
codefest.at post. К сожалению, это на немецком языке, но код является кодом

но that'for C# и не с ++

у меня также есть пример из MS (msdn.microsoft.com/en-us/library/hh973459.aspx), как использовать WinRL

на данный момент у меня й е следующий код:

#include "stdafx.h" 

#include <iostream> 
#include <Windows.Foundation.h> 
#include <wrl\wrappers\corewrappers.h> 
#include <wrl\client.h> 
#include <stdio.h> 
#include <../winrt/windows.devices.bluetooth.h> 
#include <../winrt/windows.devices.bluetooth.advertisement.h> 

using namespace std; 
using namespace Microsoft::WRL; 
using namespace Microsoft::WRL::Wrappers; 
using namespace ABI::Windows::Foundation; 
using namespace ABI::Windows::Devices::Bluetooth::Advertisement; 

/* http://www.codefest.at/post/2015/09/07/Bluetooth-Beacons-Windows-10.aspx 
private async void WatcherOnReceived(BluetoothLEAdvertisementWatcher sender, BluetoothLEAdvertisementReceivedEventArgs eventArgs) 
{ 
_beaconManager.ReceivedAdvertisement(eventArgs); 
} 

var watcher = new BluetoothLEAdvertisementWatcher { ScanningMode = BluetoothLEScanningMode.Active }; 
watcher.Received += WatcherOnReceived; 
watcher.Stopped += WatcherOnStopped; 
watcher.Start(); 
*/ 

// Prints an error string for the provided source code line and HRESULT 
// value and returns the HRESULT value as an int. 
int PrintError(unsigned int line, HRESULT hr) 
{ 
    wprintf_s(L"ERROR: Line:%d HRESULT: 0x%X\n", line, hr); 
    return hr; 
} 

EventRegistrationToken watcherToken; 

int main() 
{ 

    // Initialize the Windows Runtime. 
    RoInitializeWrapper initialize(RO_INIT_MULTITHREADED); 
    if (FAILED(initialize)) 
    { 
     return PrintError(__LINE__, initialize); 
    } 

    // Get the activation factory for the IBluetoothLEAdvertisementWatcherFactory interface. 
    ComPtr<IBluetoothLEAdvertisementWatcherFactory> bleAdvWatcherFactory; 
    HRESULT hr = GetActivationFactory(HStringReference(RuntimeClass_Windows_Devices_Bluetooth_Advertisement_BluetoothLEAdvertisementWatcher).Get(), &bleAdvWatcherFactory); 
    if (FAILED(hr)) 
    { 
     return PrintError(__LINE__, hr); 
    } 

    IBluetoothLEAdvertisementWatcher* bleWatcher; 
    IBluetoothLEAdvertisementFilter* bleFilter; 

    hr = bleAdvWatcherFactory->Create(bleFilter, &bleWatcher); 

    if (bleWatcher == NULL) 
    { 
     cout << "bleWatcher is NULL, err is " << hex << hr; 
    } 
    else 
    { 
     bleWatcher->Start(); 

     while (1) 
      Sleep(1000); 
    } 


    return 0; 
    } 

моя проблема заключается в том, что Watcher Factory жалуется (ч = E_INVALIDARG «один или более аргументов не являются действительными» 0x80070057), что одна из переменных не является допустимым (я подозреваю, что фильтр, потому что он имеет нет действительного контента).

И даже на том же уровне серьезности я понятия не имею, как зарегистрировать обработчик событий для входящих маяков.

msdn.microsoft.com/en-us/library/windows/apps/windows.devices.bluetooth.advertisement.bluetoothleadvertisementwatcher.received?cs-save-lang=1 & CS-Ланг = касты говорят мне что-то о Полученном событии. Но у меня его нет в моей автозаполнении от VS, а не в ручном поиске в файле заголовка. Следующее, что у меня есть, это «add_Received», но я не могу найти документацию об этом, как использовать. И я не получаю гораздо более мудрый из файла заголовка.

Заранее благодарим за советы и рекомендации или даже за рабочее решение.
Markus

+0

Я также строит здесь то же самое. Моя проблема теперь, когда я запускаю ее, я получаю ошибку: «failure -2147221164», которая является «классом не зарегистрирована» при попытке создать фабричный объект. Я компилирую с выпуском MSVC Community «14.11.25503» и связываюсь с win10 SDK «10.0.16299.0». Нужно ли что-либо делать, чтобы зарегистрировать классы DLL? – peterk

ответ

1

У вас мало проблем с кодом. В первую очередь всех I* классов должны быть обернуты вокруг ComPtr<I*>

ComPtr<IBluetoothLEAdvertisementWatcher> bleWatcher; 
ComPtr<IBluetoothLEAdvertisementFilter> bleFilter; 

В функции bleAdvWatcherFactory->Create(bleFilter, &bleWatcher); параметр bleFilter не определен, и это приведет к непредсказуемому поведению (в Debug версии может быть инициализирована как nullptr).

Вы можете создать его с помощью: Упаковщики :: HStringReference

Wrappers::HStringReference class_id_filter(RuntimeClass_Windows_Devices_Bluetooth_Advertisement_BluetoothLEAdvertisementFilter); 
hr = RoActivateInstance(class_id_filter.Get(), reinterpret_cast<IInspectable**>(bleFilter.GetAddressOf())); 

Тогда Вам разрешают позвонить:

hr = bleAdvWatcherFactory->Create(bleFilter.Get(), &bleWatcher.GetAddressOf());