Android -> BT arduino

0

Witam grupowiczów
Na wstępie musze powiedzieć, że zaczynam swoją przygodę z androidem więc proszę o wyrozumiałość

otóż mam problem z połączeniem Androida z modułem Bluetooth HC-05
chcę zrobić sterowanie oświetleniem na modułach BT
a więc do rzeczy....
chodzi i o to aby moja aplikacja podczas włączania włączyła sama moduł BlueTooth i połączyła się z jednym ze sparowanych urządzeń (któryś z modułów HC-05 lub HC-06)

część już mam
posklejane z progamów w sieci
później cały projekt bym umieścił dla potomnych
myślę, że będzie zainteresowanie.... :)
ale bez waszej pomocy niewiele zrobię ...

a oto kod


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

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


public class DeviceList extends ActionBarActivity
{
    //widgets
    Button btnPaired;
    ListView devicelist;
    //Bluetooth
    private BluetoothAdapter myBluetooth = null;
    private Set<BluetoothDevice> pairedDevices;
    public static String EXTRA_ADDRESS = "device_address";
    private final static int REQUEST_ENABLE_BT = 1;

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

        //Calling widgets
        btnPaired = (Button)findViewById(R.id.button);
        devicelist = (ListView)findViewById(R.id.listView);

        //if the device has bluetooth
        myBluetooth = BluetoothAdapter.getDefaultAdapter();

        if(myBluetooth == null)
        {
            //Show a mensag. that the device has no bluetooth adapter
            Toast.makeText(getApplicationContext(), "Bluetooth Device Not Available", Toast.LENGTH_LONG).show();

            //finish apk
            finish();
        }
        else if(!myBluetooth.isEnabled())
        {

            Intent enableBtIntent =  new  Intent ( BluetoothAdapter . ACTION_REQUEST_ENABLE );
            startActivityForResult ( enableBtIntent , REQUEST_ENABLE_BT );
                //Ask to the user turn the bluetooth on
                //Intent turnBTon = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                //startActivityForResult(turnBTon,1);
        }

        btnPaired.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v)
            {
                pairedDevicesList();
            }
        });

    }

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

        if (pairedDevices.size()>0)
        {
            for(BluetoothDevice bt : pairedDevices)
            {
                list.add(bt.getName() + "\n" + bt.getAddress()); //Get the device's name and the address
            }
        }
        else
        {
            Toast.makeText(getApplicationContext(), "No Paired Bluetooth Devices Found.", Toast.LENGTH_LONG).show();
        }

        final ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1, list);
        devicelist.setAdapter(adapter);
        devicelist.setOnItemClickListener(myListClickListener); //Method called when the device from the list is clicked

    }

    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();
            String address = info.substring(info.length() - 17);

            // Make an intent to start next activity.
            Intent i = new Intent(DeviceList.this, ledControl.class);

            //Change the activity.
            i.putExtra(EXTRA_ADDRESS, address); //this will be received at ledControl (class) Activity
            startActivity(i);
        }
    };


    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_device_list, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

0

No dobrze, widzę że masz w onCreate włącznie BT i obsługę kliknięcia do parowania. A z czym tak na prawdę masz problem?

0

Tak na prawd to problem w tym, że chciałbym aby obsługa BT włączała się automatycznie razem z uruchamianiem aplikacji i nie musiałbym włączać jej kolejnym kliknięciem i tak samo by się wyłączała, kolejna rzecz jaką bym chciał to aby aplikacja łączyła się z modułem BT który jest w zasięgu... i po stracie zasięgu łączyła by się automatycznie...

0

Bluetooth should never be enabled without direct user consent. If you want to turn on Bluetooth in order to create a wireless connection, you should use the ACTION_REQUEST_ENABLE Intent

Poza tym zdajesz sobie sprawę, że musisz sam kombinować bo nie każdy ma moduł BT do Arduino taki jak Ty masz.

0

po stronie arduino i tak to opiszę aby można to było zrealizować na arduino albo po prostu na jakimś avr i napisać w przyjaznym języku,
z arduino mi to działa tylko w Androidzie muszę za dużo klikać, a chce to zoptymalizować

0

więc mam

   Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableBtIntent, RESULT_OK); 

dla potomnych trzeba zmienić na

   Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
             myBluetooth.enable(); 

teraz proszę o podpowiedź aby moduł BT wyłączał się przy wyłączaniu aplikacji

0

to zrób w onPause
myBluetooth.disable();

0

super działa pięknie ....

a czy ktoś wie jak utworzyć połączenie z jakimś istniejącym juz sparowanym HC-05 lub innym który jest w zasięgu ???
i jak wznowić połączenie w przypadku jego straty...

dzisiaj w nocy przyszedł mi jeszcze jeden pomysł
powiedzmy mam 2 lub więcej takie modułu BT jeden w salonie drugi w pokoju trzeci w ....
i w momencie przejścia z salonu do pokoju aplikacja automatycznie łączy się z tym który jest w zasięgu i na podstawie nazwy zmienia aktywność ... w której jest inna nazwa i mogą być inne przyciski....

wierzę, że z waszą pomocą coś takiego zrobię

0

Jeśli chodzi o nasłuchiwanie straty połączenia to będziesz musiał skorzystać z BroadcastReceiver'a i tam robić akcje w przypadku straty połączenia.

Co do Twojego pomysły "z nocy" to również BroadcastReceiver oraz jakiś serwis w tle który będzie to nadzorować

0

Ok.
tylko żeby nasłuchiwanie działało tak jak chce to powinien łączyć się z modułem który jest w zasięgu....
jak zrobić aby łączył się z modułem który jest w zasięgu (oczywiście wcześniej już sparowanym)

0

No najpierw przecież musisz dostać informację o tym że, jeden moduł już jest niedostępny. Wtedy zaczynasz przeczesywać listę sparowanych urządzeń i sprawadzasz który moduł jest dostępny pod względem zasięgu. Serwis i BroadcastReceiver umożliwi Ci to zrobienie transparentnie.

Jeszcze możesz sprawdzać siłę sygnału z modułów. Kiedy stwierdzisz że ten z którego korzystasz jest za słaby a w polu jest inny z lepszym zasięgiem wtedy to przepinasz, nie tracąc tak naprawdę czasu tylko robisz to z automatu. Inna kwestia jest taka czy te moduły będą w tej samej "sieci".

0

do obsługi połączenia i przycisków mam

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
import android.app.ProgressDialog;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.os.AsyncTask;

import java.io.IOException;
import java.util.UUID;


public class ledControl extends ActionBarActivity {

    Button btnOn, btnOff, btnDis;
    SeekBar brightness;
    TextView lumn;
    String address = null;
    private ProgressDialog progress;
    BluetoothAdapter myBluetooth = null;
    BluetoothSocket btSocket = null;
    private boolean isBtConnected = false;
    //SPP UUID. Look for it
    static final UUID myUUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        Intent newint = getIntent();
        address = newint.getStringExtra(DeviceList.EXTRA_ADDRESS); //receive the address of the bluetooth device

        //view of the ledControl
        setContentView(R.layout.activity_led_control);

        //call the widgtes
        btnOn = (Button)findViewById(R.id.button2);
        btnOff = (Button)findViewById(R.id.button3);
        btnDis = (Button)findViewById(R.id.button4);
        brightness = (SeekBar)findViewById(R.id.seekBar);
        lumn = (TextView)findViewById(R.id.lumn);

        new ConnectBT().execute(); //Call the class to connect

        //commands to be sent to bluetooth
        btnOn.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                turnOnLed();     //method to turn on
            }
        });

        btnOff.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v)
            {
                turnOffLed();   //method to turn off
            }
        });

        btnDis.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                Disconnect();   //close connection
            }
        });

        brightness.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                if (fromUser==true)
                {
                    lumn.setText(String.valueOf(progress));
                    try
                    {
                        btSocket.getOutputStream().write(String.valueOf(progress).getBytes());
                    }
                    catch (IOException e)
                    {

                    }
                }
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });
    }

    private void Disconnect()
    {
        if (btSocket!=null) //If the btSocket is busy
        {
            try
            {
                btSocket.close(); //close connection
            }
            catch (IOException e)
            { msg("Error");}
        }
        finish(); //return to the first layout

    }

    private void turnOffLed()
    {
        if (btSocket!=null)
        {
            try
            {
                btSocket.getOutputStream().write("TF".toString().getBytes());
            }
            catch (IOException e)
            {
                msg("Error");
            }
        }
    }

    private void turnOnLed()
    {
        if (btSocket!=null)
        {
            try
            {
                btSocket.getOutputStream().write("TO".toString().getBytes());
            }
            catch (IOException e)
            {
                msg("Error");
            }
        }
    }

    // fast way to call Toast
    private void msg(String s)
    {
        Toast.makeText(getApplicationContext(),s,Toast.LENGTH_LONG).show();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_led_control, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    private class ConnectBT extends AsyncTask<Void, Void, Void>  // UI thread
    {
        private boolean ConnectSuccess = true; //if it's here, it's almost connected

        @Override
        protected void onPreExecute()
        {
            progress = ProgressDialog.show(ledControl.this, "Connecting...", "Please wait!!!");  //show a progress dialog
        }

        @Override
        protected Void doInBackground(Void... devices) //while the progress dialog is shown, the connection is done in background
        {
            try
            {
                if (btSocket == null || !isBtConnected)
                {
                 myBluetooth = BluetoothAdapter.getDefaultAdapter();//get the mobile bluetooth device
                 BluetoothDevice dispositivo = myBluetooth.getRemoteDevice(address);//connects to the device's address and checks if it's available
                 btSocket = dispositivo.createInsecureRfcommSocketToServiceRecord(myUUID);//create a RFCOMM (SPP) connection
                 BluetoothAdapter.getDefaultAdapter().cancelDiscovery();
                 btSocket.connect();//start connection
                }
            }
            catch (IOException e)
            {
                ConnectSuccess = false;//if the try failed, you can check the exception here
            }
            return null;
        }
        @Override
        protected void onPostExecute(Void result) //after the doInBackground, it checks if everything went fine
        {
            super.onPostExecute(result);

            if (!ConnectSuccess)
            {
                msg("Connection Failed. Is it a SPP Bluetooth? Try again.");
                finish();
            }
            else
            {
                msg("Connected.");
                isBtConnected = true;
            }
            progress.dismiss();

        }
    }
}

 

0

I teraz do tego musisz dopisać Broadcast w którym zarejestrujesz się na zerwane połączenie, a jak wychwycisz ten case ze zerwanym połączeniem to uruchamiasz procedurę szukania urządzeń i połączenia ze sparowanym urządzeniem.

Ten kod co tutaj wrzuciłeś to będzie ciężko, żeby to ładnie zrobić bo jest masakryczny i będziesz miał po kilka razy to samo w kodzie. Ale obsłuż sobie ten case z łączeniem z nowym modułem automatycznie a wtedy będziesz poprawiać kod

0

To nie będzie łatwe ...
dużo nauki przede mną... nie wszystko rozumiem ...

0

Najpierw sobie napisz jakąś prostą apkę która korzysta z Broadcast, żebyś obczaił o co w tym chodzi. Potem zobacz jak komunikować się z serwisami czy innymi elementami Android tj. Fragment, Activity. Pomału do przodu:)

0

Ok. dzięki za wskazowki
biorę się za czytanie ...

1 użytkowników online, w tym zalogowanych: 0, gości: 1