上下文是以下内容,我们有多辆卡车包含串行设备的蓝牙,我们为每个卡车蓝牙提供了一个唯一的名称,可以连接到特定的卡车。
我使用此代码检索所有RFCOMM服务:
DeviceInformation.FindAllAsync(RfcommDeviceService.GetDeviceSelector(RfcommServiceId.SerialPort))
问题在于,返回的所有设备模拟对象都包含RFCOMM服务的名称中的名称属性,而不是蓝牙设备名称。当我的项目是Win 8商店应用程序时,一切都很好,因为名称属性包含蓝牙设备名称。
我发现我可以使用上述代码返回的设备ID创建一个蓝牙词汇对象,但是随后该应用要求对所有设备使用蓝牙设备,直到我找到好的设备。我想防止这种情况,因为Win 8 Store应用程序并非如此。
我发现的第二个解决方案是解析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()
函数。这有效,但我想知道我的问题是否有更清洁的解决方案,因为如果字符串格式更改,解析字符串可能是一个真正的问题。
是否有一种方法可以检索蓝牙设备的名称,而无需要求使用所有蓝牙设备,直到我们找到它?
您可以尝试以下代码以获取蓝牙设备的名称:
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}'");
}
这里的关键点是蓝牙设备是一种类型的 AssicotEndPoint 对象。AEP通常代表通过无线或网络协议发现的设备。 AssicotEndPoint 对象是单个 AssioceendPointContainer 对象的孩子,并且可以包含0或更多 AssicotEndPointService 对象。 RFCOMM服务是一个 AssiocEndPointService 该蓝牙设备包含的。有关更多信息,请参阅DeviceInformationKind枚举,并通过网络枚举设备。
AssiopendPointService 具有多个属性。其中之一是 System.Devices.AepService.AEPID ,代表父 AssicotEndPointPoint 对象的标识符。因此,我们可以使用此属性获取蓝牙设备信息,一旦获取了设备信息,就可以轻松获取设备名称。但是, System.Devices.AepService.AEPID 属性不是设备模拟中的CONSEN属性。因此,我们需要使用deviceInformation.findallasync(字符串,iiterable(String))方法来需要此附加属性。有关更多信息,请参阅设备信息属性。