Android Studio - Verbindung mit dem Arduino via Bluetooth

  • Antworten:35
  • OffenNicht stickyBentwortet
  • Forum-Beiträge: 3

13.01.2019, 18:45:28 via Website

Hallo zusammen,
Ich möchte mein Telefon über Bluetooth mit einem Arduino verbinden, um den Arduino zu steuern. Also habe ich den folgenden Code geschrieben, um die MAC-Adresse vom Bluetooth-Adapter zu erhalten, wenn ich in der ListView auf ein Gerät klicke:

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.Set;

public class home extends AppCompatActivity {

    /*Variablen deklarieren*/
    //Btn
    private Button btnPaired;
    //Anzeige-Listen
    private ListView devicelist;
    //Bluetooth
    public BluetoothAdapter myBluetooth = null;
    private Set<BluetoothDevice> pairedDevices;
    private String device_name, device_address;
    public static String EXTRA_ADDRESS = "device_address", EXTRA_NAME = "device_name";

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        //Btn
        btnPaired = findViewById(R.id.btn_paired_device);
        //Anzeige-Listen
        devicelist = findViewById(R.id.list_paired_device);
        //Bluetooth
        myBluetooth = BluetoothAdapter.getDefaultAdapter();

        //Überprüfen, ob das Gerät Bluetooth hat
        if(myBluetooth == null)
        {
            Toast.makeText(getApplicationContext(), "Bluetooth Device Not Available", Toast.LENGTH_LONG).show(); //Show message
            finish(); //App beenden
        }
        else if(!myBluetooth.isEnabled())
        {
            //fragt den User, ob er Bluetooth einschalten will
            Intent turnBTon = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(turnBTon,1);
        }

        btnPaired.setOnClickListener(new View.OnClickListener() {
            @Override
            //Wenn der Btn "btnPaired" angeklickt wird
            public void onClick(View v)
            {
                pairedDevicesList(); //Funktionen aufrufen
            }
        });

    }

    private void pairedDevicesList()
    {
        //Variablen initalisieren
        pairedDevices = myBluetooth.getBondedDevices();
        ArrayList list = new ArrayList();

        //Überprüft, ob "pairedDevices.size()" größer als "0" ist
        if (pairedDevices.size() > 0)
        {
            //Wiederholt, so oft, wie es Device-Geräte gibt
            for(BluetoothDevice bt : pairedDevices)
                list.add(bt.getName() + "\n" + bt.getAddress()); //fügt verfügbare Geräte zum Array hinzu
        }
        else
            Toast.makeText(getApplicationContext(), "No Paired Bluetooth Devices Found.", Toast.LENGTH_LONG).show(); //Show message

        final ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1, list);
        devicelist.setAdapter(adapter);
        devicelist.setOnItemClickListener(myListClickListener); //OnClick-Funktion

    }

    private AdapterView.OnItemClickListener myListClickListener = new AdapterView.OnItemClickListener()
    {
        public void onItemClick (AdapterView<?> av, View v, int arg2, long arg3)
        {
            // Get the device MAC address, the last 17 chars in the View
            String info = ((TextView) v).getText().toString();
            device_name = info.substring(0, info.length() - 17);
            device_address = info.substring(info.length() - 17);

            Intent intent = new Intent(home.this, message.class);
            intent.putExtra(EXTRA_ADDRESS, device_address); //this will be received at ledControl (class) Activity
            intent.putExtra(EXTRA_NAME, device_name); //this will be received at ledControl (class) Activity
            //Change the activity.
            startActivity(intent);
        }
    };

Am Ende des oberen Codes wechsle ich zur Activity "message". Der Code für "message" lautet:

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class message extends AppCompatActivity implements TextWatcher, View.OnClickListener {
    private static final String TAG = "message";

    /*Variablen deklarieren*/
    //Btn
    private Button btn_send;
    //Eingabe
    private EditText fld_message;
    //Anzeige-Fld
    private TextView mBluetoothStatus;
    //String
    private String device_adresse, device_name, message_to_the_arduino;
    //Class
    home home = new home();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Intent newint = getIntent();
        //String
        device_adresse = newint.getStringExtra(home.EXTRA_ADDRESS);
        device_name = newint.getStringExtra(home.EXTRA_NAME);
        //Funktion aufrufen
        kopplung_mit_bluetooth_modul();

        setContentView(R.layout.activity_message);
        //Btn
        btn_send = findViewById(R.id.btn_send);
        btn_send.setOnClickListener(this);
        //Eingabe
        fld_message = findViewById(R.id.fld_message);
        fld_message.addTextChangedListener(this);
        //Anzeige-Fld
        mBluetoothStatus = findViewById(R.id.fld_bt_status);
    }

    private void kopplung_mit_bluetooth_modul()
    {
        //Connect with the Bluetooth-Adapter
    }

    private void send_message()
    {
        //Send the String "message_to_the_arduino"
    }

    /*Btn*/
    @Override
    public void onClick(View v) {
        switch(v.getId())
        {
            case R.id.btn_send:
                send_message();
                break;
        }
    }

    /*Eingabefeld*/
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after)
    {}
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        message_to_the_arduino = s.toString();
    }
    @Override
    public void afterTextChanged(Editable s)
    {}
}

In der Activity "message" möchte ich eine Verbindung zum Bluetooth-Adapter herstellen [Funktion "kopplung_mit_bluetooth_modul"].
Danach möchte ich LEDs am Arduino EIN / AUS machen, also muss ich eine Nachricht an den Arduino senden (Befehl) und Nachrichten vom Arduino erhalten (Rückmeldung) [Funktion "send_message"].

Ich habe nun schon vieles verschiedenes ausprobiert, kriege es aber einfach nicht gebacken.
Kann mir jemand helfen ????

Diskutiere mit!
Beste Antwort
  • Forum-Beiträge: 618

13.01.2019, 19:09:51 via Website

Hallo willkommen im Forum.

In einem anderen Forum habe ich schon mal diesen Code zum ähnlichen Thema veröffentlicht. Das könnte dir helfen.

An sonsten noch diese links.

https://de.m.wikibooks.org/wiki/Googles_Android/_Bluetooth
https://www.instructables.com/id/Android-Bluetooth-Control-LED-Part-2/

public class ActivityBlue extends AppCompatActivity implements View.OnClickListener{


    // UUID fuer Kommunikation mit Seriellen Modulen
    private UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
    private static final String LOG_TAG = "BLueTest";


    private BluetoothAdapter adapter = null;
    private BluetoothSocket socket = null;
    private OutputStream stream_out = null;
    private InputStream stream_in = null;
    private boolean is_connected = false;
    private Set<BluetoothDevice> pairedDevices;
    private ArrayList<BluetoothDevice> pairedListe;
    private ListView lv;
    private static String mac_adresse; // MAC Adresse des Bluetooth Adapters

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_blue);

        Log.d(LOG_TAG, "Bluetest: OnCreate");

        ((Button)findViewById(R.id.bt_on)).setOnClickListener(this);
        ((Button)findViewById(R.id.bt_trennen)).setOnClickListener(this);
        ((Button)findViewById(R.id.bt_verbinden)).setOnClickListener(this);
        ((Button)findViewById(R.id.bt_liste)).setOnClickListener(this);
        ((Button)findViewById(R.id.bt_senden)).setOnClickListener(this);


        ((TextView) findViewById(R.id.text_uuid)).setText("UUID: " + uuid);
        pairedListe = new ArrayList<>();

        // Verbindung mit Bluetooth-Adapter herstellen
        adapter = BluetoothAdapter.getDefaultAdapter();
        if (adapter == null || !adapter.isEnabled()) {
            Toast.makeText(getApplicationContext(), "Bitte Bluetooth aktivieren oder auf On Klicken", Toast.LENGTH_LONG).show();
            Log.d(LOG_TAG, "onCreate: Bluetooth Fehler: Deaktiviert oder nicht vorhanden");
        } else {
            Log.d(LOG_TAG, "onCreate: Bluetooth-Adapter ist bereit");
        }

        lv = (ListView)findViewById(R.id.paired_listview);
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                BluetoothDevice mDevice = pairedListe.get(position);
                mac_adresse = mDevice.getAddress();
                ((EditText) findViewById(R.id.text_adresse)).setText(mac_adresse);
            }
        });
    }

    public  void bluetoothOn(){
        if (!adapter.isEnabled()) {
            Intent turnOn = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(turnOn, 0);
            adapter = BluetoothAdapter.getDefaultAdapter();

        } else {
            Toast.makeText(getApplicationContext(), "BT ON", Toast.LENGTH_LONG).show();

        }
    }

    public void listeBTGeräte(){

        pairedDevices = adapter.getBondedDevices();
        ArrayList list = new ArrayList();

        for(BluetoothDevice bt : pairedDevices) {
            list.add(bt.getName());
            pairedListe.add(bt);
        }

        Toast.makeText(this, "List Paired Devices",Toast.LENGTH_SHORT).show();
        final ArrayAdapter adapter = new  ArrayAdapter(this,android.R.layout.simple_list_item_1, list);
        lv.setAdapter(adapter);

    }

    public void verbinden() {

        mac_adresse = ((EditText) findViewById(R.id.text_adresse)).getText()
                .toString();
        Log.d(LOG_TAG, "Verbinde mit " + mac_adresse);

        BluetoothDevice remote_device = adapter.getRemoteDevice(mac_adresse);

        // Socket erstellen
        try {
            socket = remote_device
                    .createInsecureRfcommSocketToServiceRecord(uuid);
            Log.d(LOG_TAG, "Socket erstellt");
        } catch (Exception e) {
            Log.e(LOG_TAG, "Socket Erstellung fehlgeschlagen: " + e.toString());
        }

        adapter.cancelDiscovery();

        // Socket verbinden
        try {
            socket.connect();
            Log.d(LOG_TAG, "Socket verbunden");
            is_connected = true;
        } catch (IOException e) {
            is_connected = false;
            Log.e(LOG_TAG, "Socket kann nicht verbinden: " + e.toString());
        }

        // Socket beenden, falls nicht verbunden werden konnte
        if (!is_connected) {
            try {
                socket.close();
            } catch (Exception e) {
                Log.e(LOG_TAG,
                        "Socket kann nicht beendet werden: " + e.toString());
            }
        }

        // Outputstream erstellen:
        try {
            stream_out = socket.getOutputStream();
            Log.d(LOG_TAG, "OutputStream erstellt");
        } catch (IOException e) {
            Log.e(LOG_TAG, "OutputStream Fehler: " + e.toString());
            is_connected = false;
        }

        // Inputstream erstellen
        try {
            stream_in = socket.getInputStream();
            Log.d(LOG_TAG, "InputStream erstellt");
        } catch (IOException e) {
            Log.e(LOG_TAG, "InputStream Fehler: " + e.toString());
            is_connected = false;
        }

        if (is_connected) {
            Toast.makeText(this, "Verbunden mit " + mac_adresse,
                    Toast.LENGTH_LONG).show();
            ((Button) findViewById(R.id.bt_verbinden))
                    .setBackgroundColor(Color.GREEN);
        } else {
            Toast.makeText(this, "Verbindungsfehler mit " + mac_adresse,
                    Toast.LENGTH_LONG).show();
            ((Button) findViewById(R.id.bt_verbinden))
                    .setBackgroundColor(Color.RED);
        }
    }

    public void senden() {
        String message = ((EditText) findViewById(R.id.text_eingabe)).getText()
                .toString();
        byte[] msgBuffer = message.getBytes();
        if (is_connected) {
            Log.d(LOG_TAG, "Sende Nachricht: " + message);
            try {
                stream_out.write(msgBuffer);
            } catch (IOException e) {
                Log.e(LOG_TAG,
                        "Bluetest: Exception beim Senden: " + e.toString());
            }
        }
    }

    public void trennen() {
        if (is_connected && stream_out != null) {
            is_connected = false;
            ((Button) findViewById(R.id.bt_verbinden))
                    .setBackgroundColor(Color.RED);
            Log.d(LOG_TAG, "Trennen: Beende Verbindung");
            try {
                stream_out.flush();
                socket.close();
            } catch (IOException e) {
                Log.e(LOG_TAG,
                        "Fehler beim beenden des Streams und schliessen des Sockets: "
                                + e.toString());
            }
        } else
            Log.d(LOG_TAG, "Trennen: Keine Verbindung zum beenden");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(LOG_TAG, "onDestroy. Trenne Verbindung, falls vorhanden");
        trennen();
    }

@Override
public void onClick(View v) {
    switch (v.getId()){
        case R.id.bt_on:
            bluetoothOn();
            break;
        case  R.id.bt_verbinden:
            verbinden();
            break;
        case  R.id.bt_liste:
            listeBTGeräte();
            break;
        case  R.id.bt_trennen:
            trennen();
            break;
        case R.id.bt_senden:
           senden();
            break;
    }
}

}

— geändert am 19.01.2019, 12:37:27

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 3

13.01.2019, 19:17:02 via Website

Ok, vielen Dank für deine schnelle Antwort, werde ich sofort ausprobieren.

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 618

13.01.2019, 19:21:29 via Website

Hier noch das Layout

<?xml version="1.0" encoding="utf-8"?>

xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/linearLayout">

<TextView
        android:id="@+id/text_uuid"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="UUID"
        app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent"/>

<TextView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="MAC Adresse des Bluetooth Devices:"
        android:id="@+id/textView" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/text_uuid"
        app:layout_constraintEnd_toEndOf="parent"/>

<EditText
        android:id="@+id/text_adresse"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:ems="10"
        android:text="00:11:12:14:00:35"
        app:layout_constraintTop_toTopOf="@+id/textView" app:layout_constraintStart_toStartOf="parent" android:layout_marginTop="18dp"
        app:layout_constraintEnd_toEndOf="parent">
</EditText>

<Button
        android:id="@+id/bt_verbinden"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Verbinden"
        app:layout_constraintStart_toStartOf="@+id/text_adresse" app:layout_constraintTop_toBottomOf="@+id/text_adresse"/>

<Button
        android:id="@+id/bt_trennen"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Trennen"
        app:layout_constraintStart_toStartOf="@+id/bt_verbinden" app:layout_constraintTop_toBottomOf="@+id/bt_verbinden"/>

<TextView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="Eingabe:"
        android:id="@+id/textView3" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/bt_verbinden"
        app:layout_constraintEnd_toEndOf="parent"/>

<EditText
        android:id="@+id/text_eingabe"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:ems="10"
        android:text="Test 123"
        app:layout_constraintStart_toStartOf="parent" android:layout_marginTop="8dp"
        app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@+id/bt_trennen">

    <requestFocus android:layout_height="wrap_content"
                  android:layout_width="wrap_content"/>
</EditText>

<Button
        android:id="@+id/bt_senden"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Senden"
        app:layout_constraintStart_toStartOf="@+id/text_eingabe" app:layout_constraintTop_toBottomOf="@+id/text_eingabe" android:layout_marginLeft="8dp"
        android:layout_marginStart="8dp"/>

<Button
        android:text="BT On"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:id="@+id/bt_on" app:layout_constraintStart_toEndOf="@+id/bt_trennen"
        android:layout_marginLeft="8dp" android:layout_marginStart="8dp" app:layout_constraintEnd_toStartOf="@+id/bt_liste" android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp" app:layout_constraintTop_toBottomOf="@+id/text_adresse"/>
<Button
        android:text="Liste"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:id="@+id/bt_liste"
        app:layout_constraintTop_toBottomOf="@+id/text_adresse" app:layout_constraintEnd_toEndOf="parent" android:layout_marginEnd="16dp" android:layout_marginRight="16dp"
/>
<ListView
        android:layout_width="368dp"
        android:layout_height="133dp" app:layout_constraintStart_toStartOf="parent" android:layout_marginLeft="8dp"
        android:layout_marginStart="8dp" app:layout_constraintEnd_toEndOf="parent" android:layout_marginEnd="8dp" android:layout_marginRight="8dp"
        android:layout_marginBottom="8dp" app:layout_constraintBottom_toBottomOf="parent"
        android:id="@+id/paired_listview" app:layout_constraintHorizontal_bias="0.0"
        android:layout_marginTop="8dp" app:layout_constraintTop_toBottomOf="@+id/bt_senden"/>

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 3

13.01.2019, 21:48:37 via Website

Habe es jetzt ausprobiert, es funktioniert SUPER!!!
Vielen Dank :-)

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 17

19.01.2019, 11:40:20 via Website

Hallo Joker,

Erstmal viel Dank für diese tolle Beschreibung.
Ich habe trotzdem massive Fehler und bekomme den Source mit Android 3.3 und einem Huawei Y6 nicht zum laufen. Mein Arduino Code mit dem HM-10 läuft auf einem iPhone App (selber mit Xcode10 geschrieben ) einwandfrei.
Ich habe folgende Ergänzungen gemacht:
In AbdroidManifest.xml habe die Permissions eingefügt:

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.INTERNET" />

In ActivityBlue.jave habe dir UUID angepasst:
// private UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
private UUID uuid = UUID.fromString("00001804-0000-1000-8000-00805F9B34FB");

Nach dem kompilieren bekomme ich diese ErrorCode:
Build: completed successfully 4 s 307 ms
Run build 4 s 260 ms
Load build 6 ms
Configure build 554 ms
Calculate task graph 59 ms
Run tasks 3 s 639 ms

Schreibe ich mit Debug 'app' die App in mein Smartphone erhalte ich diese Fehler:
D/BLueTest: Bluetest: OnCreate
D/HwRTBlurUtils: check blur style for HwToast-Toast, themeResId : 0x7f0c0005, context : com.bitwerk.ble_hm10.ActivityBlue@21ea1e2, Nhwext : 6, get Blur : disable with , android.graphics.drawable.NinePatchDrawable@fe82c0c
D/BLueTest: -----------> onCreate: Bluetooth Fehler: Deaktiviert oder nicht vorhanden
D/ActivityThread: add activity client record, r= ActivityRecord{bec75d1 token=android.os.BinderProxy@c535f {com.bitwerk.ble_hm10/com.bitwerk.ble_hm10.ActivityBlue}} token= android.os.BinderProxy@c535f
I/HwSecImmHelper: mSecurityInputMethodService is null
D/OpenGLRenderer: HWUI Binary is disabled

BT ON sagt in Toast.makeText 'BT ON'
LISTE gibt nichts aus
VERBINDEN klappt auch nicht.

Bin ein wenig verzweifelt da ich ein Android Studio Newbie bin.

Danke für eine kleine Hilfe.

— geändert am 19.01.2019, 12:54:46 durch Moderator

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 618

19.01.2019, 12:01:49 via Website

Hallo
Hast du den vorher auch die Geräte gepaart?
Wenn nicht ist es klar das nichts in der Liste steht .

Nach dem kompilieren bekomme ich diese ErrorCode:
Build: completed successfully 4 s 307 ms

Das ist keine Error Meldung sodern eine Erfolgs Meldumg

Das mit dem Toast könnte daran liegen das ich "this" und nicht "getApplicationContext()" benutzt habe.

sieht auch so aus als ob du den BT auf gem Gerät gar nicht ein geschaltet hast.

— geändert am 19.01.2019, 12:39:47

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 17

19.01.2019, 16:48:44 via Website

Hi

BT ist schon auf dem Gerät eingeschaltet sonst würde meine IOS App auch nicht funktionieren. Mit welchem AT Befehl soll ich denn pairen. Ich habe nichts gefunden? Wenn ich mein HM-10 Modul mit dem Android Phone suche finde ich es unter verfügbar. Lässt sich jedoch nicht verbinden.

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 17

19.01.2019, 17:04:55 via Website

Hi
habe mir gerade die nrf Connect App auf mein Smartphone geladen. Meine Hardware wird sofort gefunden und verbindet sich sofort mit meiner HM-10 hardware ohne pairing wenn ich Connect auswähle. Ich habe z.Zt mehrere BT Beacons im Einsatz die auch sauber gefunden und auch verbunden werden.

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 618

19.01.2019, 17:18:27 via Website

Ich meinte nicht dein IOS Gerät wir sprechen hier von Android.
Du willst eine Verbindung von einem Android Gerät zu einem Arduino Bluetooth aufbauen. Wo kommt da IOS vor?
Ich gehe mal von so etwassen aus wohin du Verbinden willst.
https://www.reichelt.de/arduino-4duino-wireless-modul-hc-05-4-pin-arduino-hc-05-4-p170173.html?PROVID=2788&gclid=CjwKCAiAsoviBRAoEiwATm8OYG2Tsc5UrJuXFjBiRnIdzReijUmNiBxY8kpShXnqsVI8H1uIAaJ26hoC-CkQAvD_BwE&&r=1

Nach den Fehlermeldungen scheite es mir schon so als ob das BT auf dem Android Handy nicht aktiv ist.
Paaren musst du die Geräte selber mit den Android eigenen Möglichkeiten. Ist im Quellcode nicht enthalten. BT einschalten, sichtbar machen, Gerät suchen Paaren Verbinden. So wie sonst auch mit anderen Geräten. Nun ist das Gerät deinem Android System bekannt und du kannst die Liste der Geräte auch in deiner App benutzen.

PS. Bemerken möchte ich noch das in dem Code nicht geprüft wird ob es gepaarte Geräte gibt.
Auch wird nicht geprüft ob das Handy überhaupt BT hat. Das ist nur ein funktions Beispiel, Keine komplette App. Am Anfang sind auch Links wo es eigentlich erklärt wird.

— geändert am 19.01.2019, 17:43:14

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 17

19.01.2019, 17:43:32 via Website

Ich meinte auch nur das meine BT-Hardware mit der IOS App einwandfrei funktioniert. Wenn das BT auf meinem Android Handy nicht eingeschaltet wäre würde auch nrfConnect nicht funktionieren. Oder?
Der Link oben zeigt übrigens ein HC-05-4 und kein HM-10. Ich bezweifle das HC-05 BLE unterstützt. Ich setze folgendes Modul ein:
DSD TECH HM-10-Bluetooth-40-BLE-Arduino-CC2541-iOS-Android-Master-Slave-Modul
Das unterstützt in jedenfalls BT 4.0 BLE.
Hast Du nrfConnect oder DSD TECH Bluetooth im Einsatz? Dann könntest Du sehen ob Dein Modul BLE fähig ist. Ich befürchte Dein Modul wird nicht mit einem HM-10 zusammen arbeiten.

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 618

19.01.2019, 17:53:38 via Website

Der Link war nur ein schnelles Beispiel um dir zu zeigen über welche Art von Modul wir sprechen. Wollte dir damit nur zeigen das IOS hier keine Rolle Spielt.

Vielmehr glaube ich das es an der UUID liegt. Die in meinen Code ist eine Universelle Serielle Schnittstelle über die wir uns Unterhalten. RFComm. Und dies sollten alle dieser Module Beherrschen.

Wenn das BT auf meinem Android Handy nicht eingeschaltet wäre würde auch nrfConnect nicht funktionieren.

woher willst du das wissen wenn du die Geräte nicht mal gepaart hast.

ohne Code kommen wir hier sicherlich nicht weiter.

— geändert am 19.01.2019, 17:58:38

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 618

19.01.2019, 18:10:58 via Website

deine Bt Klasse

sind die geräte wiklich gepaart? wenn du die Mac Adresse vom Modul weist kannst du die auch eingeben und verbinden. ohne gepaart zu sein.

— geändert am 19.01.2019, 18:25:36

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 17

19.01.2019, 18:26:49 via Website

Hi Jokel,
ich fürchte ich habe einen Fehler gemacht. Ich habe lediglich Deine beiden Sources in meinem Project übernommen. Die App wird auf meinem Android Handy gestartet aber ich gehe mal davon aus das nichts arbeitet. Denn eine Bt Class find ich nicht. Wo sollt die den stehen? Habe ich ein Modul übersehen? Wie gesagt ich bin absoluter Android Studio Neuling.
Danke für Deine Geduld.

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 618

19.01.2019, 18:41:14 via Website

Du hast doch bestimmt ein neues Projekt erstellt. Dann hast du eine Klasse die MainActivity heißt.
In meinen Beispiel habe ich sie „ActivityBlue“ Genannt.
Du müsstest meinen Code in die MainActivity packen aber der Name der Klasse sollte MainActivity Bleiben . Denn die wird als erstes gestartet. Und ist im Manifest auch eingetragen. Meine Beispiel Klasse nicht. kann also nicht starten.

Vielmehr glaube ich das du Dir erst mal die Grundlagen von Android Programmierung und Java aneignen solltest . Wenn du das könntest würdest du den Code auch verstehen und könntest damit umgehen. Das muss ich hier mal sagen.
Glaube du suchst mal nach Grundlagen Android Programmierung im Netz.

Wenn du willst Zeige deine MainActivity

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 17

19.01.2019, 18:47:27 via Website

Kein Problem. Hier ist der Code.
package com.bitwerk.ble_hm10;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Set;
import java.util.UUID;

public class ActivityBlue extends AppCompatActivity implements View.OnClickListener{

// UUID fuer Kommunikation mit Seriellen Modulen
private UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

// private UUID uuid = UUID.fromString("00001804-0000-1000-8000-00805F9B34FB");
// 00001804-0000-1000-8000-00805f9b34fb
/*
public static final UUID TX_POWER_UUID = UUID.fromString("00001804-0000-1000-8000-00805f9b34fb");
public static final UUID TX_POWER_LEVEL_UUID = UUID.fromString("00002a07-0000-1000-8000-00805f9b34fb");
public static final UUID FIRMWARE_REVISON_UUID = UUID.fromString("00002a26-0000-1000-8000-00805f9b34fb");
public static final UUID DIS_UUID = UUID.fromString("0000180a-0000-1000-8000-00805f9b34fb");

//public static final UUID CCCD = UUID.fromString("00002902-0000-1000-8000-00805f9b34fb");
public   static final UUID CCCD = UUID.fromString("00002902-0000-1000-8000-00805f9b34fb");
//public static final UUID RX_SERVICE_UUID = UUID.fromString("6e400001-b5a3-f393-e0a9-e50e24dcca9e");
public   static final UUID RX_SERVICE_UUID = UUID.fromString("0000ffe0-0000-1000-8000-00805f9b34fb");
//public static final UUID RX_CHAR_UUID = UUID.fromString("6e400002-b5a3-f393-e0a9-e50e24dcca9e");
public   static final UUID RX_CHAR_UUID = UUID.fromString("0000ffe1-0000-1000-8000-00805f9b34fb");
//public static final UUID TX_CHAR_UUID = UUID.fromString("6e400003-b5a3-f393-e0a9-e50e24dcca9e");
public   static final UUID TX_CHAR_UUID = UUID.fromString("0000ffe1-0000-1000-8000-00805f9b34fb");

*/


private static final String LOG_TAG = "BLueTest";


private BluetoothAdapter adapter = null;
private BluetoothSocket socket = null;
private OutputStream stream_out = null;
private InputStream stream_in = null;
private boolean is_connected = false;
private Set<BluetoothDevice> pairedDevices;
private ArrayList<BluetoothDevice> pairedListe;
private ListView lv;
private static String mac_adresse; // MAC Adresse des Bluetooth Adapters


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_blue);

    Log.d(LOG_TAG, "Bluetest: OnCreate");

    ((Button)findViewById(R.id.bt_on)).setOnClickListener(this);
    ((Button)findViewById(R.id.bt_trennen)).setOnClickListener(this);
    ((Button)findViewById(R.id.bt_verbinden)).setOnClickListener(this);
    ((Button)findViewById(R.id.bt_liste)).setOnClickListener(this);
    ((Button)findViewById(R.id.bt_senden)).setOnClickListener(this);


    ((TextView) findViewById(R.id.text_uuid)).setText("UUID: " + uuid);
    pairedListe = new ArrayList<>();

    // Verbindung mit Bluetooth-Adapter herstellen
    adapter = BluetoothAdapter.getDefaultAdapter();
    if (adapter.isEnabled()) {
        Toast.makeText(this, "Bitte Bluetooth aktivieren oder auf On Klicken", Toast.LENGTH_LONG).show();
        Log.d(LOG_TAG, "-----------> onCreate: Bluetooth Fehler: Deaktiviert oder nicht vorhanden");
    } else {
        Log.d(LOG_TAG, "-----------> onCreate: Bluetooth-Adapter ist bereit");
    }

    lv = (ListView)findViewById(R.id.paired_listview);
    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            BluetoothDevice mDevice = pairedListe.get(position);
            mac_adresse = mDevice.getAddress();
            ((EditText) findViewById(R.id.text_adresse)).setText(mac_adresse);

// ((EditText) findViewById(R.id.text_adresse)).setText("78:A5:04:3A:6E:05");
}
});
}

public  void bluetoothOn(){
    if (!adapter.isEnabled()) {
        Intent turnOn = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(turnOn, 0);
        adapter = BluetoothAdapter.getDefaultAdapter();
        Toast.makeText(getApplicationContext(), "Bluetooth ist On",Toast.LENGTH_LONG).show();
        Log.d(LOG_TAG, "onCreate: Bluetooth-Adapter ist bereit");

    } else {
        Toast.makeText(this, "BT On", Toast.LENGTH_LONG).show();
        Log.d(LOG_TAG,"onCreate: Bluetooth Fehler: Deaktiviert oder nicht vorhanden");
    }
}

public void listeBTGeräte(){

    pairedDevices = adapter.getBondedDevices();
    ArrayList list = new ArrayList();

    for(BluetoothDevice bt : pairedDevices) {
        list.add(bt.getName());
        pairedListe.add(bt);
    }


    Toast.makeText(this, "List Paired Devices",Toast.LENGTH_SHORT).show();
    final ArrayAdapter adapter = new  ArrayAdapter(this,android.R.layout.simple_list_item_1, list);
    lv.setAdapter(adapter);

}

public void verbinden() {


    mac_adresse = ((EditText) findViewById(R.id.text_adresse)).getText().toString();

    //mac_adresse = "78:A5:04:3A:6E:05";

    Log.d(LOG_TAG, "Verbinde mit ---------------------------------------------------------------------");
    Log.d(LOG_TAG, "Verbinde mit " + mac_adresse);
    Log.d(LOG_TAG, "Verbinde mit ---------------------------------------------------------------------");

   BluetoothDevice remote_device = adapter.getRemoteDevice(mac_adresse);



    // Socket erstellen
    try {
        socket = remote_device
                .createInsecureRfcommSocketToServiceRecord(uuid);
        Log.d(LOG_TAG, "Socket erstellt");
    } catch (Exception e) {
        Log.e(LOG_TAG, "Socket Erstellung fehlgeschlagen: " + e.toString());
    }

    adapter.cancelDiscovery();

    // Socket verbinden
    try {
        socket.connect();
        Log.d(LOG_TAG, "Socket verbunden");
        is_connected = true;
    } catch (IOException e) {
        is_connected = false;
        Log.e(LOG_TAG, "Socket kann nicht verbinden: " + e.toString());
    }

    // Socket beenden, falls nicht verbunden werden konnte
    if (!is_connected) {
        try {
            socket.close();
        } catch (Exception e) {
            Log.e(LOG_TAG,
                    "Socket kann nicht beendet werden: " + e.toString());
        }
    }

    // Outputstream erstellen:
    try {
        stream_out = socket.getOutputStream();
        Log.d(LOG_TAG, "OutputStream erstellt");
    } catch (IOException e) {
        Log.e(LOG_TAG, "OutputStream Fehler: " + e.toString());
        is_connected = false;
    }

    // Inputstream erstellen
    try {
        stream_in = socket.getInputStream();
        Log.d(LOG_TAG, "InputStream erstellt");
    } catch (IOException e) {
        Log.e(LOG_TAG, "InputStream Fehler: " + e.toString());
        is_connected = false;
    }

    if (is_connected) {
        Toast.makeText(this, "Verbunden mit " + mac_adresse,
                Toast.LENGTH_LONG).show();
        ((Button) findViewById(R.id.bt_verbinden))
                .setBackgroundColor(Color.GREEN);
    } else {
        Toast.makeText(this, "Verbindungsfehler mit " + mac_adresse,
                Toast.LENGTH_LONG).show();
        ((Button) findViewById(R.id.bt_verbinden))
                .setBackgroundColor(Color.RED);
    }
}

public void senden() {
    String message = ((EditText) findViewById(R.id.text_eingabe)).getText()
            .toString();
    byte[] msgBuffer = message.getBytes();
    if (is_connected) {
        Log.d(LOG_TAG, "Sende Nachricht: " + message);
        try {
            stream_out.write(msgBuffer);
        } catch (IOException e) {
            Log.e(LOG_TAG,
                    "Bluetest: Exception beim Senden: " + e.toString());
        }
    }
}

public void trennen() {
    if (is_connected && stream_out != null) {
        is_connected = false;
        ((Button) findViewById(R.id.bt_verbinden))
                .setBackgroundColor(Color.RED);
        Log.d(LOG_TAG, "Trennen: Beende Verbindung");
        try {
            stream_out.flush();
            socket.close();
        } catch (IOException e) {
            Log.e(LOG_TAG,
                    "Fehler beim beenden des Streams und schliessen des Sockets: "
                            + e.toString());
        }
    } else
        Log.d(LOG_TAG, "Trennen: Keine Verbindung zum beenden");
}

@Override
protected void onDestroy() {
    super.onDestroy();
    Log.d(LOG_TAG, "onDestroy. Trenne Verbindung, falls vorhanden");
    trennen();
}

@Override
public void onClick(View v) {
    switch (v.getId()){
        case R.id.bt_on:
            bluetoothOn();
            break;
        case  R.id.bt_verbinden:
            verbinden();
            break;
        case  R.id.bt_liste:
            listeBTGeräte();
            break;
        case  R.id.bt_trennen:
            trennen();
            break;
        case R.id.bt_senden:
            senden();
            break;
    }
}

}

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 618

19.01.2019, 19:01:15 via Website

Mal noch eine Frage wird die Activity überhaupt aufgerufen. Siehst du das Layout?
Wievielte Activitys hast du ?
Zeige mal dein Manifest
Zum code später

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 17

19.01.2019, 19:19:36 via Website

Okay.

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.INTERNET" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".ActivityBlue">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

Sicher sehe ich das Layout. Alle Widgets sind sichtbar.
Alles kann ich nicht schicken da diese Meldung ständig erscheint:
Bitte überprüfe Deinen Beitrag noch einmal, es sind Fehler aufgetreten.

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 17

19.01.2019, 19:21:12 via Website

Diese Zeilen kann ich nicht mit http schicken:

package="com.bitwerk.ble_hm10">

Hilfreich?
Diskutiere mit!
Empfohlene Artikel