如何识别当前已断开连接的配对蓝牙设备?

时间:2018-06-11 19:07:24

标签: c# bluetooth

如何发现当前已断开的配对蓝牙设备?

我使用Windows 10 SDK尝试了以下代码:

using Windows.Devices.Enumeration;
using Windows.Devices.Bluetooth.Rfcomm;

var serviceInfoCollection = await DeviceInformation.FindAllAsync(RfcommDeviceService.GetDeviceSelector(RfcommServiceId.SerialPort));

我也尝试了以下内容:

using System;
using System.Diagnostics;
using System.Management;

public class Win32_UsbDriveWatcher
{
    ManagementEventWatcher m_watcher;

    public delegate void DeviceInsertedEventHandler(object sender, Win32_UsbDriveInsertEventArgs e);

    public event DeviceInsertedEventHandler DeviceInserted;
    public event EventHandler DeviceRemoved;

    public void Start(int pollingInterval)
    {
        try
        {
            var queryString =
              "SELECT * " +
              " FROM __InstanceOperationEvent" +
              " WITHIN " + pollingInterval +
              " WHERE TargetInstance ISA 'Win32_PnPEntity'";

            var processQuery = new EventQuery(queryString);

            m_watcher = new ManagementEventWatcher(processQuery);
            m_watcher.EventArrived += EventArrived;
            m_watcher.Start();
        }

        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
        }
    }

    void EventArrived(object sender, EventArrivedEventArgs e)
    {
        var instance = ((PropertyData)(e.NewEvent.Properties["TargetInstance"]));
        var obj = (ManagementBaseObject)instance.Value;
        var args = new Win32_UsbDriveInsertEventArgs();

        if ((string)obj["InterfaceType"] == "BLUETOOTH")
        {
            args.IsCreated = (obj.ClassPath.ClassName == "__InstanceCreationEvent");
            args.DriveName = GetDriveLetterFromDisk((string)obj["Name"]);
            if (args.IsCreated)
            {
                DeviceInserted?.Invoke(this, args);
            }
            else
            {
                DeviceRemoved?.Invoke(this, EventArgs.Empty);
            }
        }
    }

    static string GetDriveLetterFromDisk(string name)
    {
        name = name.Replace("\\", "\\\\");

        var query = "ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" + name + "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition";
        var queryDrive = new ObjectQuery(query);
        using (var searcherDrive = new ManagementObjectSearcher(queryDrive))
        {
            foreach (ManagementObject drive in searcherDrive.Get())
            {
                query = "ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" +
                  drive["DeviceID"] +
                  "'} WHERE AssocClass = Win32_LogicalDiskToPartition";
                var queryPartition = new ObjectQuery(query);
                using (var searcherPartition = new ManagementObjectSearcher(queryPartition))
                {
                    foreach (ManagementObject disk in searcherPartition.Get())
                    {
                        return (string)disk["Name"];
                    }
                }
            }
            return string.Empty;
        }
    }
}
public class Win32_UsbDriveInsertEventArgs : EventArgs
{
    public bool IsCreated;
    public string DriveName;
}

无论我尝试过的代码片段如何,我仍然无法发现成对的断开设备。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

几乎没有办法:

  1. 使用WM_DEVICE_CHNAGE消息了解设备何时连接和连接。
  2. 找到所有配对设备后,查询每个设备的服务。不可用(已断开连接)设备报告错误。
  3. 尝试使用DeviceIOControl(最佳方式)连接到设备的SDP服务。