【问题标题】:Detecting BLE device in range on Win32在 Win32 上检测范围内的 BLE 设备
【发布时间】:2019-02-28 16:46:05
【问题描述】:

如果设备具有 HID over GATT 服务,Windows 将自动连接到它。所以,它显然是在关注设备何时在范围内。

对于非 HID 设备,Win32 仅在我向它发出请求时连接到 BLE 设备,例如设置特征或注册通知。如何检测设备何时可以成功连接(在范围内)?我很想运行一个循环尝试连接,但这肯定不是最好的解决方案。

【问题讨论】:

标签: winapi bluetooth-lowenergy


【解决方案1】:

如果您必须使用 Win32/WinAPI(而不是 BluetoothLeAdvertisementWatcher,它是一个 UWP 类),您可以使用来自 bluetoothapis.h 的方法。

您基本上需要创建一个消息泵窗口,并处理传入的WM_DEVICECHANGE 事件。像这样的:

INT_PTR BleListener::EventLoopHandler(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    LRESULT result = 1;   
    DEBUG_PRINT(TEXT("Message: 0x%04x\n"), message);

    switch (message)
    {
        case WM_DEVICECHANGE:
        {
            DEV_BROADCAST_HDR* hdr;
            DEV_BROADCAST_HANDLE* bhandle;
            if (wParam == DBT_CUSTOMEVENT)
            {
                hdr = (DEV_BROADCAST_HDR*)lParam;

                if (hdr->dbch_devicetype == DBT_DEVTYP_HANDLE)
                {
                    bhandle = (DEV_BROADCAST_HANDLE*)lParam;
                    if (bhandle->dbch_eventguid == GUID_BLUETOOTH_RADIO_IN_RANGE)
                    {
                        BTH_DEVICE_INFO* info = (BTH_DEVICE_INFO*)bhandle->dbch_data;
                        DEBUG_PRINT(TEXT("GUID_BLUETOOTH_RADIO_IN_RANGE. Address = 0x%llx\n"), info->address);
                    }
                }
                else if (bhandle->dbch_eventguid == GUID_BLUETOOTH_HCI_EVENT)
                {
                    ...
                }
            };
        break;        

        ...
    }
}    

您可能还想看看herehere 了解一些问题。

【讨论】:

  • 这些事件仅在连接时引发,而不是在设备未连接时引发。我需要做些什么来让他们持续加薪吗?
  • @Zer 根据我在 Windows 10 上使用 Win32 API 的经验,Windows 处理了整个“连接/断开”事情(IMO 相当糟糕)。它可以在没有警告的情况下断开您的连接,并在您尝试重新连接时重新连接您。读取远程设备上的特征。我设法进行的最接近 BLE 扫描的是处理 GUID_BLUETOOTH_RADIO_IN_RANGE,它大部分时间都有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2021-12-25
  • 2017-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多