wake-up-neo.net

So empfangen Sie serielle Daten mit Android bluetooth

Ich bin neu in Android. Ich entwerfe eine Android Anwendung, die serielle Daten von einem Hardwaregerät über Bluetooth empfängt. Ich arbeite an Htc desire S. Ich habe den Beispiel-Bluetooth-Chatcode zum Empfangen von Daten verwendet. Die empfangenen Daten sind jedoch Es fehlen einige Werte. Kann mir jemand einen anderen Beispielcode zur Verfügung stellen, um große Datenmengen über Bluetooth zu empfangen und in einer Datei zu speichern.

35
Khushboo

versuchen Sie diesen Code:

Aktivität:

package Android.Arduino.Bluetooth;
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.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;

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;

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

    Button openButton = (Button)findViewById(R.id.open);
    Button sendButton = (Button)findViewById(R.id.send);
    Button 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("MattsBlueTooth")) 
            {
                mmDevice = device;
                break;
            }
        }
    }
    myLabel.setText("Bluetooth Device Found");
}

void openBT() throws IOException
{
    UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); //Standard SerialPortService ID
    mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid);        
    mmSocket.connect();
    mmOutputStream = mmSocket.getOutputStream();
    mmInputStream = mmSocket.getInputStream();

    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

    stopWorker = false;
    readBufferPosition = 0;
    readBuffer = new byte[1024];
    workerThread = new Thread(new Runnable()
    {
        public void run()
        {                
           while(!Thread.currentThread().isInterrupted() && !stopWorker)
           {
                try 
                {
                    int bytesAvailable = mmInputStream.available();                        
                    if(bytesAvailable > 0)
                    {
                        byte[] packetBytes = new byte[bytesAvailable];
                        mmInputStream.read(packetBytes);
                        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");
}
}

UND hier das Layout:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
tools:ignore="TextFields,HardcodedText" >

<TextView
    Android:id="@+id/label"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:text="Type here:" />

<EditText
    Android:id="@+id/entry"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:layout_below="@id/label"
    Android:background="@Android:drawable/editbox_background" />

<Button
    Android:id="@+id/open"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_alignParentRight="true"
    Android:layout_below="@id/entry"
    Android:layout_marginLeft="10dip"
    Android:text="Open" />

<Button
    Android:id="@+id/send"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_alignTop="@id/open"
    Android:layout_toLeftOf="@id/open"
    Android:text="Send" />

<Button
    Android:id="@+id/close"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_alignTop="@id/send"
    Android:layout_toLeftOf="@id/send"
    Android:text="Close" />

Hier für Manifest: zur Anwendung hinzufügen

// permission must be enabled complete
<manifest ....>

    <uses-permission Android:name="Android.permission.BLUETOOTH_ADMIN" />
    <uses-permission Android:name="Android.permission.BLUETOOTH" />
    <application>


    </application>
</manifest>
77
Majdi_la

Ich habe dies ausprobiert, um fortlaufende Daten (in Zeichenfolgen konvertierte Gleitkommawerte) von meinem PC (MATLAB) auf mein Telefon zu übertragen. Trotzdem interpretiert meine App das Trennzeichen "\ n" falsch und die Daten werden unleserlich. Daher habe ich das Zeichen 'N' als Trennzeichen und nicht '\ n' verwendet (es kann sich um ein beliebiges Zeichen handeln, das nicht in Ihren Daten vorkommt) und eine bessere Übertragungsgeschwindigkeit erzielt - ich habe nur eine Verzögerung von 0,1 Sekunden angegeben Zwischen dem Senden aufeinanderfolgender Samples - mit mehr als 99% Datenintegrität beim Empfänger, dh von 2000 Samples (Float-Werten), die ich gesendet habe, wurden nur 10 in meiner Anwendung nicht richtig decodiert.

Meine Antwort lautet kurz: Wählen Sie ein anderes Trennzeichen als '\ r' oder '\ n', da dies im Vergleich zu anderen Zeichen, wie dem von mir verwendeten, mehr Probleme bei der Echtzeit-Datenübertragung verursacht. Wenn wir mehr arbeiten, können wir möglicherweise die Übertragungsrate noch weiter erhöhen. Ich hoffe meine Antwort hilft jemandem!

5
nrenga

Das Problem mit der Nullverbindung hängt mit der Funktion findBT () zusammen. Sie müssen den Gerätenamen von "MattsBlueTooth" in Ihren Gerätenamen ändern und die UUID für Ihren Dienst/Ihr Gerät bestätigen. Verwenden Sie so etwas wie die BLEScanner-App, um beide auf Android zu bestätigen.

4

Schauen Sie sich die unglaubliche Bluetooth Serial Klasse an, die die Fähigkeit onResume() hat, die mir so sehr geholfen hat. Ich hoffe das hilft ;)

1