web-dev-qa-db-fra.com

Comment recevoir des données série en utilisant Android bluetooth

Je suis nouveau sur Android. Je conçois une application Android qui reçoit des données série d'un périphérique matériel via Bluetooth. Je travaille sur Htc desire S. J'ai utilisé l'exemple de code de conversation Bluetooth pour recevoir des données. Mais les données reçues sont Quelqu'un peut-il me fournir un autre exemple de code pour recevoir une grande quantité de données via Bluetooth et le sauvegarder dans un fichier.

35
Khushboo

essayez ce code:

Activité:

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");
}
}

ET voici la mise en page:

<?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" />

Here for Manifest: ajouter à l'application

// 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

J'ai essayé cela pour transmettre des données continues (valeurs flottantes converties en chaîne) de mon PC (MATLAB) à mon téléphone. Mais mon application interprète toujours mal le délimiteur '\ n' et les données sont toujours tronquées. J'ai donc pris le caractère 'N' comme séparateur plutôt que '\ n' (il pourrait s'agir de tout caractère ne faisant pas partie de vos données) et j'ai obtenu une meilleure vitesse de transmission. J'ai donné un délai de 0,1 seconde. entre la transmission d'échantillons successifs - avec plus de 99% d'intégrité des données sur le récepteur, c'est-à-dire sur 2 000 échantillons (valeurs flottantes) que j'ai transmis, seuls 10 n'ont pas été décodés correctement dans mon application.

Ma réponse est la suivante: Choisissez un délimiteur autre que "\ r" ou "\ n", car ils créent davantage de problèmes pour la transmission de données en temps réel par rapport à d'autres caractères comme celui que j'ai utilisé. Si nous travaillons plus, peut-être pourrions-nous augmenter encore plus le taux de transmission. J'espère que ma réponse aide quelqu'un!

5
nrenga

Le problème avec la connexion null est lié à la fonction findBT (). vous devez modifier le nom du périphérique de "MattsBlueTooth" en votre nom de périphérique, ainsi que confirmer l'UUID de votre service/périphérique. Utilisez quelque chose comme l'application BLEScanner pour configurer à la fois sur Android.

4
Michael Sorensen

Jetez un coup d'œil à l'incroyable classe série Bluetooth dotée de la capacité onResume() qui m'a tant aidé. J'espère que ça aide ;)

1
Yashar Aliabbasi