上下文中,我们有多辆卡车包含蓝牙到串口设备,我们已经为每辆卡车蓝牙提供了一个独特的名称,可以连接到特定的卡车。
我使用此代码检索所有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 enumeration和Enumerate devices over a network。
AssociationEndpointService 有几个属性。其中一个是 System.Devices.AepService.AepId ,它表示父 AssociationEndpoint 对象的标识符。因此我们可以使用此属性来获取蓝牙设备信息,一旦我们获得设备信息,我们就可以轻松获取设备名称。但 System.Devices.AepService.AepId 属性不是DeviceInformation中的commen属性。所以我们需要使用DeviceInformation.FindAllAsync(String, IIterable(String))方法来要求这个额外的属性。有关详细信息,请参阅Device information properties。