获取蓝牙设备连接通知

Posted

技术标签:

【中文标题】获取蓝牙设备连接通知【英文标题】:Get bluetooth devices connection notification 【发布时间】:2019-07-23 04:49:18 【问题描述】:

我正在制作一个 winform 应用程序,用于监控计算机上发生的事情,例如进程、wifi、屏幕截图……我正在处理蓝牙连接。

当蓝牙设备与计算机(或笔记本电脑)(例如手机)连接或断开连接时,我需要收到通知。此外,如果可能的话,我需要一些东西来识别设备,例如 ID 或只是它的名称。

有一点需要注意,我使用的是 C#,它是一个 winform 应用程序,如果解决方案使用 Windows 原生库(如 winapi、pInvoke)会很好。第三方库很好,但这是我最后的选择。


更新:我已经按照 Rita Han 的回答得到了一些结果。

下面是我在覆盖 WndProc 方法中的代码。它完全适用于 USB,但不适用于蓝牙设备。

当应用程序运行时,我在笔记本电脑和手机上都打开了蓝牙,但它们尚未配对 → 调用该功能并显示蓝牙来了,然后我连接两个设备 → 现在它们已连接但没有除上述通知外。

之后,当它们连接时,我尝试移除移动电话设备,但它们已断开连接,然后我再次连接它们,但又一次没有收到有关已扫描或连接新蓝牙连接的通知。

简而言之,当蓝牙无线电扫描新设备时我会收到通知,但在第一次连接时不会收到通知。之后,断开连接和重新连接也不会给我任何通知。

我错过了一些活动吗?

case USB.DBT_DEVICEARRIVAL:

    devType = Marshal.ReadInt32(m.LParam, 4);
    if (devType == USB.DBT_DEVTYP_VOLUME)
    
        USB.DEV_BROADCAST_VOLUME vol;
        vol = (USB.DEV_BROADCAST_VOLUME)
            Marshal.PtrToStructure(m.LParam, typeof(USB.DEV_BROADCAST_VOLUME));

        // Get the drive letter 
        c = USB.DriveMaskToLetter(vol.dbcv_unitmask);
        listBox1.Items.Add("New USB has come with name " + c);

    
    else if (devType == BluetoothDeviceNotification.DbtDevtypDeviceinterface)
    
        BluetoothDeviceNotification.DevBroadcastDeviceinterface vol;
        vol = (BluetoothDeviceNotification.DevBroadcastDeviceinterface)Marshal.PtrToStructure(m.LParam, typeof(BluetoothDeviceNotification.DevBroadcastDeviceinterface));
        listBox1.Items.Add("Bluetooth came GUID " + vol.ClassGuid + "\t Name: " + vol.Name);
        break;
    
    break;

【问题讨论】:

***不是免费的代码编写服务。向我们展示您迄今为止的尝试?你有search attempts或code samples吗? 【参考方案1】:

要使用 Windows 原生 API,您可以使用 RegisterDeviceNotification 函数。

请参阅“Registering for Device Notification”示例以了解入门。

Bluetooth interface GUID:

GUID BluetoothGUID = 0x0850302A, 0xB344, 0x4fda, 0x9BE9, 0x90, 0x57, 0x6B, 0x8D, 0x46, 0xF0 ;

Bluetooth and WM_DEVICECHANGE Messages.

【讨论】:

感谢您的回答请查看我上面的更新,了解我在关注答案时遇到的问题希望您能帮助我 @CườngNguyễnHùng 在 Windows 10 1903 上连接或移动设备时,我会收到 WM_DEVICECHANGE 消息。您的 Windows 版本是什么? 这是window 10 Pro 1607 @CườngNguyễnHùng 我测试了 SensorTag 和手机,在连接和断开连接时都会触发 WM_DEVICECHANGE 事件。可以试试1607以上的版本吗? 这就是问题所在。我的 winform 应用程序将在多台笔记本电脑上运行,这意味着不同的 Window 版本。无论是哪个 Window 版本,我都需要获取事件。很高兴看到你的代码。

以上是关于获取蓝牙设备连接通知的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 应用程序中从蓝牙 LE 设备获取通知

想要在连接的蓝牙设备离开范围时收听通知

iOS 蓝牙设备列表

获得蓝牙低功耗 (BLE) 设备通知的步骤是啥?

如何使用 BluetoothHeadset API 获取蓝牙连接的设备

获取已连接的蓝牙 LE 设备列表