Bluetooth に関する開発者向け FAQ

この記事には、UWP Bluetooth API のよく寄せられる質問に対する回答が含まれています。

どの API を使用すればよいですか。 Bluetooth Classic (RFCOMM) と Bluetooth 低エネルギー (GATT) のどちらですか。

この一般的なトピックに関してはオンラインでもさまざまな議論が行われています。そこで、この回答では Windows に関しての違いについて説明します。 一般的なガイドラインを次に示します。

Bluetooth LE (Windows.Devices.Bluetooth.GenericAttributeProfile)

Bluetooth 低エネルギーをサポートするデバイスと通信している場合は、GATT API を使用します。 使用事例が不定期、低帯域幅である場合や、低電力を必要とする場合は、Bluetooth Low Energy が適しています。 この機能を含む主な名前空間は、Windows.Devices.Bluetooth.GenericAttributeProfile です。

Bluetooth LE を使用しない場合

  • 高帯域幅で使用頻度の高いシナリオ。 常に大量のデータを同期する必要がある場合は、Bluetooth Classic または WiFi の使用を検討します。

Bluetooth Classic (Windows.Devices.Bluetooth.Rfcomm)

RFCOMM API は、双方向のシリアル ポートスタイルの通信を実行するソケットを開発者に提供します。 ソケットを利用すると、書き込みや読み取りの手法が標準的になります。 この実装については、Rfcomm チャット サンプルをご覧ください。

Bluetooth Rfcomm を使用しない場合

  • 通知。 Bluetooth GATT プロトコルにはこのための特定のコマンドがあり、電力消費量が大幅に減少し、応答時間が高速になります。
  • 近接通信またはプレゼンスの検出の確認。 アドバタイズ API を使用し、Bluetooth LE 経由で接続することをお勧めします。

Bluetooth LE デバイスが、切断後、応答を停止する理由を教えてください。

この問題が発生する最も一般的な理由は、リモート デバイスのペアリング情報が失われるためです。 以前の Bluetooth デバイスの多くは、認証を必要としません。 ユーザーを保護するために、設定アプリケーションから実行されるすべてのペアリング トランザクションには認証が要求されますが、一部のデバイスはこれを念頭に置いて設計されていない場合があります。

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);

Bluetooth デバイスを使用する前にペアリングする必要はありますか。

Bluetooth RFCOMM (クラシック) を利用する場合、デバイスを使用する前にペアリングする必要はありません。 Windows 10 リリース 1607 以降では、簡単に近くにあるデバイスを照会し、そのデバイスに接続できます。 更新されたRFCOMM チャット サンプルで、この機能について説明しています。

(14393 以下) この機能は、Bluetooth Low Energy (GATT クライアント) では使用できないため、これらのデバイスにアクセスするために、[設定] ページで、または Windows.Devices.Enumeration API を使ってペアリングを行う必要があります。

(15030 以上) Bluetooth デバイスのペアリングは不要になりました。 リモート デバイスの現在の状態を照会するために、GetGattServicesAsync や GetCharacteristicsAsync のような新しい非同期 API を使います。 詳しくは、クライアントのマニュアルをご覧ください。

デバイスと通信する前にペアリングが必要になるのはどのような場合ですか。

一般に、デバイスとの信頼された長期的な接続が必要な場合は、[設定] ページにユーザーを誘導するか、デバイスの列挙とペアリングの API を使ってデバイスとペアリングします。 一般に公開されているデバイスから情報 (温度センサーやビーコン) を読み取ることのみが必要である場合は、デバイスとペアリングする作業を行わずに、接続するか、アドバタイズをリッスンします。 多くのデバイスはペアリングをサポートしていないため、これにより長期的な相互運用性の問題を防止できます。

すべての Windows デバイスが周辺機器の役割をサポートしていますか。

いいえ。 これはハードウェア依存の機能ですが、この機能がサポートされているかどうかを照会するためのメソッド (BluetoothAdapter.IsPeripheralRoleSupported) が用意されています。 現在サポートされているデバイスには、8992 以上を搭載した Windows Phone や RPi3 (Windows IoT) が含まれます。

Win32 からこれらの API にアクセスできますか。

はい。これらすべての API が機能します。 このブログでは、デスクトップ アプリケーションから Windows API を呼び出す方法の詳細を説明しています。

この機能は、特定の SKU にも存在しますか。

Bluetooth LE: はい、すべての機能が OneCore に含まれ、有効な Bluetooth LE スタックを含む最新のデバイスで利用可能です。

注意: 周辺機器の役割はハードウェアに依存しており、一部の Windows Server エディションでは Bluetooth をサポートしていません。

Bluetooth BR/EDR (クラシック): いくつかのバリエーションがありますが、ほとんどの場合、プロファイル レベルのサポートはよく似ています。 RFCOMM に関するドキュメントや、PC電話でのこれらのサポートされるプロファイルに関するドキュメントをご覧ください。