web-dev-qa-db-ja.com

Android Bluetooth Low Energyペアリング

Bluetooth Low Energy(BLE)デバイスをAndroidと暗号化データを読み取るためにペアリングする方法。

Android BLEページ の情報を使用して、デバイスを検出し、接続し、サービスを検出し、暗号化されていない特性を読み取ることができます。

暗号化された特性(iOSにペアリングを要求するポップアップが表示され、読み取りが完了する)を読み取ろうとすると、エラーコード5認証不足 に対応します。

デバイスをペアにする方法、または読み取りを完了するための認証情報を提供する方法がわからない。

記述子を追加しようとしてBluetoothGattCharacteristicsをいじりましたが、それでもうまくいきませんでした。
ご協力ください。

33
Zomb

GATT_INSUFFICIENT_AUTHENTICATIONエラーが表示されると、システムはボンディングプロセスを開始します。以下の例では、グルコースモニターで通知と表示を有効にしようとしています。最初に、エラーを表示する可能性のあるグルコース測定特性に関する通知を有効にします。

@Override
    public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
        if (status == BluetoothGatt.GATT_SUCCESS) {
            if (GM_CHARACTERISTIC.equals(descriptor.getCharacteristic().getUuid())) {
                mCallbacks.onGlucoseMeasurementNotificationEnabled();

                if (mGlucoseMeasurementContextCharacteristic != null) {
                    enableGlucoseMeasurementContextNotification(gatt);
                } else {
                    enableRecordAccessControlPointIndication(gatt);
                }
            }

            if (GM_CONTEXT_CHARACTERISTIC.equals(descriptor.getCharacteristic().getUuid())) {
                mCallbacks.onGlucoseMeasurementContextNotificationEnabled();
                enableRecordAccessControlPointIndication(gatt);
            }

            if (RACP_CHARACTERISTIC.equals(descriptor.getCharacteristic().getUuid())) {
                mCallbacks.onRecordAccessControlPointIndicationsEnabled();
            }
        } else if (status == BluetoothGatt.GATT_INSUFFICIENT_AUTHENTICATION) {
            // this is where the tricky part comes

            if (gatt.getDevice().getBondState() == BluetoothDevice.BOND_NONE) {
                mCallbacks.onBondingRequired();

                // I'm starting the Broadcast Receiver that will listen for bonding process changes

                final IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
                mContext.registerReceiver(mBondingBroadcastReceiver, filter);
            } else {
                // this situation happens when you try to connect for the second time to already bonded device
                // it should never happen, in my opinion
                Logger.e(TAG, "The phone is trying to read from paired device without encryption. Android Bug?");
                // I don't know what to do here
                // This error was found on Nexus 7 with KRT16S build of Andorid 4.4. It does not appear on Samsung S4 with Andorid 4.3.
            }
        } else {
            mCallbacks.onError(ERROR_WRITE_DESCRIPTOR, status);
        }
    };

MBondingBroadcastReceiverは次のとおりです。

private BroadcastReceiver mBondingBroadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(final Context context, final Intent intent) {
        final BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
        final int bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, -1);
        final int previousBondState = intent.getIntExtra(BluetoothDevice.EXTRA_PREVIOUS_BOND_STATE, -1);

        Logger.d(TAG, "Bond state changed for: " + device.getAddress() + " new state: " + bondState + " previous: " + previousBondState);

        // skip other devices
        if (!device.getAddress().equals(mBluetoothGatt.getDevice().getAddress()))
            return;

        if (bondState == BluetoothDevice.BOND_BONDED) {
            // Continue to do what you've started before
            enableGlucoseMeasurementNotification(mBluetoothGatt);

            mContext.unregisterReceiver(this);
            mCallbacks.onBonded();
        }
    }
};

アクティビティを終了するときは、必ずブロードキャストレシーバーの登録を解除してください。受信者によって登録解除されていない可能性があります。

24
philips77

私は新しいAndroid 4.4がペアリング方法を提供すると思います。同じ問題はすでに私が直面しているので、更新を待って問題が解決されたcreateBond()メソッドを期待します。

http://developer.Android.com/reference/Android/bluetooth/BluetoothDevice.html#setPairingConfirmation%28boolean%29

1
mcd

カーネルのsmp.cファイルを確認する必要がある場合があります。このファイルを解析する方法は、解析のために呼び出します。 1)パスキー2)ただ仕事など。 MIMTとパスキーレベルのセキュリティを呼び出すことができれば、認証の問題はないでしょう。すべてのフラグがSMPパスキーメソッドを呼び出すように設定されていることを確認してください。 smp.cファイルに印刷物を入れて追跡します。

ICS:Androidでbtmgmtツールを使用し、暗号化APIでそれをフックします。パスキーまたは他のメソッドを使用します。最新のbluezコードからbtmgmtにパスキーAPIを追加します。

0
RobinSingh