with - android studio samples




Wie kann ich eine Android-Anwendung ordnungsgemäß an eine RFCOMM-Buchse eines Bluetooth-fähigen Arduino-Mikrocontrollers anschließen? (2)

Ich arbeite mit einigen Studenten meiner Universität zusammen und entwickle eine einfache Bluetooth-Android-Anwendung, die für die serielle Kommunikation (RFCOMM) mit einem Arduino-Mikrocontroller mit einem daran angeschlossenen Bluetooth-Modul verwendet wird.

Soweit ich RFCOMM/SPP 00001101-0000-1000-8000-00805F9B34FB , verwende ich die korrekte Bluetooth-Adresse und UUID für RFCOMM/SPP 00001101-0000-1000-8000-00805F9B34FB . Meine Anwendung startet einen Thread, der versucht, mithilfe von BluetoothDevice.createRfcommSocketToServiceRecord(UUID) eine Verbindung zum Gerät BluetoothDevice.createRfcommSocketToServiceRecord(UUID) . Aber aus dem einen oder anderen Grund sehen wir keine erfolgreiche Verbindung. Der Vorgang schlägt immer fehl, wenn Sie connect() für den resultierenden BluetoothSocket Socket aufrufen, der von dem obigen Aufruf stammt.

Beim Testen auf meinem HTC Evo , auf dem die HTC-Variante von Gingerbread ausgeführt wird , schlägt der Aufruf von connect() normalerweise mit der Ausnahmebedingungsnachricht "Service Discovery konnte nicht gestartet werden" fehl. Ich habe gelesen und festgestellt, dass einige der Meinung waren, dass HTCs Implementierung für RFCOMM im Bluetooth-Stack fehlerhaft ist. Daher haben wir uns entschlossen, es auf dem Samsung Galaxy S eines anderen Studenten auszuprobieren. Als der Code zum ersten Mal lief, funktionierte alles perfekt. Der Arduino-Mikrocontroller ist mit einem kleinen Elektromotor verbunden, der wie erwartet funktioniert. Ich habe nicht ausgeschlossen, ob das Problem auf der Seite des Mikrocontrollers liegen könnte.

Nachfolgende Verwendungen der Anwendung auf dem Samsung-Gerät scheiterten daraufhin mit der Meldung "Service Discovery fehlgeschlagen". Mir scheint, dass vielleicht das Bluetooth-Modul auf der Geräteseite denkt, dass der RFCOMM-Dienst noch in Benutzung ist. Aber wir haben den Mikrocontroller neu gestartet und trotzdem das gleiche Ergebnis gesehen.

Ich habe gerade den Thread-Code aufgelistet, da es wirklich relevant ist. Ich habe gelesen, dass es eine ziemlich häufige Problemumgehung (Hack) für diese Probleme mit Reflektion gibt. Meine Versuche sind auch gescheitert, aber sind da und kommentiert. Hoffentlich kann mich hier jemand in die richtige Richtung lenken. Beachten Sie auch, dass ich die erforderlichen Berechtigungen im Manifest aktiviert habe. In beiden Fällen wurde das Gerät mithilfe der Android-Benutzeroberfläche erfolgreich mit dem Arduino verbunden.

private class ClientThread extends Thread {

    private String _btAddress;

    /**
     * A handle to the local device's Bluetooth adapter hardware.
     */
    private BluetoothAdapter _btAdapter = BluetoothAdapter.getDefaultAdapter();

    /**
     * A handle to the remote device Bluetooth context.
     */
    private BluetoothDevice _btRemoteDevice;

    /**
     * A handle to the Bluetooth serial socket.
     */
    private BluetoothSocket _btSocket;

    /**
     * Constructor.
     * @param btAddress The BluetoothHardware address.
     */
    public ClientThread(String btAddress)
    {
        _btAddress = btAddress;
    }

    public void run()
    {
        // Retrieves the device identified by the _btAddress property.
        _btRemoteDevice = retrieveDevice();
        if ( _btRemoteDevice == null )
            sendUIMessage( CONNECTION_BT_DEVICE_NOT_BONDED );
        else
            sendBeacon();
    }

    /**
     * Retrieves the device associated with this client thread.
     * @return
     */
    private BluetoothDevice retrieveDevice()
    {
        Set<BluetoothDevice> btDevices = _btAdapter.getBondedDevices();
        for (BluetoothDevice btd : btDevices)
        {
            String addr = btd.getAddress();
            String name = btd.getName();
            if ( addr.equalsIgnoreCase(_btAddress) )
                return btd;
        }
        return null;
    }

    /**
     * Sends the beacon to the Bluetooth device.
     */
    private void sendBeacon()
    {
        // Holds the output stream of the BluetoothDevice.
        OutputStream os = null;

        try
        {
            _btSocket = _btRemoteDevice.createRfcommSocketToServiceRecord( UUID.fromString( "00001101-0000-1000-8000-00805F9B34FB" ) );

            //Method m = _btRemoteDevice.getClass().getMethod("createInsecureRfcommSocket", new Class[] {int.class});
            //_btSocket = (BluetoothSocket) m.invoke(_btRemoteDevice, 1);
            _btSocket.connect();
            os = _btSocket.getOutputStream();
            os.write('L');
        }
        catch (IOException e)
        {
            String message = e.getMessage();
            e.printStackTrace();
            sendUIMessage(CONNECTION_FAILURE_IO);
        }
        catch (Exception e)
        {
            e.printStackTrace();
            sendUIMessage(CONNECTION_FAILURE_UNKNOWN);
        }
        finally
        {
            try
            {
                if (_btSocket != null)
                    _btSocket.close();
            }
            catch (IOException e)
            {
                System.out.println("Failed closing Bluetooth output stream.");
                e.printStackTrace();
            }
        }
    }
}

EDIT: Das Bluetooth-Modul ist ein MDFLY RF-BT0417CB. Ich weiß, dass der Code, der auf dem Arduino läuft nicht viel ist und einfach mit dem BT-Modul mit Serial.available () und Serial.read () kommuniziert. Ich habe jedoch eine neue Information, die vielleicht nützlicher ist. Als meine Anwendung auf dem Samsung-Gerät installiert wurde, funktionierte sie nur einmal und bei nachfolgenden Tests fehlgeschlagen. Vor einer Weile verwendete der andere Student, mit dem ich arbeite, Android App Inventor (ein Drag & Drop-GUI-Tool, das auch logische Arbeitsartefakte erzeugen kann), um eine einfache Anwendung zu erstellen, die dasselbe BT-Modul / Arduino-Board verbindet. Er sagte, dass, wenn meine Anwendung installiert wurde, die andere Anwendung sich nie mit dem BT-Modul verbinden konnte, was mich zu der Annahme verleitet, dass das System davon ausging, dass die Ressource meiner Anwendung zugewiesen wurde. Nachdem er meine App deinstalliert hatte, konnte sich der andere verbinden. Er hat nicht den Quellcode für die andere Anwendung, aber ich werde App Inventor selbst ausprobieren, um festzustellen, ob der Quellcode, den er generiert, etwas anderes macht. Soweit ich weiß, stimme ich den meisten der in der Android-Dokumentation definierten Standardverfahren zu. Vielleicht ist es etwas Seltsames an dem BT-Modul oder die Tatsache, dass der Arduino-Code das BT-Modul nicht unbedingt programmgesteuert steuert.

EIN WEITERES EDIT: Ich bin kein Bluetooth-Experte, aber wir konnten eine Arbeit herausfinden. Wie einigen bewusst ist, gibt es eine Reihe öffentlicher BluetoothDevice-APIs, die zur Kompilierungszeit ausgeblendet sind, aber zur Laufzeit durch Reflektion öffentlich zugänglich sind. Eine davon ist createRfCommSocket (int). Diese API befindet sich nicht in der offiziellen Dokumentation, da sie versteckt ist, aber Sie können sie hier lesen. Ich habe es noch nicht mit der Dokumentation unterstützt API, aber das Problem schien eine Nebenläufigkeit Problem zwischen dem Mobilteil und der seriellen Platine sein. Das Mobilteil hat eine Nachricht gesendet, was natürlich ein blockierender Anruf ist, und als es von dort zurückkam, wurde die Verbindung geschlossen. Die Abschirmung auf der seriellen Karte würde dann auch die Verbindung schließen und somit waren die Daten für die Arduino-Anwendung nicht verfügbar. Das haben wir erkannt, als wir im Debug-Modus auf der Android-Seite erfolgreiche Kommunikation erlebt haben, aber im Freigabemodus gescheitert sind. Das Hinzufügen einer Verzögerung von einer halben Sekunde auf der Android-Seite zwischen der Übertragung und dem Schließen des Bluetooth-Sockets behob das Problem. Ich kann nicht sagen, ob dieses Problem durch den Arduino-Code verursacht wurde oder nicht, da ich mit der Architektur nicht sehr vertraut bin, aber wir als Studenten haben keine Erfahrung, also würde mich das nicht überraschen.


Das Amarino Toolkit wurde speziell für die serielle Bluetooth-Kommunikation zwischen einem Android-Gerät und einem Arduino mit Bluetooth entwickelt.


[Communication Between Android And Arduino With Bluetooth(1)][1]

Ich denke, das wird dir hilfreich sein. Kannst du ein paar Details dazu liefern? Ich habe einen Link gesehen, du kannst das auch sehen. Lass mich wissen, ob das hilfreich ist oder nicht? Wie erstelle ich unsicher RFCOMM Socket in Android?





arduino