Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.11.2013, 15:26   #11
AndreySh
 
Регистрация: 02.07.2013
Сообщений: 7
По умолчанию

Цитата:
Сообщение от counter Посмотреть сообщение
Перед выполнением BluetoothGATTGetCharacteristicValue нужно проверить значение hr. Ибо после этого могут быть проблемы:
Код:
 if (numServices != numServicesActual)
        {
            // The returned number of services do not match what we have
            // originally.
            hr = E_FAIL;
        }
Ну это пока не боевая программа проверки и обработку ошибок я пока не добавлял. Хотелось понять вообще работает ли блютуз или нет. Но проверку добавлю.

Цитата:
Тут еще вопрос такой может быть: откуда пытается читать значение BluetoothGATTGetCharacteristicValue . Это касательно флагов BLUETOOTH_GATT_FLAG_FORCE_READ_FROM _DEVICE и
BLUETOOTH_GATT_FLAG_FORCE_READ_FROM _CACHE.
Я пытался с разными флагами читать, результат был один и тот же.

Цитата:
Так же стоит проверить значение PBTH_LE_GATT_CHARACTERISTIC::IsRead able перед чтением значений.
Да, и это тоже обязательно будет добавлено.

Цитата:
И что-то мне кажется, что параметр hDevice [in] Handle to the service это не то, что ты туда скармливаешь. Попробуй передавать туда PBTH_LE_GATT_CHARACTERISTIC::Servic eHandle.
Пробовал, когда совсем отчаялся. :-) В своем примере из WDK 8.0 они используют один и тот же HANDLE. Всегда тот, который получен от CreateFile.

В общем я так понял, что при спаривании блютуза устройства и win8, в винду "прописываются" сервисы, которые поддерживает устройство. В моем случае они задаются в отдельном xml файле при программировании BLE112(этот как раз блютузный модуль от Bluegiga). И дальше для обращения к данным внутри этих сервисов в SetupDiGetClassDevs нужно искать UUID этих сервисов,а не устройства.
AndreySh вне форума Ответить с цитированием
Старый 22.12.2013, 20:24   #12
Yuricsson
 
Регистрация: 22.12.2013
Сообщений: 4
По умолчанию

Добрый вечер!

Цитата:
Сообщение от AndreySh Посмотреть сообщение
На самом деле путь к устройству BLE (bluetooth low energy) удается найти используя функции SetupDiEnumDeviceInterfaces и SetupDiGetDeviceInterfaceDetail. С помощью SetupDiGetDeviceInterfaceDetail я получаю Device Interface path, который можно использовать при вызове CreateFile.
А можно вот тут поподробнее?
У меня вот такая проблема: устройство на BLE112 (пример BGDemo) видно в DeviceManager, программа GUID Explorer показывает это устройство, показывает интерфейс к нему и внутри этого интерфейса путь для CreateFile.
Но вот у меня никак не получается добраться до этого интерфейса. Любые попытки получить хоть что-нибудь через SetupDiEnumDeviceInterfaces оканчивается ERROR_NO_MORE_ITEMS и всё.
Вот что я пишу:
Код:
  hdi:= SetupDiGetClassDevs (@GUID_DEVCLASS_BLUETOOTH,nil,0,DIGCF_PRESENT or DIGCF_DEVICEINTERFACE);
  if hdi<> HDEVINFO(INVALID_HANDLE_VALUE) then
    begin
      idx:= 0;
      repeat
        fillchar (id,sizeof (id),0);
        id.cbSize:= sizeof (id);
        res:= SetupDiEnumDeviceInterfaces (hdi,nil,@GUID_DEVCLASS_BLUETOOTH,idx,id);
        if res then
          begin
            // Do something with found interface
          end
        else
          begin
            Error:= GetLastError;
            if Error= ERROR_NO_MORE_ITEMS then
              break;
          end;
        inc (idx);
      until false;
      SetupDiDestroyDeviceInfoList (hdi);
    end;
Писал и по-другому - пытался получить интерфейс для найденного по SetupDiEnumDeviceInfo устройства. С тем же результатом.
Где собака-то порылась?
Есть у кого-нибудь более-менее рабочая пара проект-софт с использованием BLE112/113 и Windows8? Поделитесь примером, если не секрет!
Yuricsson вне форума Ответить с цитированием
Старый 20.02.2014, 17:44   #13
kuzulis
Новичок
Джуниор
 
Регистрация: 20.02.2014
Сообщений: 2
По умолчанию

Доброго времени, подниму тему.

Из приверенного описания не совсем ясно куда нужно вставлять 128-ми битный UUID?

Нужно земенить поле .ServiceUuid структуры BTH_LE_GATT_SERVICE перед запросом характеристик?

Кроме того, поле ServiceUuid имеет тип BTH_LE_UUID который имеет несколько полей:

Код:
typedef struct _BTH_LE_UUID {
  BOOLEAN IsShortUuid;
  USHORT  ShortUuid;
  GUID    LongUuid;
} BTH_LE_UUID, *PBTH_LE_UUID;
т.е. при замене нужно сделать IsShortUuid = FALSE, ShortUuid = 0, а LongUuid заменить на нужный нам?

Или же нужно проделать похожие манипуляции с заменой в BTH_LE_GATT_CHARACTERISTIC структуре, где также заменить GUID?

Или это нужно делать и для сервиса и для характеристики?

ЗЫ: Я использую Win8.1x32 и у меня нифига не работает: по прежнему ACCESS_DENIED
kuzulis вне форума Ответить с цитированием
Старый 20.02.2014, 18:04   #14
kuzulis
Новичок
Джуниор
 
Регистрация: 20.02.2014
Сообщений: 2
По умолчанию

UPD: Перечитал еще подробнее доку по ф-ции BluetoothGATTGetCharacteristicValue

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

И для вызова BluetoothGATTGetCharacteristics и BluetoothGATTGetCharacteristicValue нужно чтобы hDevice это был дескриптор сервиса.

Но у меня CreateFile() возвращается с ACCESS_DENIED при попытке открыть deviceInstancePath сервиса.

Что я делал:

1. При помощи SetupDiGetClassDevs() && SetupDiEnumDeviceInterfaces() && SetupDiGetDeviceInterfaceDetail() нахожу deviceInstancePath для того чтобы открыть найденное(ные) устройство(а). При этом, для энумерации использую: GUID_BLUETOOTHLE_DEVICE_INTERFACE (он есть в хедере <BthLEDef.h>).

2. Открываю устройство при помощи GreateFile() - все ОК.

3. Делаю BluetoothGATTGetServices() и оно мне аходит пять сервисов, где первый сервис имеет идентификатор 0х1800

4. Из базового Bluetooth_Base_UUID {0000xxxx-0000-1000-8000-00805F9B34FB} создаю свой: {00001800-0000-1000-8000-00805F9B34FB}

5. При помощи SetupDiGetClassDevs() && SetupDiEnumDeviceInterfaces() && SetupDiGetDeviceInterfaceDetail() нахожу deviceInstancePath для того чтобы открыть найденное(ные) устройство(а) - сервис (правильно ли это?)

6. Открываю сервис при помощи GreateFile() - И.. облом.. ACCESS_DENIED..

В чем загвоздка?
kuzulis вне форума Ответить с цитированием
Старый 14.04.2014, 23:44   #15
Yuricsson
 
Регистрация: 22.12.2013
Сообщений: 4
По умолчанию

Вернулся к данной теме после большого перерыва. Вот что выяснилось.
Делать енумерацию устойств по классу GUID_BLUETOOTHLE_DEVICE_INTERFACE нельзя, потому что мы не имеем доступа к устройству напрямую, а только к сервисам.

У меня есть устройство на BlueGiga BLE113, в нём сервис с MyServiceGUID.
В софте я делаю так:
1) SetupDiGetClassDevsW (MyServiceGUID,nil,0,DIGCF_PRESENT or DIGCF_DEVICEINTERFACE);
2) SetupDiEnumDeviceInterfaces (h,nil,MyServiceGUID,0,...)
3) SetupDiGetDeviceInterfaceDetailW () - получаю путь

Далее
CreateFileW (PWideChar(p), GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE,
nil,
OPEN_EXISTING,
0,//dwFileFlags,
0);
А потом уже
hr:= BluetoothGATTGetServices (bthandle,servicescount,@services[0],@cnt,BLUETOOTH_GATT_FLAG_NONE);
и
hr:= BluetoothGATTGetCharacteristics (bthandle,@services[i],0,nil,@cnt,BLUETOOTH_GATT_FLAG_NON E);

Вроде работает, дальше пока не копался. Потом уже надо устанавливать callback на события или читать значения характеристик.
Yuricsson вне форума Ответить с цитированием
Старый 15.04.2014, 02:35   #16
Yuricsson
 
Регистрация: 22.12.2013
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Yuricsson Посмотреть сообщение
Делать енумерацию устойств по классу GUID_BLUETOOTHLE_DEVICE_INTERFACE нельзя,
Мальца погорячился. :-) Разбираемся...
Yuricsson вне форума Ответить с цитированием
Старый 15.04.2014, 02:38   #17
Yuricsson
 
Регистрация: 22.12.2013
Сообщений: 4
По умолчанию

Цитата:
Сообщение от kuzulis Посмотреть сообщение
1. При помощи SetupDiGetClassDevs() && SetupDiEnumDeviceInterfaces() && SetupDiGetDeviceInterfaceDetail() нахожу deviceInstancePath для того чтобы открыть найденное(ные) устройство(а). При этом, для энумерации использую: GUID_BLUETOOTHLE_DEVICE_INTERFACE (он есть в хедере <BthLEDef.h>).

2. Открываю устройство при помощи GreateFile() - все ОК.
А можно кусочек вот этого кода?
Yuricsson вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
bluetooth клавиатура как отдельное устройство Mozgunov Общие вопросы Delphi 11 31.03.2013 12:09
FTP как подключиться aank10 C++ Builder 1 13.09.2012 15:49
Как можно обратиться к устройству, которое подключено через USB порт Mikhail Bakurov Общие вопросы Delphi 8 17.11.2008 20:42
Как соединить 2 компьютера через Bluetooth kikoz Операционные системы общие вопросы 6 27.10.2008 23:08
как подключиться к БД из dll? fLytarget Помощь студентам 3 18.08.2008 17:42