このページの内容
Android: Bluetooth で接続
WebView で @onekeyfe/hd-common-connect-sdk を実行し、低レベルトランスポートをネイティブ BLE に橋渡しします。まずネイティブ Android の例 と低レベルトランスポートプラグインの仕様を参照してください。
ネイティブ層は権限、ボンディング、GATT 接続、特性の I/O、クリーンアップを担当します。SDK はプロトコル検出、フレーミング、署名を担当します。ネイティブブリッジに別の V1/V2 デコーダーを追加しないでください。
権限
Android 12 以降を対象とするアプリでは、実行時に BLUETOOTH_SCAN と BLUETOOTH_CONNECT を要求します。スキャンと接続のみを行うクライアントに BLUETOOTH_ADVERTISE は不要です。
neverForLocation は BLE スキャンから位置情報を取得しない場合にのみ使用します。古い Android では適切な従来の Bluetooth/位置情報権限が必要です。古いデバイスに Android 12 専用の権限を無条件に要求しないでください。対象 SDK と位置情報の用途に合わせ、Android Bluetooth 権限ガイド に従ってください。
権限の承認待ち中にスキャンを開始しないでください。拒否された場合は JS の呼び出し元に権限エラーを返し、後でユーザー操作から再試行できるようにします。
JavaScript バンドルのビルドと読み込み
hardware-js-sdk のチェックアウトから実行:
cd packages/connect-examples/native-android-example/web
yarn
yarn buildweb_dist/ を app/src/main/assets/web_dist/ にコピーします。file:///android_asset/web_dist/index.html を読み込む前に、ネイティブブリッジのハンドラーを登録してください。アセットパスを維持し、デバイスブリッジにアクセスできる WebView には、アプリの信頼できるバンドルだけを読み込んでください。
デモには依存関係とブリッジの実装が含まれます。異なる Nordic BLE ライブラリのバージョンのスニペットを混ぜず、デモのパッケージ/Gradle 設定を出発点にしてください。
解決前に BLE 接続を完了
固定時間の待機では、ボンディング、GATT 接続、検出、通知購読の成功は確認できません。コールバックまたは BLE ライブラリの中断可能な完了 API に従ってください:
- 必要なボンディングを完了し、ユーザーの拒否やタイムアウトを報告します。
- GATT 接続の成功を待ちます。
- OneKey サービスと必要な 2 つの特性を検出します。
- 通知を有効にし、記述子/購読の完了を待ちます。
- ブリッジの次の
connect呼び出しは、送受信可能になってから解決します。
Android は操作の結果を次で公開します: BluetoothGattCallback。操作開始の呼び出しに成功しても、操作の完了ではありません。各保留操作にタイムアウトを設定し、失敗時には接続を閉じて、保留中のブリッジ呼び出しを拒否してください。
| 目的 | UUID |
|---|---|
| サービス | 00000001-0000-1000-8000-00805f9b34fb |
| 書き込み | 00000002-0000-1000-8000-00805f9b34fb |
| 通知 | 00000003-0000-1000-8000-00805f9b34fb |
ブリッジの仕様
| 方法 | 完了条件 |
|---|---|
enumerate() | 重複を除いた候補のスナップショットを返し、スキャンを停止して、リクエストを一度だけ完了します。 |
connect(uuid) | 接続、特性、通知の準備が完了。 |
send(uuid, data, options) | 16 進数を検証し、withoutResponse に従ってバイトを順に書き込み、書き込みエラーを伝播します。 |
receive(uuid) | 次のキュー内通知チャンクを 16 進数で返します。読み取り待機開始前に受信したチャンクも含めます。 |
disconnect(uuid) | 購読をキャンセルし、選択した接続を閉じ、保留中の読み取りを拒否して、古い通知データを破棄します。 |
キューとコールバックは接続ごとに保持します。特性がない場合は拒否し、null 許容の書き込みを成功扱いにしないでください。WebView ブリッジのコールバックは適切な UI スレッドで送信します。
Protocol V2 を実装する場合は、実際の BLE 書き込み容量を getProtocolV2PacketCapacity で公開してください。オーバーヘッドを含む ATT MTU を返さないでください。完全な仕様はプラグインインターフェースを参照してください。
SDK と UI のライフサイクル
バンドルではプラグインを指定して env: 'lowlevel' で初期化します。初期化結果を確認して接続を検出し、getDeviceState(connectId) を呼び出して、シードの存続期間に対応する deviceId を取得します。
保護された呼び出しの前に UI イベント処理を登録してください。入力リクエストだけに返信し、応答の関連付け情報をコピーしてください。REQUEST_BUTTON とデバイス専用の PIN プロンプトは通知です。ネイティブの「OK」ボタンでハードウェア上の操作を承認することはできません。
アドレス取得と署名の呼び出しには、標準ウォレットの場合は useEmptyPassphrase: true、選択した隠しウォレットの場合は passphraseState を渡します。デバイスごとに直列化してください。
統合を検証
実機で、権限拒否、ボンディングのキャンセル、検出失敗、通知失敗、ロック中デバイスの入力、取り外し/切断、再接続をテストしてください。デバイス上でアドレスを確認し、SDK の結果を検査します。BLE 広告が見つかっただけでは、一連の動作の合格にはなりません。
タイムアウト後に署名やファームウェア更新を自動再実行しないでください。参照: 切断と再接続.