Получение состояния соединения из устройства Bluetooth с низким энергопотреблением из диспетчера устройств

Я занимаюсь разработкой устройства Bluetooth с низким энергопотреблением, и мне нужно увидеть в коде, подключено устройство или нет.
Первое, что я заметил, было то, что в Devicemanager есть атрибут «Verbunden» -> Английский: «Подключен», и он говорит «истина» или «ложь», подключено мое устройство или нет. Поэтому мне нужно прочитать этот атрибут в моей программе.

Что я пробовал до сих пор:

Получение всех устройств с помощью SetupDiGetClassDevs
Получение FriendlyName с помощью SetupDiGetDeviceRegistryProperty
Поиск моего устройства с именем.
Это работает.

Теперь я хотел получить этот Connected-Attribute, но я не узнал, что мне нужно использовать в SetupDiGetDeviceRegistryProperty.

SetupDiGetDeviceRegistryProperty описывается здесь https://msdn.microsoft.com/en-us/library/windows/hardware/ff551967(v=vs.85).aspx

Может быть, кто-то знает, какова правильная стоимость недвижимости.

Мой код:

int get_device_info( void )
{
HDEVINFO hDevInfo;
SP_DEVINFO_DATA DeviceInfoData;
DWORD i;
FILE *   devices = fopen("devices.txt", "a+");
GUID AGuid;
//GUID can be constructed from "{xxx....}" string using CLSID
CLSIDFromString(TEXT(TO_SEARCH_DEVICE_UUID), &AGuid);
GUID BluetoothInterfaceGUID = AGuid;

// Create a HDEVINFO with all present devices.
hDevInfo = SetupDiGetClassDevs(&BluetoothInterfaceGUID,
0, // Enumerator
0,
DIGCF_ALLCLASSES | 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;

//
// Call function with null to begin with,
// then use the returned buffer size (doubled)
// to Alloc the buffer. Keep calling until
// success or an unknown failure.
//
//  Double the returned buffersize to correct
//  for underlying legacy CM functions that
//  return an incorrect buffersize value on
//  DBCS/MBCS systems.
//
while (!SetupDiGetDeviceRegistryProperty(
hDevInfo,
&DeviceInfoData,
SPDRP_FRIENDLYNAME,
//SPDRP_DEVICEDESC,
//SPDRP_CAPABILITIES,
&DataT,
(PBYTE)buffer,
buffersize,
&buffersize))
{
if (GetLastError() ==
ERROR_INSUFFICIENT_BUFFER)
{
// Change the buffer size.
if (buffer) LocalFree(buffer);
// Double the size to avoid problems on
// W2k MBCS systems per KB 888609.
buffer = (wchar_t *)LocalAlloc(LPTR,buffersize * 2);
}
else
{
// Insert error handling here.
break;
}
}
if(buffer)
{

if( strcmp("Name of Device",AnsiString(buffer).c_str())==0)
{
fprintf(devices,"Result:[%s]",AnsiString(buffer).c_str());

if (buffer) LocalFree(buffer);
}
}

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

//  Cleanup
SetupDiDestroyDeviceInfoList(hDevInfo);
fclose(devices);
return 0;
}

1

Решение

Вместо использования SetupDiEnumDeviceInfo вы должны попробовать:
1. используя SetupDiEnumDeviceInterfaces
2. используя SetupDiGetDeviceInterfaceProperty
3. используя SetupDiGetDeviceInterfacePropertyKeys, чтобы получить список всех ключей свойств, доступных для интерфейса
4. используя SetupDiGetDeviceProperty и / или SetupDiGetDeviceRegistryProperty

Вместо использования констант SPDRP_XXX, вы должны использовать DEVPROP, как определено в ‘devpkey.h’ …
Ниже приведены несколько примеров, взятых из журнала тестовой проги, которую я написал, чтобы узнать все это:

    DEVPROPNAME: DEVPKEY_DeviceInterface_Bluetooth_DeviceAddress
DEVPROPGUID: {2BD67D8B-8BEB-48D5-87E0-6CDA3428040A}
DEVPROPPID: 1
DEVPROPTYPE: DEVPROP_TYPE_STRING
Value: c026df001017
DEVPROPNAME: DEVPKEY_Device_Children
DEVPROPGUID: {4340A6C5-93FA-4706-972C-7B648008A5A7}
DEVPROPPID: 9
DEVPROPTYPE: DEVPROP_TYPE_STRING_LIST
Value:
BTHLEDevice\{00001800-0000-1000-8000-00805f9b34fb}_c026df001017\8&2fd07168&1&0001
BTHLEDevice\{00001801-0000-1000-8000-00805f9b34fb}_c026df001017\8&2fd07168&1&0008
BTHLEDevice\{00001809-0000-1000-8000-00805f9b34fb}_c026df001017\8&2fd07168&1&000c
BTHLEDevice\{0000180f-0000-1000-8000-00805f9b34fb}_c026df001017\8&2fd07168&1&0010
BTHLEDevice\{0000180a-0000-1000-8000-00805f9b34fb}_c026df001017\8&2fd07168&1&0014
BTHLEDevice\{00001523-1212-efde-1523-785feabcd123}_c026df001017\8&2fd07168&1&0019

По второму вопросу вы «работаете» над самим «устройством» (SetupDiGetClassDevs (&BluetoothInterfaceGUID …) [и затем работает над деревом \ BTHLE \ в реестре].
После перечисления всех GattServices этого устройства и получения их uuids вы можете перезапустить эту итерацию для самого device_guid SetupDiGetClassDevs (&GattServiceGUID …) [и затем работает над деревом \ BTHLEDevice \ в реестре].

Теперь, чтобы ответить на ваш вопрос, я все еще ищу себя 🙂 Но я не совсем уверен:
1) что это рабочая (динамическая) информация, чтобы узнать состояние соединения
2) что это «свойство», доступ к которому можно получить с помощью вышеуказанных методов

0

Другие решения

Я нашел решение.

GUID AGuid;
//GUID can be constructed from "{xxx....}" string using CLSID
CLSIDFromString(TEXT(TO_SEARCH_DEVICE_UUID), &AGuid);
GUID BluetoothInterfaceGUID = AGuid;
// Create a HDEVINFO with all present devices.
hDevInfo = SetupDiGetClassDevs(&BluetoothInterfaceGUID,
0, // Enumerator
0,
DIGCF_ALLCLASSES | DIGCF_PRESENT);//DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);//DIGCF_ALLCLASSES | 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;
LPTSTR buffer1 = NULL;
DWORD buffersize = 0;

while (!SetupDiGetDeviceRegistryProperty( // Get Name
hDevInfo,
&DeviceInfoData,
SPDRP_FRIENDLYNAME,
&DataT,
(PBYTE)buffer,
buffersize,
&buffersize))
{
if (GetLastError() ==
ERROR_INSUFFICIENT_BUFFER)
{
// Change the buffer size.
if (buffer) LocalFree(buffer);
// Double the size to avoid problems on
// W2k MBCS systems per KB 888609.
buffer = (wchar_t *)LocalAlloc(LPTR,buffersize * 2);
}
else
{
// Insert error handling here.
break;
}
}
{

if(strcmp("Your Device",AnsiString(buffer).c_str())==0)  //Found your device
{

//########
DEVPROPTYPE ulPropertyType;
DWORD dwSize;
ULONG devst;

//     memset(devst,0,sizeof(devst));
bool err = SetupDiGetDeviceProperty(   //Checking Connection State
hDevInfo,
&DeviceInfoData,
&DEVPKEY_Device_DevNodeStatus,   //Connected(0x02000000)
&ulPropertyType,
(BYTE *) &devst,
sizeof(devst),
&dwSize,
0);
DWORD error;
error = GetLastError();if (devst &0x02000000) {
//"Status: Getrennt "
}
else
{
//"Status: Verbunden"
}

Надеюсь, этот фрагмент поможет.

0