2017-06-09 1 views
0

J'essaie d'analyser les données contenues dans une publicité Bluetooth basse énergie, ceci est mon code jusqu'à présent.Extraire les données de publicité bluetooth basse énergie en C++

HRESULT BLEWatcher::OnAdvertisementReceived(IBluetoothLEAdvertisementWatcher* watcher, IBluetoothLEAdvertisementReceivedEventArgs* args) 
{ 

    IBluetoothLEAdvertisement** advertisement; 
    args->get_Advertisement(advertisement); 

    __FIVector_1_Windows__CDevices__CBluetooth__CAdvertisement__CBluetoothLEAdvertisementDataSection** dataSections; 
    (*advertisement)->get_DataSections(dataSections); 
    IBluetoothLEAdvertisementDataSection** dataSection; 
    (*dataSections)->GetAt(2, dataSection); 
    ABI::Windows::Storage::Streams::IBuffer** buffer; 
    (*dataSection)->get_Data(buffer); 
    ComPtr<ABI::Windows::Storage::Streams::IDataReader> reader; 
    UINT32 *length; 
    (*buffer)->get_Length(length); 

    return S_OK; 
} 

Je ne trouve pas comment extraire les données de IBuffer, de préférence en tant que tableau d'octets. S'il y a un meilleur moyen d'extraire les données, ou si quelqu'un sait comment convertir le IBuffer en tableau d'octets, votre aide serait grandement appréciée.

Aussi, je n'ai aucun moyen de vérifier que mon code est correct à ce jour, donc si des erreurs ont été commises, n'hésitez pas à me le faire savoir.

+0

Ceci aide: https://stackoverflow.com/questions/11853838/getting-an-array-of-bytes-out-of-windowsstoragestreamsibuffer –

Répondre

0

J'ai trouvé la réponse. La plupart du temps, c'est juste un tas de comptrs, le casting supplémentaire utilisé par d'autres pour convertir le buffer est inutile ici car le buffer est déjà un objet comptr.

HRESULT BLEWatcher::OnAdvertisementReceived(IBluetoothLEAdvertisementWatcher* watcher, IBluetoothLEAdvertisementReceivedEventArgs* args) 
{ 


    ComPtr<IBluetoothLEAdvertisement> advertisement; 
    args->get_Advertisement(&advertisement); 
    ComPtr<__FIVector_1_Windows__CDevices__CBluetooth__CAdvertisement__CBluetoothLEAdvertisementDataSection> dataSections; 
    advertisement->get_DataSections(&dataSections); 
    ComPtr<IBluetoothLEAdvertisementDataSection> dataSection; 
    //Get appropriate data section 
    dataSections->GetAt(2, &dataSection); 
    ComPtr<IBuffer> buffer; 
    dataSection->get_Data(&buffer); 
    ComPtr<IBufferByteAccess> bufferByteAccess; 
    buffer.As(&bufferByteAccess); 
    byte* bytes = nullptr; 
    bufferByteAccess->Buffer(&bytes); 

    //Handle bytes here 

    return S_OK; 
}