2016-12-14 145 views
2

上下文是以下内容,我们有多个包含蓝牙到串行设备的卡车,我们给每个卡车蓝牙一个唯一的名称以便能够连接到特定的卡车。从rfcomm设备服务中检索蓝牙设备的名称

我使用此代码检索所有RFCOMM服务:

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

的问题是,所有的DeviceInformation对象返回包含在Name属性而不是蓝牙设备名称RFCOMM服务的名称。当我的项目是Win 8商店应用程序时,由于name属性包含蓝牙设备名称,所以一切正常。

我发现我可以用上面的代码返回的设备ID创建一个BluetoothDevice对象,但是然后应用程序要求为所有设备使用蓝牙设备,直到找到好的为止。我想阻止Win 8商店应用程序的情况。

其次解决方案,我发现解析RFCOMM服务的设备ID看起来像这样的

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

去除一切都会过去“#RFCOMM”,并使用DeviceInformation.CreateFromIdAsync()功能。这有效,但我想知道是否有一个更清洁的解决方案,因为如果字符串格式更改,解析字符串可能是一个真正的问题。

有没有办法检索蓝牙设备的名称,而不必要求使用所有的蓝牙设备,直到我们找到它?

+0

是的,它的工作,我标记你的答案被接受。谢谢 –

回答

1

你可以用下面的代码试图让蓝牙设备的名称:

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}'"); 
} 

这里的关键点是,蓝牙设备是一类AssociationEndpoint对象。 AEP通常代表通过无线或网络协议发现的设备。一个AssociationEndpoint对象是单个子对象AssociationEndpointContainer对象并且可以包含0或更多AssociationEndpointService对象。并且RFComm服务是蓝牙设备包含的一个AssociationEndpointService。欲了解更多信息,请参阅DeviceInformationKind enumerationEnumerate devices over a network

AssociationEndpointService有几个属性。其中之一是System.Devices.AepService.AepId其代表父对象的标识AssociationEndpoint对象。因此,我们可以使用此属性来获取蓝牙设备信息,一旦我们获得设备信息,我们就可以轻松获取设备名称。但是,System.Devices.AepService.AepId属性不是DeviceInformation中的commen属性。所以我们需要使用DeviceInformation.FindAllAsync(String, IIterable(String))方法来要求这个额外的特性。欲了解更多信息,请参阅Device information properties

+0

很好的解释了关于蓝牙结构的答案谢谢! –