Windows 8.1 Bluetooth LE не может получить интерфейс устройства

Я пытаюсь получить имя и дескриптор всех сопряженных устройств Bluetooth на компьютере с Windows 8.1.

Я могу узнать имя, но SetupDiEnumDeviceInterfaces всегда возвращает false. Я где-то читал, что мне нужно включить DIGCF_DEVICEINTERFACE в функцию SetupDIGetClassDevs, но это все еще не работает.

Вот мой код:

HDEVINFO hDevInfo;
SP_DEVINFO_DATA DeviceInfoData;
DWORD i;

// Create a HDEVINFO with all present devices.
hDevInfo = SetupDiGetClassDevs(
    &GUID_DEVCLASS_BLUETOOTH,
    0, 0, DIGCF_PRESENT);

if (hDevInfo == INVALID_HANDLE_VALUE)
{
    // Insert error handling here.
    return;//1;
}

// Enumerate through all devices in Set.

DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i,
    &DeviceInfoData); i++)
{
    DWORD DataT;
    LPTSTR buffer = NULL;
    DWORD buffersize = 0;

    while (!SetupDiGetDeviceRegistryProperty(
        hDevInfo,
        &DeviceInfoData,
        SPDRP_FRIENDLYNAME,
        &DataT,
        (PBYTE)buffer,
        buffersize,
        &buffersize))
    {
        if (GetLastError() == ERROR_INSUFFICIENT_BUFFER){
            // Change the buffer size.
            if (buffer) delete(buffer);
            // Double the size to avoid problems on
            // W2k MBCS systems per KB 888609.
            buffer = new wchar_t[buffersize * 2];
        }
        else{
            // Insert error handling here.
            break;
        }
    }
    HWND deviceList = GetDlgItem(GetActiveWindow(), LIST_BOX);
    if (deviceList && buffersize > 0)
    {
        SendMessage(deviceList, LB_ADDSTRING, 0, (LPARAM)buffer);
    }
    if (buffer) delete(buffer);

   // WORKS UNTIL HERE BUT ENUMERATING THROUGH INTERFACES ALWAYS RETURNS FALSE

    SP_DEVICE_INTERFACE_DATA devIntData;
    HDEVINFO hDevInfo2 = SetupDiGetClassDevs(
        &GUID_DEVCLASS_BLUETOOTH,
        0, 0, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
    if (SetupDiEnumDeviceInterfaces(hDevInfo2, 
        &DeviceInfoData, 
        &GUID_BLUETOOTHLE_DEVICE_INTERFACE, 
        i, 
        &devIntData))
    {
        DWORD reqSize;
        SP_DEVINFO_DATA buffer;
        while (SetupDiGetDeviceInterfaceDetail(hDevInfo2,
            &devIntData,
            NULL,
            NULL,
            &reqSize,
            &buffer))
        {
            OutputDebugString(L"DeviceINTERFACE");
        }
    }
}

Я попытался поместить перечисление устройств за пределы цикла перечисления имен, но он по-прежнему возвращает false, также я бы хотел, чтобы дескриптор и имя были связаны, поэтому я бы хотел, чтобы они находились в одном контексте.

Если у кого-то есть образец кода для полного рабочего процесса Bluetooth LE в Windows 8.1 (найти имя, найти дескрипторы, найти службы, найти характеристики, написать в характеристики) и поделиться им со мной, я был бы очень признателен. Спасибо.


person Khwaab Dave    schedule 21.08.2014    source источник


Ответы (1)


Разобрался, не распределял память для моих буферов должным образом.

РЕДАКТИРОВАТЬ: добавление кода

HDEVINFO hDevInfo;
SP_DEVINFO_DATA DeviceInfoData;
DWORD i;
// Create a HDEVINFO with all present devices.
hDevInfo = SetupDiGetClassDevs(
    &GUID_DEVCLASS_BLUETOOTH,
    0, 0, DIGCF_PRESENT);

if (hDevInfo == INVALID_HANDLE_VALUE)
{
    // Insert error handling here.
    return;//1;
}
// Enumerate through all devices in Set.
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
for (i = 0; SetupDiEnumDeviceInfo(hDevInfo, i,
    &DeviceInfoData); i++)
{
    DWORD DataT;
    LPTSTR buffer = NULL;
    DWORD buffersize = 0;
    //This loop gets the name with SPDRP_FRIENDLYNAME
    while (!SetupDiGetDeviceRegistryProperty(
        hDevInfo,
        &DeviceInfoData,
        SPDRP_FRIENDLYNAME,
        &DataT,
        (PBYTE)buffer,
        buffersize,
        &buffersize))
    {
        if (GetLastError() == ERROR_INSUFFICIENT_BUFFER){
            // Change the buffer size.
            if (buffer) delete(buffer);
            // Double the size to avoid problems on
            // W2k MBCS systems per KB 888609.
            buffer = new wchar_t[buffersize * 2];
        }
        else{
            // Insert error handling here.
            break;
        }
    }
    DWORD DataT2;
    LPTSTR buffer2 = NULL;
    DWORD buffersize2 = 0;
    //This Loop gets the Bluetooth Address with SPDRP_HARDWAREID
    // NOTE: there is more information than just the address you will have
    // to do some string manipulation to have just the address
    while (!SetupDiGetDeviceRegistryProperty(
        hDevInfo,
        &DeviceInfoData,
        SPDRP_HARDWAREID,
        &DataT2,
        (PBYTE)buffer2,
        buffersize2,
        &buffersize2))
    {
        if (GetLastError() == ERROR_INSUFFICIENT_BUFFER){
            // Change the buffer size.
            if (buffer2) delete(buffer2);
            // Double the size to avoid problems on
            // W2k MBCS systems per KB 888609.
            buffer2 = new wchar_t[buffersize2 * 2];
        }
        else{
            // Insert error handling here.
            break;
        }
    }
    if (buffersize > 0)
    {
        //do what you need with the info
        //name is in buffer
        //address is in buffer2
    }
}

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

person Khwaab Dave    schedule 22.08.2014
comment
есть ли способ поделиться своим решением? у меня проблемы с поиском устройства по названию - person Jakub Wisniewski; 16.02.2015
comment
@JakubWisniewski добавил мой код, который решил это для меня ... надеюсь, что это поможет ... текущие API-интерфейсы MSDN BLE - такая боль - person Khwaab Dave; 18.02.2015
comment
Не могли бы вы поделиться своим решением с помощью SetupDiEnumDeviceInterfaces? - person user2246120; 06.10.2015
comment
Должно быть таким же, но вместо использования функции SetupDiEnumDeviceInfo вы должны использовать функцию SetupDiEnumDeviceInterface и с другим свойством реестра. У меня больше нет проекта, для которого я использовал его, извините. - person Khwaab Dave; 07.10.2015