Android Bluetooth Gerät ansprechen

  • Antworten:5
michael
  • Forum-Beiträge: 4

01.05.2016, 16:52:39 via Website

Hallo,

habe vor kurzem mit der Entwicklung von Android apps angefangen und habe mir gleich ein ganz großes Projekt vorgenommen, und zwar wollte ich das thema bluetooth angehen und zwar per bluetooth Fitnessarmbänder auslesen. Ich habe ein Fitbit charge hr und wolllte davon die Daten auslesen bekomme es aber irgendwie nicht hin.

Hier mein Quellcode:

import android.annotation.SuppressLint;

import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.EditText;
import android.widget.Button;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Set;
import java.util.UUID;

@SuppressLint("CutPasteId")
public class MainActivity extends Activity {
TextView myLabel;
EditText myTextbox;
BluetoothAdapter mBluetoothAdapter;
BluetoothSocket mmSocket;
BluetoothDevice mmDevice;
OutputStream mmOutputStream;
InputStream mmInputStream;
Thread workerThread;
byte[] readBuffer;
int readBufferPosition;
int counter;
volatile boolean stopWorker;

Button openButton;
Button sendButton;
Button closeButton;

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

    openButton = (Button) findViewById(R.id.open);
    sendButton = (Button) findViewById(R.id.send);
    closeButton = (Button) findViewById(R.id.close);
    myLabel = (TextView) findViewById(R.id.label);
    myTextbox = (EditText) findViewById(R.id.entry);
    // Open Button
    openButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            try {
                findBT();
                openBT();
            } catch (IOException ex) {
            }
        }
    });

    // Send Button
    sendButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            try {
                sendData();
            } catch (IOException ex) {
            }
        }
    });

    // Close button
    closeButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            try {
                closeBT();
            } catch (IOException ex) {
            }
        }
    });
}

void findBT() {
    mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    if (mBluetoothAdapter == null) {
        myLabel.setText("No bluetooth adapter available");
    }

    if (!mBluetoothAdapter.isEnabled()) {
        Intent enableBluetooth = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(enableBluetooth, 0);
    }

    Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
    if (pairedDevices.size() > 0) {
        for (BluetoothDevice device : pairedDevices) {
            if (device.getName().equals("JD's Armband")) {
                mmDevice = device;
                break;
            }
        }
    }
    myLabel.setText("Bluetooth Device Found");
}

void openBT() throws IOException {
    myLabel.setText("openBT");

    UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); // Standard
                                                                            // SerialPortService
                                                                            // ID
    mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid);
    mmSocket.connect();
    mmOutputStream = mmSocket.getOutputStream();
    mmInputStream = mmSocket.getInputStream();
    myLabel.setText("listen");

    beginListenForData();

    // myLabel.setText("Bluetooth Opened");
}

void beginListenForData() {
    final Handler handler = new Handler();
    final byte delimiter = 10; // This is the ASCII code for a newline
                                // character
    myLabel.setText("1");

    stopWorker = false;
    readBufferPosition = 0;
    readBuffer = new byte[1024];
    workerThread = new Thread(new Runnable() {
        public void run() {
            myLabel.setText("2");
            while (!Thread.currentThread().isInterrupted() && !stopWorker) {
                try {
                    int bytesAvailable = mmInputStream.available();
                    myLabel.setText("3");
                    if (bytesAvailable > 0) {
                        byte[] packetBytes = new byte[bytesAvailable];
                        mmInputStream.read(packetBytes);
                        myLabel.setText("listen");

                        for (int i = 0; i < bytesAvailable; i++) {
                            byte b = packetBytes[i];

                            if (b == delimiter) {
                                byte[] encodedBytes = new byte[readBufferPosition];
                                System.arraycopy(readBuffer, 0, encodedBytes, 0, encodedBytes.length);
                                final String data = new String(encodedBytes, "US-ASCII");
                                readBufferPosition = 0;

                                handler.post(new Runnable() {
                                    public void run() {
                                        myLabel.setText(data);

                                    }
                                });
                            } else {
                                readBuffer[readBufferPosition++] = b;
                            }
                        }
                    }
                } catch (IOException ex) {
                    stopWorker = true;
                }
            }
        }
    });

    workerThread.start();
}

void sendData() throws IOException
{
    String msg = myTextbox.getText().toString();
    msg += "\n";
    mmOutputStream.write(msg.getBytes());
    myLabel.setText("Data Sent");
}


void closeBT() throws IOException {
    stopWorker = true;
    mmOutputStream.close();
    mmInputStream.close();
    mmSocket.close();
    myLabel.setText("Bluetooth Closed");
}

meinem Verstädnis nach sollte dieser dann die daten auf dem Label ausgeben da kommt aber leider nicht

— geändert am 01.05.2016, 17:03:09

Antworten
Klaus
  • Blogger
  • Forum-Beiträge: 19.172

01.05.2016, 16:53:04 via App

Hallo michael!

Herzlich Willkommen hier bei uns im Forum. :)

Bitte beachte, dass Threads mit nicht aussagekräftigem Titel bei uns üblicherweise den Regeln entsprechend entfernt werden. Ich bitte dich daher, deinen Threadtitel innerhalb der nächsten 24 Stunden, spätestens jedoch bei deinem nächsten Besuch noch etwas aussagekräftiger zu gestalten (Hierfür einfach unter deinem ersten Beitrag auf 'bearbeiten' klicken, dann kannst du oben noch mal den Titel anpassen)

Danke :)

| LG Klaus |
| Google Nexus 6P - Dirty Unicorns | Google Nexus 6 - Dirty Unicorns |
| Das AndroidPITiden-Buch | Die Androiden-Toolbox | AndroidPIT-Regeln |

Antworten
michael
  • Forum-Beiträge: 4

03.05.2016, 16:09:46 via Website

keiner der mir helfen könnte?

Antworten
Fabian Simon
  • Forum-Beiträge: 359

03.05.2016, 16:40:26 via Website

Dann beschreibe dochmal ausführlicher wo ein Problem ist.
Vielleicht hilft dir dann jemand !
Kannst du keine Verbindung aufbauen.
etc.
Auch finde ich persönlich es immer unhöflich wenn man seine ganze klasse postet ohne kommentare und ohne vorqualifizierung wo sich im Programmcode das Problem befindet !

Antworten
michael
  • Forum-Beiträge: 4

03.05.2016, 19:55:13 via Website

doch eine Verbindung kommt zustande ich bekomme aber nicht die daten vom armband in dem Label angezeigt in diesem Stück code

 if (b == delimiter) {
                            byte[] encodedBytes = new byte[readBufferPosition];
                            System.arraycopy(readBuffer, 0, encodedBytes, 0, encodedBytes.length);
                            final String data = new String(encodedBytes, "US-ASCII");
                            readBufferPosition = 0;

                            handler.post(new Runnable() {
                                public void run() {
                                    myLabel.setText(data);

                                }
                            });
                        } else {
                            readBuffer[readBufferPosition++] = b;
                        }

Antworten
Fabian Simon
  • Forum-Beiträge: 359

04.05.2016, 13:18:28 via Website

So dein Problem kann ich jetzt so spontan nicht lösen aber dir helfen es zu finden.

Nr.1 trenne deinen Code besser !
mindestens MVC gerecht....
du machst so viel hintereinander seriell das man den Überblick verliert und ich bin mir sicher, das du den auch verloren hast oder zumindest verlieren wirst...

bei Zeiten kann ich dir mal meine lösung zeigen ....

Antworten