Как прочитать SPD DeviceID (PnP) в приложении UWP для несвязанного устройства?

#c# #uwp #bluetooth

#c# #uwp #bluetooth

Вопрос:

Я использую следующий код для идентификации моего устройства:

 string[] properties = new string[] {
        "System.Devices.Aep.DeviceAddress",
        "System.DeviceInterface.Bluetooth.VendorId",
        "System.DeviceInterface.Bluetooth.ProductId"
    };

var selector = BluetoothDevice.GetDeviceSelectorFromPairingState(false);
var devices = await DeviceInformation.FindAllAsync(selector, properties);

if (devices[0].Properties.TryGetValue(properties[1], out object vendorIdValue))
{
    vendorId = (ushort?)vendorIdValue ?? (ushort)0;
}
if (devices[0].Properties.TryGetValue(properties[2], out object productIdValue))
{
    productId = (ushort?)productIdValue ?? (ushort)0;
}
  

Однако, когда устройство непарное, идентификаторы поставщика и продукта всегда равны нулю (0). Когда устройство сопряжено, я могу читать VId и PId. Как я могу получить эти свойства для несвязанного устройства?

Комментарии:

1. Попробуйте true вместо false : learn.microsoft.com/en-us/uwp/api /…

2. @jdweng но я хочу, чтобы это было false, поскольку я хочу перечислить несвязанные устройства.

3. В ваших свойствах вам нужен адрес при поиске? Свойства — это фильтр поиска, и вы хотите найти адрес, а не использовать адрес в поиске.

4. Мне не нужен адрес. В каком смысле это фильтр поиска? Поскольку на основе этого адреса ничего не фильтруется, я просто использую это свойство для последующего создания BluetoothDevice (если pid и vid совпадают).

Ответ №1:

Когда устройство не сопряжено, будет раскрыта некоторая информация (конечная точка), например идентификатор или имя устройства, но эта часть информации не содержит vid и pid, которые вам нужны. Эта информация будет раскрыта после сопряжения.

Вы можете выполнить тест, выполнить сопряжение с определенным устройством, а затем отменить сопряжение, вы можете обнаружить, что до тех пор, пока устройство было сопряжено, даже если сопряжение отменено, вы все равно можете получить vid и pid. Но после перезагрузки устройства vid и pid устройства больше не будут получены.

Комментарии:

1. Но это не имеет смысла, поскольку SDP предназначен для проверки, то ли это устройство, которое я ищу. В моем приложении я хочу предложить пользователю выполнить сопряжение с моим устройством, а не предлагать ему выполнить сопряжение со всеми близлежащими устройствами, чтобы проверить, являются ли они моим устройством. Этот дизайн бессмыслен, также другие платформы не имеют таких ограничений. Даже сам UWP раскрывает PID и VID для несвязанных устройств BLE, но не для BT Classic.