本文包含常見 UWP 藍牙 API 問題的解答。
我使用哪些 API? 藍牙傳統 (RFCOMM) 或藍牙低能 (GATT)?
關於這個一般主題,在線有各種討論,因此讓我們將這個答案完全放在與 Windows 相關的差異上。 以下是一些一般指導方針:
藍牙 LE (Windows.Devices.Bluetooth.GenericAttributeProfile)
當您與支援藍牙低能的裝置通訊時,請使用 GATT API。 如果您的使用案例不常、頻寬低或需要低功率,藍牙低能就是答案。 包含這項功能的主要命名空間是 Windows.Devices.Bluetooth.GenericAttributeProfile。
何時不使用藍牙 LE
- 高頻寬、高頻率案例。 如果您需要持續與大量數據保持同步,請考慮使用藍牙傳統或甚至WiFi。
藍牙傳統版 (Windows.Devices.Bluetooth.Rfcomm)
RFCOMM API 可讓開發人員使用套接字來執行雙向串行埠樣式通訊。 一旦有了套接字,撰寫和閱讀的方法就相當標準。 此實作會顯示在 Rfcomm Chat 範例中。
何時不使用藍牙 Rfcomm
- 通知。 藍牙 GATT 通訊協定對此具有特定命令,因此可大幅減少耗電量和更快的響應時間。
- 檢查鄰近性或目前狀態偵測。 最好使用 公告 API ,並透過藍牙 LE 進行連線。
為什麼我的藍牙 LE 裝置在中斷連線後停止回應?
最常見的原因是遠端裝置遺失配對資訊。 大量較舊的藍牙裝置不需要驗證。 為了保護使用者,從 [設定] 應用程式執行的所有配對交易都需要驗證,而且某些裝置並未考慮到這一點。
從 Windows 10 版本 1511 開始,開發人員可以控制配對交握。 裝置 列舉和配對範例 會詳細說明建立新裝置的方方面面。
在此範例中,我們會使用無加密來起始與裝置的配對。 請注意,只有在遠端裝置不需要加密或驗證才能運作時,才能運作。
// Get ceremony type and protection level selections
// You must select at least ConfirmOnly or the pairing attempt will fail
DevicePairingKinds ceremonySelected = DevicePairingKinds.ConfirmOnly;
// Workaround remote devices losing pairing information
DevicePairingProtectionLevel protectionLevel = DevicePairingProtectionLevel.None
DeviceInformationCustomPairing customPairing = deviceInfoDisp.DeviceInformation.Pairing.Custom;
// Declare an event handler - you don't need to do much in PairingRequestedHandler since the ceremony is "None"
customPairing.PairingRequested += PairingRequestedHandler;
DevicePairingResult result = await customPairing.PairAsync(ceremonySelected, protectionLevel);
使用藍牙裝置之前,我是否必須配對藍牙裝置?
利用藍牙 RFCOMM(傳統版)時,您不需要在使用這些裝置之前配對裝置。 從 Windows 10 1607 版開始,您可以直接查詢附近的裝置並連線到它們。 更新 的 RFCOMM 聊天範例 會顯示這項功能。
(14393和以下) 此功能不適用於藍牙低能 (GATT 用戶端),因此您仍必須透過 [設定] 頁面或使用 Windows.Devices.Enumeration API 配對,才能存取這些裝置。
(15030以上) 不再需要配對藍牙裝置。 使用 GetGattServicesAsync 和 GetCharacteristicsAsync 之類的新 Async API,以查詢遠端裝置的目前狀態。 如需詳細資訊,請參閱客戶端檔。
何時應該與裝置配對,再與其通訊?
一般而言,如果您需要信任且長期與裝置的系結,請透過將使用者導向至設定頁面或使用裝置列舉和配對 API 來與裝置配對。 如果您只需要從公開的裝置讀取資訊(溫度感測器或指標),請連接或接聽廣告,而不需努力與裝置配對。 這會導致長時間執行時發生互操作性問題,因為大量裝置不支援配對。
所有 Windows 裝置是否都支持周邊角色?
否。 這是硬體相依的功能,但提供一種方法 BluetoothAdapter.IsPeripheralRoleSupported,以查詢它是否受到支援。 目前支持的裝置包括 8992+ 和 RPi3 上Windows Phone (Windows IoT)。
我可以從 Win32 存取這些 API 嗎?
是,所有這些 API 都應該正常運作。 此部落格詳細說明從傳統型應用程式呼叫 Windows API 的方式。