it-swarm.com.de

Android-Bluetooth-Kopplung ohne Benutzer Geben Sie die PIN und die Bestätigung über die Android-API ein

Ich bin ein Anfänger in der Android-Programmierung, da ich erst vor drei Monaten angefangen habe. Ich mache ein Projekt, das die Android-App über Bluetooth mit Arduino verbindet. Ich habe bereits einen Code für die Android-App (Bluetooth-Adapter, Sockets, usw.). Der Code für die Verbindung funktioniert bereits. Eines der Ziele ist, dass die Android-App das Kennwort beim Pairing mit dem Bluetooth-Gerät automatisch eingibt, ohne dass der Benutzer zur Eingabe der PIN aufgefordert wird. 

Die alten Beiträge in diesem Forum helfen nicht viel. (viele empfahlen den unsicheren Modus, aber ich brauche den sicheren Modus. In meinem Fall ist das Arduino der Server, während die Handy-App der Client ist. Daher funktioniert die Servermethode createInsecureRfcommSocketToServiceRecord () für mich nicht.)

Ich habe dies auf der Android-Entwicklerseite zum Thema bluetoothdevice class gesucht und gefunden:

setPairingConfirmation (boolean confirm) Bestätigen Sie den Passkey für das Pairing PAIRING_VARIANT_PASSKEY_CONFIRMATION.

PAIRING_VARIANT_PIN = "Der Benutzer wird aufgefordert, eine PIN einzugeben, oder eine App gibt eine PIN für den Benutzer ein".

PAIRING_VARIANT_PASSKEY_CONFIRMATION = "Der Benutzer wird aufgefordert, den auf dem Bildschirm angezeigten Passkey zu bestätigen, oder eine App bestätigt den Passkey für den Benutzer."

Anscheinend wird der Code verwendet. Die App ist derjenige, der das Passwort eingibt und das Kennwort bestätigt Das Passwort wird zu einer "Auto-Connect" -Funktion. Die Android-Site enthält jedoch keinen Beispielcode für die Verwendung dieses Codes. Hat einer von Ihnen einen Beispielcode bei der Verwendung dieses oder verwandter Prozesse? Ich schätze Ihre Hilfe!

7
ian

Zunächst einmal ist diese Lösung für neuere API-Versionen (15 oder höher?) Konzipiert.

Ich habe die Antwort in einem anderen Beitrag geschrieben (siehe Roldofos Antwort in Here ). Hier ist meine reorganisierte Antwort mit ausführlichem Code.

Kurz gesagt, Sie müssen einen Broadcast-Empfänger einrichten, um ACTION_PAIRING_REQUEST abzufangen, und dann die PIN programmgesteuert übergeben und bestätigen. 

Registrieren Sie einen Rundfunkempfänger: 

    IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_PAIRING_REQUEST);
    getActivity().registerReceiver(mPairingRequestReceiver, filter);

Die Definition des Empfängers:

private final BroadcastReceiver mPairingRequestReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (action.equals(BluetoothDevice.ACTION_PAIRING_REQUEST)) {
            try {
                    BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                    int pin=intent.getIntExtra("Android.bluetooth.device.extra.PAIRING_KEY", 1234);
                    //the pin in case you need to accept for an specific pin
                    Log.d(TAG, "Start Auto Pairing. PIN = " + intent.getIntExtra("Android.bluetooth.device.extra.PAIRING_KEY",1234));
                    byte[] pinBytes;
                    pinBytes = (""+pin).getBytes("UTF-8");
                    device.setPin(pinBytes);
                    //setPairing confirmation if neeeded
                    device.setPairingConfirmation(true);
            } catch (Exception e) {
                Log.e(TAG, "Error occurs when trying to auto pair");
                e.printStackTrace();
            }
        }
    }
};

Bei Ihrer Aktivität oder Ihrem Fragment (wo immer Sie die Paarung initiieren möchten) können Sie die folgende definierte Methode pairDevice () aufrufen, um den Paarungsversuch aufzurufen (wodurch ein ACTION_PAIRING_REQUEST generiert wird)

private void pairDevice(BluetoothDevice device) {
    try {
        Log.d(TAG, "Start Pairing... with: " + device.getName());
        device.createBond();
        Log.d(TAG, "Pairing finished.");
    } catch (Exception e) {
        Log.e(TAG, e.getMessage());
    }
}
10
ian

Ich stand auch vor dem gleichen Problem und nach all den Nachforschungen fand ich die Lösung unten. 

(getestet und funktioniert !!!)

Ich bin grundsätzlich auf der Suche nach einem bestimmten Bluetooth-Gerät (ich kenne die MAC-Adresse) und koppele damit einmal gefunden. Als Erstes müssen Sie eine Paaranforderung mit einem Boradcast-Empfänger erstellen und die Anforderung wie unten beschrieben bearbeiten.

IntentFilter intentFilter = new IntentFilter(BluetoothDevice.ACTION_PAIRING_REQUEST);
                intentFilter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
                registerReceiver(broadCastReceiver,intentFilter);

Sie müssen den broadcastReceiver schreiben und wie unten beschrieben behandeln.

String BLE_PIN = "1234"
private BroadcastReceiver broadCastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if(BluetoothDevice.ACTION_PAIRING_REQUEST.equals(action))
        {
            BluetoothDevice bluetoothDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            bluetoothDevice.setPin(BLE_PIN.getBytes());
            Log.e(TAG,"Auto-entering pin: " + BLE_PIN);
            bluetoothDevice.createBond();
            Log.e(TAG,"pin entered and request sent...");
        }
    }
};

Voila! Sie sollten in der Lage sein, ein Bluetooth-Gerät ohne manuelle Intervention zu koppeln.

Hoffe das hilft :-) Bitte mache die richtige Antwort, wenn es für dich funktioniert.

1
Varun A M