从设备管理器获取蓝牙低功耗设备的连接状态

时间:2016-03-09 08:49:47

标签: c++ windows bluetooth-lowenergy

我正在使用蓝牙低功耗设备进行开发,我需要在代码中查看设备是否已连接。 我注意到的第一件事是在Devicemanager中有一个属性" Verbunden" - >英语:已连接,如果我的设备已连接,则表示正确或错误。所以我需要在我的程序中读取该属性。

到目前为止我一直在尝试:

使用SetupDiGetClassDevs获取所有设备 使用SetupDiGetDeviceRegistryProperty获取FriendlyName 使用名称搜索我的设备。 这很有效。

现在我想获得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;
}

2 个答案:

答案 0 :(得分:0)

您可以尝试:而不是使用SetupDiEnumDeviceInfo: 1.使用SetupDiEnumDeviceInterfaces 2.使用SetupDiGetDeviceInterfaceProperty 3.使用SetupDiGetDeviceInterfacePropertyKeys获取可用于界面的所有属性键的列表 4.使用SetupDiGetDeviceProperty和/或SetupDiGetDeviceRegistryProperty

您可以使用DEVPROP,而不是使用SPDRP_XXX常量,如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)它是一个属性'您可以通过上述方法访问

答案 1 :(得分: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"

        }

希望这段代码有所帮助。