2016-12-14 2 views
2

Контекст следующий: у нас есть несколько грузовиков, которые содержат bluetooth для последовательного устройства, мы дали каждому грузовику bluetooth уникальное имя, чтобы иметь возможность подключиться к конкретному грузовику.Извлечь имя устройства bluetooth из услуг устройства rfcomm

Я использую этот код, чтобы получить все RFCOMM услуги:

DeviceInformation.FindAllAsync(RfcommDeviceService.GetDeviceSelector(RfcommServiceId.SerialPort)) 

Проблема заключается в том, что все объекты DeviceInformation вернулся содержит имя службы RFCOMM имя свойства вместо имени устройства Bluetooth. Когда мой проект был приложением для магазина Win 8, все было в порядке, так как свойство name содержало имя устройства Bluetooth.

Я обнаружил, что могу создать объект BluetoothDevice, используя идентификатор устройства, возвращенный вышеуказанным кодом, но затем приложение попросит использовать устройство Bluetooth для всех устройств, пока не найду подходящее. Я хотел бы предотвратить это, поскольку это не относится к приложению Win 8 store.

Второе решение, которое я нашел, было разобрать идентификатор устройства службы RFCOMM которые выглядят как этот

Bluetooth#Bluetooth00:c2:c6:56:b0:61-00:15:be:0f:02:d7#RFCOMM:00000000:{00001101-0000-1000-8000-00805f9b34fb} 

удалить все прошлое «#RFCOMM» и использовать функцию DeviceInformation.CreateFromIdAsync(). Это работает, но мне было интересно, было ли более чистое решение для моей проблемы, поскольку синтаксический анализ строки может быть реальной проблемой при изменении формата строки.

Есть ли способ получить имя устройства Bluetooth без необходимости запрашивать все Bluetooth-устройства, пока мы его не найдем?

+0

Да, это сработало, я отметил ваш ответ как принятый. спасибо –

ответ

1

Вы можете попробовать следующий код, чтобы получить имя устройства Bluetooth:

var serviceInfoCollection = await DeviceInformation.FindAllAsync(RfcommDeviceService.GetDeviceSelector(RfcommServiceId.SerialPort), new string[] { "System.Devices.AepService.AepId" }); 

foreach (var serviceInfo in serviceInfoCollection) 
{ 
    var deviceInfo = await DeviceInformation.CreateFromIdAsync((string)serviceInfo.Properties["System.Devices.AepService.AepId"]); 

    System.Diagnostics.Debug.WriteLine($"Device name is: '{deviceInfo.Name}' and Id is: '{deviceInfo.Id}'"); 
} 

Ключевым моментом здесь является то, что устройство Bluetooth является один тип AssociationEndpoint объектов. AEP обычно представляют собой устройство, обнаруженное по беспроводному или сетевому протоколу. A Объект AssociationEndpoint является дочерним элементом одного объекта AssociationEndpointContainer и может содержать 0 или более AssociationEndpointService объектов. И Служба RFComm - это один AssociationEndpointService, который содержит устройство Bluetooth. Для получения дополнительной информации см. DeviceInformationKind enumeration и Enumerate devices over a network.

AssociationEndpointService имеет несколько объектов недвижимости. Один из них: System.Devices.AepService.AepId, который представляет собой идентификатор родителя AssociationEndpoint объект. Таким образом, мы можем использовать это свойство, чтобы получить информацию об устройстве Bluetooth, и как только мы получим информацию об устройстве, мы сможем легко получить имя устройства. Однако System.Devices.AepService.AepId Недвижимость не является коммандой в DeviceInformation. Поэтому нам нужно использовать метод DeviceInformation.FindAllAsync(String, IIterable(String)), чтобы потребовать это дополнительное свойство. Для получения дополнительной информации см. Device information properties.

+0

очень хорошо объяснил ответ о структуре bluetooth спасибо! –

Смежные вопросы