2016-12-14 151 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

很好的解釋了關於藍牙結構的答案謝謝! –