在Win32范围内检测BLE设备

时间:2019-02-27 18:40:30

标签: winapi bluetooth-lowenergy

如果设备具有通过GATT服务的HID,则Windows将自动连接到该设备。因此,很明显,它在注意设备何时处于范围内。

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

1 个答案:

答案 0 :(得分:0)

如果必须使用Win32 / WinAPI(与UWP类的BluetoothLeAdvertisementWatcher相反),则可以使用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来了解一些陷阱。