Partage
  • Partager sur Facebook
  • Partager sur Twitter

Bluetooth sur android Studio

Sujet résolu
5 septembre 2020 à 23:29:23

Bonsoir,

j'ai essayé plusieurs codes java pour Android Studio afin de transmettre des données par bluetooth. J'ai trouvé plusieurs tutoriels, plusieurs vidéo, mais à chaque fois, ça oscille entre plantage propre et net, et arrêt du tutoriel AVANT de transmettre les dites données. Je ne comprends clairement pas tout, et j'aurais besoin d'un guide étape par étape de A(mise en place du bluetooth) à Z(transmission et réception des données côté arduino).

Le seul code s'approchant de cet objectif que j'ai trouvé est le suivant:

package "mon package"

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ToggleButton;

import android.annotation.SuppressLint;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

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


import com."monappli".R;

public class Bluetooth extends AppCompatActivity {

    public static final int REQUEST_ENABLE_BT=1;
    ListView lv_paired_devices;
    Set<BluetoothDevice> set_pairedDevices;
    ArrayAdapter adapter_paired_devices;
    BluetoothAdapter bluetoothAdapter;
    public static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
    public static final int MESSAGE_READ=0;
    public static final int MESSAGE_WRITE=1;
    public static final int CONNECTING=2;
    public static final int CONNECTED=3;
    public static final int NO_SOCKET_FOUND=4;


    String bluetooth_message="00";




    @SuppressLint("HandlerLeak")
    Handler mHandler=new Handler()
    {
        @Override
        public void handleMessage(Message msg_type) {

            super.handleMessage(msg_type);

            switch (msg_type.what){
                case MESSAGE_READ:

                    byte[] readbuf=(byte[])msg_type.obj;
                    String string_recieved=new String(readbuf);

                    //do some task based on recieved string

                    break;
                case MESSAGE_WRITE:
                    if(msg_type.obj!=null){
                        ConnectedThread connectedThread=new ConnectedThread((BluetoothSocket)msg_type.obj);
                        connectedThread.write(bluetooth_message.getBytes());
                        Log.d("donneesEnvoyees2", bluetooth_message);

                    }
                    break;

                case CONNECTED:
                    Toast.makeText(getApplicationContext(),"Connected",Toast.LENGTH_SHORT).show();
                    break;

                case CONNECTING:
                    Toast.makeText(getApplicationContext(),"Connecting...",Toast.LENGTH_SHORT).show();
                    break;

                case NO_SOCKET_FOUND:
                    Toast.makeText(getApplicationContext(),"No socket found",Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    };

    //Declaration des variables d'interraction utilisateur.

    private Button mFerCo;
    private Button mEnvDo;
    private Button mRetour;

    //Declaration des variables de dialogue application.
    public static final String TABLEAU_BlUETOOTH =  "Tableau_Thermostat";

    //Declaration des variables logiques.
    private int[] tab = {0,0};
    int test = 0;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bluetooth);

        //Assignation des boutons et textes.
        mFerCo = (Button)findViewById(R.id.boutonFermerConnection);
        mEnvDo = (Button)findViewById(R.id.boutonEnvoyerDonnées);
        mRetour = (Button)findViewById(R.id.RetourBluetooth);

        initialize_layout();
        initialize_bluetooth();
        start_accepting_connection();
        initialize_clicks();

        mFerCo.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        });

        mEnvDo.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (test == 0){
                    test = 1;
                    bluetooth_message="a";
                    Message mNouvMessage = Message.obtain();
                    mNouvMessage.what=1;
                    mNouvMessage.obj=0;
                    mHandler.handleMessage(mNouvMessage);
                    Log.d("donneesEnvoyees", bluetooth_message);
                }
                else if(test == 1){
                    test = 0;
                    bluetooth_message="b";
                    Message mNouvMessage = Message.obtain();
                    mNouvMessage.what=1;
                    mNouvMessage.obj=0;
                    mHandler.handleMessage(mNouvMessage);
                    Log.d("donneesEnvoyees", bluetooth_message);
                }

            }
        });

        mRetour.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.putExtra(TABLEAU_BlUETOOTH, tab);
                setResult(RESULT_OK, intent);
                finish();
            }
        });

    }

    public void start_accepting_connection()
    {
        //call this on button click as suited by you
        AcceptThread acceptThread = new AcceptThread();
        acceptThread.start();
        Toast.makeText(getApplicationContext(),"accepting",Toast.LENGTH_SHORT).show();
    }

    public void initialize_clicks()
    {
        lv_paired_devices.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id)
            {
                Object[] objects = set_pairedDevices.toArray();
                BluetoothDevice device = (BluetoothDevice) objects[position];

                ConnectThread connectThread = new ConnectThread(device);
                connectThread.start();

                Toast.makeText(getApplicationContext(),"device choosen "+device.getName(),Toast.LENGTH_SHORT).show();
            }
        });
    }

    public void initialize_layout()
    {
        lv_paired_devices = (ListView)findViewById(R.id.lv_paired_devices);
        adapter_paired_devices = new ArrayAdapter(getApplicationContext(),R.layout.support_simple_spinner_dropdown_item);
        lv_paired_devices.setAdapter(adapter_paired_devices);
    }

    public void initialize_bluetooth()
    {
        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        if (bluetoothAdapter == null) {
            // Device doesn't support Bluetooth
            Toast.makeText(getApplicationContext(),"Your Device doesn't support bluetooth. you can play as Single player",Toast.LENGTH_SHORT).show();
            finish();
        }

        //Add these permisions before


        if (!bluetoothAdapter.isEnabled()) {
            Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
        }

        else {
            set_pairedDevices = bluetoothAdapter.getBondedDevices();

            if (set_pairedDevices.size() > 0) {

                for (BluetoothDevice device : set_pairedDevices) {
                    String deviceName = device.getName();
                    String deviceHardwareAddress = device.getAddress(); // MAC address

                    adapter_paired_devices.add(device.getName() + "\n" + device.getAddress());
                }
            }
        }
    }


    public class AcceptThread extends Thread
    {
        private final BluetoothServerSocket serverSocket;

        public AcceptThread() {
            BluetoothServerSocket tmp = null;
            try {
                // MY_UUID is the app's UUID string, also used by the client code
                tmp = bluetoothAdapter.listenUsingRfcommWithServiceRecord("NAME",MY_UUID);
            } catch (IOException e) { }
            serverSocket = tmp;
        }

        public void run() {
            BluetoothSocket socket = null;
            // Keep listening until exception occurs or a socket is returned
            while (true) {
                try {
                    socket = serverSocket.accept();
                } catch (IOException e) {
                    break;
                }

                // If a connection was accepted
                if (socket != null)
                {
                    // Do work to manage the connection (in a separate thread)
                    mHandler.obtainMessage(CONNECTED).sendToTarget();
                }
            }
        }
    }


    private class ConnectThread extends Thread {
        private final BluetoothSocket mmSocket;
        private final BluetoothDevice mmDevice;

        public ConnectThread(BluetoothDevice device) {
            // Use a temporary object that is later assigned to mmSocket,
            // because mmSocket is final
            BluetoothSocket tmp = null;
            mmDevice = device;

            // Get a BluetoothSocket to connect with the given BluetoothDevice
            try {
                // MY_UUID is the app's UUID string, also used by the server code
                tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
            } catch (IOException e) { }
            mmSocket = tmp;
        }

        public void run() {
            // Cancel discovery because it will slow down the connection
            bluetoothAdapter.cancelDiscovery();

            try {
                // Connect the device through the socket. This will block
                // until it succeeds or throws an exception
                mHandler.obtainMessage(CONNECTING).sendToTarget();

                mmSocket.connect();
            } catch (IOException connectException) {
                // Unable to connect; close the socket and get out
                try {
                    mmSocket.close();
                } catch (IOException closeException) { }
                return;
            }

            // Do work to manage the connection (in a separate thread)
//            bluetooth_message = "Initial message"
//            mHandler.obtainMessage(MESSAGE_WRITE,mmSocket).sendToTarget();
        }

        /** Will cancel an in-progress connection, and close the socket */
        public void cancel() {
            try {
                mmSocket.close();
            } catch (IOException e) { }
        }
    }
    private class ConnectedThread extends Thread {

        private final BluetoothSocket mmSocket;
        private final InputStream mmInStream;
        private final OutputStream mmOutStream;

        public ConnectedThread(BluetoothSocket socket) {
            mmSocket = socket;
            InputStream tmpIn = null;
            OutputStream tmpOut = null;

            // Get the input and output streams, using temp objects because
            // member streams are final
            try {
                tmpIn = socket.getInputStream();
                tmpOut = socket.getOutputStream();
            } catch (IOException e) { }

            mmInStream = tmpIn;
            mmOutStream = tmpOut;
        }

        public void run() {
            byte[] buffer = new byte[2];  // buffer store for the stream
            int bytes; // bytes returned from read()

            // Keep listening to the InputStream until an exception occurs
            while (true) {
                try {
                    // Read from the InputStream
                    bytes = mmInStream.read(buffer);
                    // Send the obtained bytes to the UI activity
                    mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer).sendToTarget();

                } catch (IOException e) {
                    break;
                }
            }
        }

        /* Call this from the main activity to send data to the remote device */
        public void write(byte[] bytes) {
            try {
                mmOutStream.write(bytes);
                Log.d("donneesEnvoyees3", bluetooth_message);
            } catch (IOException e) { }
        }

        /* Call this from the main activity to shutdown the connection */
        public void cancel() {
            try {
                mmSocket.close();
            } catch (IOException e) { }
        }
    }


}

Le principal problème est ici que je ne maîtrise pas du tout les handler et les messages. Apparement je n'arrive pas à dire au code d'écrier les infos. J'ai commencé à débuguer, mais je bloque à la dernière ligne droite:

case MESSAGE_WRITE:
                    if(msg_type.obj!=null){
                        ConnectedThread connectedThread=new ConnectedThread((BluetoothSocket)msg_type.obj);
                        connectedThread.write(bluetooth_message.getBytes());
                        Log.d("donneesEnvoyees2", bluetooth_message);

Le "if" ne semble pas s'executer, un peu comme si l'"obj" du message était null. Ce qu'il est probablement, mais je ne sais pas comment modifier cela: "mNouvMessage.obj=0;" ne fait clairement pas l'affaire.


Bref, j'aimerais arriver à allumer éteindre la led sur le pin 13 de ma arduino. Idéalement l'appli que je bricole devrais faire tout le boulot relatif au bluetooth dans l'activité bluetooth, sauf l'envoie des données elle même et le rafraîchissement -connaitre l'état de mon pin 13- qui eux devraient être fait sur commande et régulièrement respectivement.



  • Partager sur Facebook
  • Partager sur Twitter
20 septembre 2020 à 12:07:30

Ayé, j'ai trouvé! Merci à tous. :D
  • Partager sur Facebook
  • Partager sur Twitter
21 septembre 2020 à 9:38:08

Salut,

Pense a mettre la solution que tu as trouvé (soit le code, soit le site où tu as trouvé la solution), ça aidera ceux qui tomberont sur le sujet et qui ont la même problématique que toi ;)

  • Partager sur Facebook
  • Partager sur Twitter
3 février 2023 à 1:47:45

Salut à tous, svp comment établir une connexion bluetooth dans une application mobile avec Android studio
  • Partager sur Facebook
  • Partager sur Twitter
3 février 2023 à 2:29:48

@YaoYaoAngeRoland Bonsoir, merci de ne pas squatter les sujet des autres pour une nouvelle question et  de ce fait créer un déterrage, créer votre propre sujet.

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter