編輯

共用方式為


藍牙開發人員常見問題

本文包含常見 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 的方式。

這項功能應該存在於特定 SKU 上嗎?

藍牙 LE:是,所有功能都在 OneCore 中,且應該可在最新裝置上使用,但藍牙 LE 堆棧正常運作。

注意:周邊角色是硬體相依的,有些 Windows Server 版本不支援藍牙。

藍牙 BR/EDR (傳統):有些變化存在,但大部分都有非常類似的配置檔層級支援。 請參閱 RFCOMM 上的檔,以及計算機電話支援的配置檔檔