it-swarm.com.de

Android Bluetooth-Paarung mit niedriger Energie

So koppeln Sie ein Bluetooth Low Energy (BLE) - Gerät mit Android, um verschlüsselte Daten zu lesen.

Mithilfe der Informationen auf der Seite Android BLE kann ich das Gerät erkennen, eine Verbindung herstellen, Dienste erkennen und unverschlüsselte Merkmale lesen.

Wenn ich versuche, ein verschlüsseltes Merkmal zu lesen (eines, bei dem iOS ein Popup-Fenster mit der Aufforderung zum Pairing und anschließenden Lesen anzeigt), erhalte ich einen error code 5, der Unzureichende Authentifizierung entspricht. 

Ich bin mir nicht sicher, wie das Gerät gekoppelt wird oder wie die Authentifizierungsinformationen bereitgestellt werden, um den Lesevorgang abzuschließen

Ich habe mit BluetoothGattCharacteristics gespielt, indem ich versuchte, Deskriptoren hinzuzufügen, aber das hat auch nicht funktioniert.
.__ Jede Hilfe wird geschätzt!

32
Zomb

Wenn Sie den Fehler GATT_INSUFFICIENT_AUTHENTICATION erhalten, startet das System den Bonding-Prozess für Sie. Im folgenden Beispiel versuche ich, Benachrichtigungen und Anzeigen auf dem Glukosemonitor zu aktivieren. Zuerst aktiviere ich die Benachrichtigungen über die Glukose-Messmerkmale, die dazu führen können, dass der Fehler angezeigt wird.

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

Wo ist der 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();
        }
    }
};

Denken Sie daran, den Broadcast-Empfänger beim Beenden der Aktivität aufzuheben. Es wurde möglicherweise nicht vom Empfänger selbst unregistriert.

24
philips77

ich denke, neue Android 4.4 bieten Pairing-Methode. dasselbe Problem, dem ich bereits gegenüber stehe, also warten Sie auf ein Update und hoffen, dass das Problem mit der Methode createBond () gelöst wird.

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

1
mcd

Möglicherweise müssen Sie die Kernel-Datei smp.c überprüfen, welche Methode sie für das Paring aufrufen muss. 1) Passkey 2) Einfach arbeiten oder etc. Ich denke, wenn es in der Lage ist, die MIMT- und Sicherheitsschlüsselebene aufzurufen, gibt es kein Authentifizierungsproblem. Stellen Sie sicher, dass alle Flags gesetzt sind, um die SMP-Passkey-Methoden aufzurufen. Verfolgen Sie, indem Sie etwas Druck in der smp.c-Datei ablegen.

Eine Lösung, die in ICS funktioniert: mit dem btmgmt-Tool in Android und dem Einbinden in Verschlüsselungs-APIs. mit einem Schlüssel oder einer anderen Methode. Es klappt. Möglicherweise müssen Sie die Passkey-APIs aus dem aktuellen Bluez-Code in btmgmt hinzufügen.

0
RobinSingh