2013-11-06 3 views
6

Я пишу программу для планшета Win 8. Мне нужно подключить внешнее устройство BLE. Устройство уже сопряжено с Windows, и я вижу его в диспетчере устройств. Но я не могу понять, как его подключить.Как подключиться к устройству низкой энергии bluetooth

С SetupDiEnumDeviceInfo и SetupDiGetDeviceProperty я могу получить некоторую информацию о BLE-устройства, но для выполнения, например, BluetoothGATTGetServices Устройство ручки требует. Я не знаю, где взять его. Возможно, я смогу использовать CreateFile, но неясно, что подставить в качестве первого аргумента lpFileName.

Вот фрагмент кода, с которым я ищу свое устройство.

HDEVINFO hDevInfo; 
    SP_DEVINFO_DATA DeviceInfoData; 
    DWORD i; 

    // Create a HDEVINFO with all present devices. 
    hDevInfo = SetupDiGetClassDevs(
     &BluetoothClassGUID,      /* 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; 
      } 
     } 
        /* Here i just compare by name is this my device or not */ 
        ... 
        /* Here i just compare by name is this my device or not */ 
     if (buffer) delete(buffer); 
    } 


    if (GetLastError()!=NO_ERROR && 
     GetLastError()!=ERROR_NO_MORE_ITEMS) 
    { 
     // Insert error handling here. 
     return; //1; 
    } 

    // Cleanup 
    SetupDiDestroyDeviceInfoList(hDevInfo); 

    return;// 0; 

я переехал немного дальше, но до сих пор я не могу получить данные из устройства.

  1. Чтобы получить "Path Interface Device" должен был использовать другие функции: SetupDiGetClassDevs, SetupDiEnumDeviceInterfaces и SetupDiGetDeviceInterfaceDetail.

  2. Next, with CreateFile Я получаю устройство HANDLE BLE.

    hComm = CreateFile (pInterfaceDetailData-> DevicePath, GENERIC_WRITE | GENERIC_READ, NULL, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

  3. Далее с помощью WinAPI BluetoothGATTGetServices и BluetoothGATTGetCharacteristics я получаю соответствующие структуры.

Но при попытке получить значение свойства с BluetoothGATTGetCharacteristicsValue, я получаю ERROR_ACCESS_DENIED.

И тогда я не знаю, что делать. Что может быть неправильным?

+0

Любой прогресс с этим? – Pupsik

+0

Какой интерфейс UUID вы использовали для поиска вашего устройства? GUID_BTHPORT_DEVICE_INTERFACE только вернул внутренний BLE-сканер. – Myon

ответ

0

Андрей, я думаю, проблема в том, что ваше устройство не подключено и BluetoothGATTGetCharacteristicsValue не запускает соединение.

Попробуйте вручную подключить устройство с помощью инструментов Windows. У меня есть следующий поток, который помогает мне: Отключить устройство, Пара-устройство -> Он должен появиться как подключенный (он работал в моем случае;)

В любом случае, если это не помогает, попробуйте запустить «Как администратор», , это помогает в некоторых случаях.

Удачи !!!

0

Примечание: Было бы очень интересно узнать, как извлечь путь устройства для устройства BTLE, чтобы вызвать BluetoothGATTGetServices?

gattServiceGUID - любая длинная форма BLE UUID, поддерживаемая вашим устройством.

"{00001803-0000-1000-8000-00805F9B34FB"} can be used to open a handle to the Link Loss service if supported by the device you are trying to open 

HDEVINFO hDevInfo = SetupDiGetClassDevs(&gattServiceGUID, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); 

if (hDevInfo != INVALID_HANDLE_VALUE) 
{ 
    SP_DEVICE_INTERFACE_DATA interfaceData; 
    ZeroMemory(&interfaceData,sizeof(SP_DEVICE_INTERFACE_DATA)); 
    interfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); 

    for (DWORD dwDeviceIndex = 0; SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &gattServiceGUID, dwDeviceIndex, &interfaceData); dwDeviceIndex++) 
    {      
     dwDeviceCount++; 
     SetupDiGetDeviceInterfaceDetail(hDevInfo, &interfaceData, NULL, 0, &dwBytesNeeded, NULL); 
     if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) 
     { 
      pInterfaceDetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA) new byte[dwBytesNeeded]; 

      SP_DEVINFO_DATA spDeviceInfoData = { sizeof(SP_DEVINFO_DATA) }; 

      ZeroMemory(pInterfaceDetail, sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA)); 
      pInterfaceDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA); 

      // grab the interface detail 
      if (SetupDiGetDeviceInterfaceDetail(hDevInfo, &interfaceData, pInterfaceDetail, dwBytesNeeded, NULL, &spDeviceInfoData) == TRUE) 
      { 
       // request a handle to the GATT service path 
       m_hGattServiceHandle = CreateFile(pInterfaceDetail->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); 
       if (m_hGattServiceHandle != INVALID_HANDLE_VALUE) 
       { 
        now you can drill down the characteristics and descriptors with the m_hGattServiceHandle 
       } 
      } 
     } 
    } 
} 
+1

Возможно, вы захотите добавить объяснение к этому. В настоящее время это всего лишь блок кода. –

+0

И как я развернулся? Мне все еще нужен дескриптор устройства для таких функций, как'BluetoothGATTSetCharacteristicValue ' – Myon

Смежные вопросы