Здравствуйте!
Я пытаюсь разобраться с Bluetooth 4 Low Energy и пишу desktop программу для планшета на Windows 8. Внешнее Bluetooth-устройство на базе BLE112 от Bluegiga. Проект на RAD Studio XE4 C++.
Что я делаю:
1. С помощью стандартных виндовых средств нахожу устройство и подключаю его в Винде. Оно появляется в Диспетчере Устройств.
2. С помощью комбинации SetupDiGetClassDevs, SetupDiEnumDeviceInterfaces и SetupDiGetDeviceInterfaceDetail я получаю путь к интерфейсу устройства.
//BTDeviceInterfaceGUID я посмотрел через GUID Explorer.
hDI = SetupDiGetClassDevs(&BTDeviceInterfaceGUID, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
SetupDiGetDeviceInterfaceDetail(hDI, &sp_Device_Interface_Data, pInterfaceDetailData, size, &size, &sp_Devinfo_Data)
В результате в pInterfaceDetailData->DevicePath я получаю Device Interface Path, который использую в CreateFile.
hComm = CreateFile(pInterfaceDetailData->DevicePath, GENERIC_WRITE | GENERIC_READ,NULL,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);
В итоге hComm - HANDLE моего Bluetooth-устройства. CreateFile нормально отрабатывает, без ошибок.
3. Далее с помощью новых Bluetooth Low Energy WinAPI пытаюсь получить данные.
С помощью BluetoothGATTGetServices и BluetoothGATTGetCharacteristic получаю соответствующие структуры.
hr = BluetoothGATTGetServices(hBLEDevice, serviceBufferCount, pService,numServices,BLUETOOTH_GATT_FLAG_NONE);
Получаем какие сервисы поддерживает устройство.
hr = BluetoothGATTGetCharacteristics(hBLEDevice, pService,charBufferCount, pCharacteristic, numCharacteristics, BLUETOOTH_GATT_FLAG_NONE);
Получаем какие характеристики в данном сервисе.
4. И вот при попытке считать значение какой-либо характеристики я получаю ERROR_ACCESS_DENIED.
hr = BluetoothGATTGetCharacteristicValue(hBLEDevice, pCharacteristic,(ULONG)charValueDataSize, pCharValueBuffer, NULL, BLUETOOTH_GATT_FLAG_NONE);
Еще я заметил, что в общем-то не важно работает ли само BLE-устройство или нет. Поведение программы не меняется. Т. е. в обоих случаях я могу считать "структуру" сервисов-характеристик устройства, но не могу считать значение этих характеристик. CreateFile в обоих случаях срабатывает без ошибок и возвращает HANDLE устройства.
И еще, на свой IPhone 4S поставил программку LightBlue она умеет работать с bluetooth 4 LE. Так вот с ее помощью я нормально получаю данные с этого устройства. Т. е. проблема именно в программе под винду, а не в железке.
Может быть кто-нибудь сталкивался с подобной проблемой? Подскажите в какую хоть сторону копать...
Ура, проблема решена! На форуме MSDN наконец-то ответили. Может кому-то пригодится.
To provide isolation between services, windows requires that when reading or writing to the device, that the application opens a handle to the service instance itself. This can be accomplished by altering BTDeviceInterfaceGUID in your example to be equal to the service UUID (extended to 128 bit using the standard SIG extension if the service uses a 16 bit UUID) of the service you intended to use.
Чтобы расширить 16-битный UUID сервиса до 128 берем Bluetooth_Base_UUID {0000xxxx-0000-1000-8000-00805F9B34FB} и вставляем на место xxxx свой 16-битный.