Управление по Bluetooth любым Android устройством |

Управление по Bluetooth любым Android устройством | Роботы

Добавляем основной код

Пришла пора вдохнуть жизнь в наше приложение. Открываем файл MainActivity.java (src → ru.amperka.arduinobtled). Изначально он содержит следующий код:

MainActivityAutogen.java
packageru.amperka.arduinobtled;
 
importandroid.os.Bundle;importandroid.app.Activity;importandroid.view.Menu;
 
publicclass MainActivity extends Activity {
 
        @Override
	protectedvoid onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);}
 
	@Override
	publicboolean onCreateOptionsMenu(Menu menu){// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);returntrue;}
 
}

Дополним код в соответствии с тем, что нам нужно:

  1. Будем включать Bluetooth, если он выключен.

  2. Будем обрабатывать нажатия на кнопки

  3. Будем посылать информацию о том, какая кнопка была нажата.

Передавать на Arduino мы будем один байт с двузначным числом. Первая цифра числа — номер пина, к которому подключен тот или иной светодиод, вторая — состояние светодиода: 1 — включен, 0 — выключен.

Число-команда, рассчитывается очень просто:
Если нажата красная кнопка, то берется число 60 (для красного светодиода мы выбрали 6-й пин Arduino) и к нему прибавляется 1 или 0 в зависимости от того, должен ли сейчас гореть светодиод или нет. Для зеленой кнопки всё аналогично, только вместо 60 берется 70 (поскольку зеленый светодиод подключен к 7 пину).
В итоге, в нашем случае, возможны 4 команды: 60, 61, 70, 71.

Напишем код, который реализует всё сказанное.

MainActivity.java
packageru.amperka.arduinobtled;
 
importjava.io.IOException;importjava.io.OutputStream;importjava.lang.reflect.InvocationTargetException;importjava.lang.reflect.Method;
 
importandroid.app.Activity;importandroid.bluetooth.BluetoothAdapter;importandroid.bluetooth.BluetoothDevice;importandroid.bluetooth.BluetoothSocket;importandroid.content.Intent;importandroid.os.Bundle;importandroid.util.Log;importandroid.view.Menu;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Toast;importandroid.widget.ToggleButton;
 
publicclass MainActivity extends Activity implementsView.OnClickListener{
 
    //Экземпляры классов наших кнопок
    ToggleButton redButton;
    ToggleButton greenButton;
 
    //Сокет, с помощью которого мы будем отправлять данные на Arduino
    BluetoothSocket clientSocket;
 
    //Эта функция запускается автоматически при запуске приложения
    @Override
    protectedvoid onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        //"Соединям" вид кнопки в окне приложения с реализацией
        redButton =(ToggleButton) findViewById(R.id.toggleRedLed);
        greenButton =(ToggleButton) findViewById(R.id.toggleGreenLed);
 
        //Добавлем "слушатель нажатий" к кнопке
        redButton.setOnClickListener(this);
        greenButton.setOnClickListener(this);
 
        //Включаем bluetooth. Если он уже включен, то ничего не произойдетString enableBT = BluetoothAdapter.ACTION_REQUEST_ENABLE;
        startActivityForResult(new Intent(enableBT), );
 
        //Мы хотим использовать тот bluetooth-адаптер, который задается по умолчанию
        BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();
 
        //Пытаемся проделать эти действияtry{//Устройство с данным адресом - наш Bluetooth Bee//Адрес опредеяется следующим образом: установите соединение//между ПК и модулем (пин: 1234), а затем посмотрите в настройках//соединения адрес модуля. Скорее всего он будет аналогичным.
            BluetoothDevice device = bluetooth.getRemoteDevice("00:13:02:01:00:09"); 
 
            //Инициируем соединение с устройствомMethod m = device.getClass().getMethod("createRfcommSocket", newClass[]{int.class});
 
            clientSocket =(BluetoothSocket) m.invoke(device, 1);
            clientSocket.connect();
 
            //В случае появления любых ошибок, выводим в лог сообщение}catch(IOException e){
            Log.d("BLUETOOTH", e.getMessage());}catch(SecurityException e){
            Log.d("BLUETOOTH", e.getMessage());}catch(NoSuchMethodException e){
            Log.d("BLUETOOTH", e.getMessage());}catch(IllegalArgumentException e){
            Log.d("BLUETOOTH", e.getMessage());}catch(IllegalAccessException e){
            Log.d("BLUETOOTH", e.getMessage());}catch(InvocationTargetException e){
            Log.d("BLUETOOTH", e.getMessage());}
 
        //Выводим сообщение об успешном подключении
        Toast.makeText(getApplicationContext(), "CONNECTED", Toast.LENGTH_LONG).show();
 
    }
 
    @Override
    publicboolean onCreateOptionsMenu(Menu menu){// Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);returntrue;}
 
 
    //Как раз эта функция и будет вызываться 
 
    @Override
    publicvoid onClick(View v){
 
        //Пытаемся послать данныеtry{//Получаем выходной поток для передачи данныхOutputStream outStream = clientSocket.getOutputStream();
 
            int value =;
 
            //В зависимости от того, какая кнопка была нажата, //изменяем данные для посылкиif(v == redButton){
                value =(redButton.isChecked()?1:) 60;}elseif(v == greenButton){
                value =(greenButton.isChecked()?1:) 70;}
 
            //Пишем данные в выходной поток
            outStream.write(value);
 
        }catch(IOException e){//Если есть ошибки, выводим их в лог
            Log.d("BLUETOOTH", e.getMessage());}}}

Определение BroadcastReceiver

Следующим шагом будет определение нашего BroadcastReceiver, задачей которого будет фильтрация намерений с нашими действиями, определенными до получения LocalBroadcastManager, для запуска функций обратного вызова, определенных в предыдущем разделе. Поэтому мы используем BluetoothSDKListenerHelper как:

class BluetoothSDKListenerHelper {
    companion object {

        private var mBluetoothSDKBroadcastReceiver: BluetoothSDKBroadcastReceiver? = null

        class BluetoothSDKBroadcastReceiver : BroadcastReceiver() {
            private var mGlobalListener: IBluetoothSDKListener? = null

            public fun setBluetoothSDKListener(listener: IBluetoothSDKListener) {
                mGlobalListener = listener
            }

            public fun removeBluetoothSDKListener(listener: IBluetoothSDKListener): Boolean {
                if (mGlobalListener == listener) {
                    mGlobalListener = null
                }

                return mGlobalListener == null
            }

            override fun onReceive(context: Context?, intent: Intent?) {
                val device =
                    intent!!.getParcelableExtra<BluetoothDevice>(BluetoothUtils.EXTRA_DEVICE)
                val message = intent.getStringExtra(BluetoothUtils.EXTRA_MESSAGE)

                when (intent.action) {
                    BluetoothUtils.ACTION_DEVICE_FOUND -> {
                        mGlobalListener!!.onDeviceDiscovered(device)
                    }
                    BluetoothUtils.ACTION_DISCOVERY_STARTED -> {
                        mGlobalListener!!.onDiscoveryStarted()
                    }
                    BluetoothUtils.ACTION_DISCOVERY_STOPPED -> {
                        mGlobalListener!!.onDiscoveryStopped()
                    }
                    BluetoothUtils.ACTION_DEVICE_CONNECTED -> {
                        mGlobalListener!!.onDeviceConnected(device)
                    }
                    BluetoothUtils.ACTION_MESSAGE_RECEIVED -> {
                        mGlobalListener!!.onMessageReceived(device, message)
                    }
                    BluetoothUtils.ACTION_MESSAGE_SENT -> {
                        mGlobalListener!!.onMessageSent(device)
                    }
                    BluetoothUtils.ACTION_CONNECTION_ERROR -> {
                        mGlobalListener!!.onError(message)
                    }
                    BluetoothUtils.ACTION_DEVICE_DISCONNECTED -> {
                        mGlobalListener!!.onDeviceDisconnected()
                    }
                }
            }
        }

        public fun registerBluetoothSDKListener(
            context: Context?,
            listener: IBluetoothSDKListener
        ) {
            if (mBluetoothSDKBroadcastReceiver == null) {
                mBluetoothSDKBroadcastReceiver = BluetoothSDKBroadcastReceiver()

                val intentFilter = IntentFilter().also {
                    it.addAction(BluetoothUtils.ACTION_DEVICE_FOUND)
                    it.addAction(BluetoothUtils.ACTION_DISCOVERY_STARTED)
                    it.addAction(BluetoothUtils.ACTION_DISCOVERY_STOPPED)
                    it.addAction(BluetoothUtils.ACTION_DEVICE_CONNECTED)
                    it.addAction(BluetoothUtils.ACTION_MESSAGE_RECEIVED)
                    it.addAction(BluetoothUtils.ACTION_MESSAGE_SENT)
                    it.addAction(BluetoothUtils.ACTION_CONNECTION_ERROR)
                    it.addAction(BluetoothUtils.ACTION_DEVICE_DISCONNECTED)
                }


                LocalBroadcastManager.getInstance(context!!).registerReceiver(
                    mBluetoothSDKBroadcastReceiver!!, intentFilter
                )
            }

            mBluetoothSDKBroadcastReceiver!!.setBluetoothSDKListener(listener)
        }

        public fun unregisterBluetoothSDKListener(
            context: Context?,
            listener: IBluetoothSDKListener
        ) {

            if (mBluetoothSDKBroadcastReceiver != null) {
                val empty = mBluetoothSDKBroadcastReceiver!!.removeBluetoothSDKListener(listener)


                if (empty) {
                    LocalBroadcastManager.getInstance(context!!)
                        .unregisterReceiver(mBluetoothSDKBroadcastReceiver!!)
                    mBluetoothSDKBroadcastReceiver = null
                }
            }
        }
    }
}

В действии или фрагменте мы реализуем наш IBluetoothSDKListener, который мы зарегистрируем через две функции registerBluetoothSDKListner() и unregisterBluetoothSDKListner(). Например:

Определите сервис Bluetooth

А теперь самая сложная часть – Bluetooth Service. Мы собираемся определить класс, расширяющий Service, в котором мы определим функции, позволяющие привязывать Service и управлять потоками Bluetooth-соединения:

class BluetoothSDKService : Service() {

    // Service Binder
    private val binder = LocalBinder()

    // Bluetooth stuff
    private lateinit var bluetoothAdapter: BluetoothAdapter
    private lateinit var pairedDevices: MutableSet<BluetoothDevice>
    private var connectedDevice: BluetoothDevice? = null
    private val MY_UUID = "..."
    private val RESULT_INTENT = 15

    // Bluetooth connections
    private var connectThread: ConnectThread? = null
    private var connectedThread: ConnectedThread? = null
    private var mAcceptThread: AcceptThread? = null

    // Invoked only first time
    override fun onCreate() {
        super.onCreate()
        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter()
    }

    // Invoked every service star
    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        return START_STICKY
    }

    /**
     * Class used for the client Binder.
     */
    inner class LocalBinder : Binder() {
        /*
        Function that can be called from Activity or Fragment
        */
    }


    /**
     * Broadcast Receiver for catching ACTION_FOUND aka new device discovered
     */
    private val discoveryBroadcastReceiver = object : BroadcastReceiver() {

        override fun onReceive(context: Context, intent: Intent) {
            /*
              Our broadcast receiver for manage Bluetooth actions
            */
        }
    }

    private inner class AcceptThread : Thread() {
      // Body
    }

    private inner class ConnectThread(device: BluetoothDevice) : Thread() {
      // Body
    }

    @Synchronized
    private fun startConnectedThread(
        bluetoothSocket: BluetoothSocket?,
    ) {
        connectedThread = ConnectedThread(bluetoothSocket!!)
        connectedThread!!.start()
    }

    private inner class ConnectedThread(private val mmSocket: BluetoothSocket) : Thread() {
      // Body
    }


    override fun onDestroy() {
        super.onDestroy()
        try {
            unregisterReceiver(discoveryBroadcastReceiver)
        } catch (e: Exception) {
            // already unregistered
        }
    }

    override fun onBind(intent: Intent?): IBinder? {
        return binder
    }

    private fun pushBroadcastMessage(action: String, device: BluetoothDevice?, message: String?) {
        val intent = Intent(action)
        if (device != null) {
            intent.putExtra(BluetoothUtils.EXTRA_DEVICE, device)
        }
        if (message != null) {
            intent.putExtra(BluetoothUtils.EXTRA_MESSAGE, message)
        }
        LocalBroadcastManager.getInstance(applicationContext).sendBroadcast(intent)
    }

}

Чтобы сделать суть более читабельной, я закомментировал части о потоках, которые вы можете получить из официальной документации.

Как вы видите, в LocalBinder можно определить функции, которые будут видны действиям после привязки к ним. Например, мы можем определить функции для операций обнаружения, отправки сообщения или соединения, которые затем будут выполняться операции внутри сервиса.


    /**
     * Class used for the client Binder.
     */
    inner class LocalBinder : Binder() {
         /**
         * Enable the discovery, registering a broadcastreceiver {@link discoveryBroadcastReceiver}
         * The discovery filter by LABELER_SERVER_TOKEN_NAME
         */
        public fun startDiscovery(context: Context) {
            val filter = IntentFilter(BluetoothDevice.ACTION_FOUND)
            filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED)
            registerReceiver(discoveryBroadcastReceiver, filter)
            bluetoothAdapter.startDiscovery()
            pushBroadcastMessage(BluetoothUtils.ACTION_DISCOVERY_STARTED, null, null)
        }
        
        
        /**
         * stop discovery
         */
        public fun stopDiscovery() {
            bluetoothAdapter.cancelDiscovery()
            pushBroadcastMessage(BluetoothUtils.ACTION_DISCOVERY_STOPPED, null, null)
        }
        
        // other stuff

    }

Затем в потоках, управляющих сокетами, вы можете использовать функцию pushBroadcastMessage() для генерации событий и добавления информационного наполнения, такого как удаленное устройство и сообщение. Например:

private inner class ConnectedThread(private val mmSocket: BluetoothSocket) : Thread() {

        private val mmInStream: InputStream = mmSocket.inputStream
        private val mmOutStream: OutputStream = mmSocket.outputStream
        private val mmBuffer: ByteArray = ByteArray(1024) // mmBuffer store for the stream

        override fun run() {
            var numBytes: Int // bytes returned from read()

            // Keep listening to the InputStream until an exception occurs.
            while (true) {
                // Read from the InputStream.
                numBytes = try {
                    mmInStream.read(mmBuffer)
                } catch (e: IOException) {
                    pushBroadcastMessage(
                        BluetoothUtils.ACTION_CONNECTION_ERROR,
                        null,
                        "Input stream was disconnected"
                    )
                    break
                }

                val message = String(mmBuffer, 0, numBytes)

                // Send to broadcast the message
                pushBroadcastMessage(
                    BluetoothUtils.ACTION_MESSAGE_RECEIVED,
                    mmSocket.remoteDevice,
                    message
                )
            }
        }

        // Call this from the main activity to send data to the remote device.
        fun write(bytes: ByteArray) {
            try {
                mmOutStream.write(bytes)

                // Send to broadcast the message
                pushBroadcastMessage(
                    BluetoothUtils.ACTION_MESSAGE_SENT,
                    mmSocket.remoteDevice,
                    null
                )
            } catch (e: IOException) {
                pushBroadcastMessage(
                    BluetoothUtils.ACTION_CONNECTION_ERROR,
                    null,
                    "Error occurred when sending data"
                )
                return
            }
        }

        // Call this method from the main activity to shut down the connection.
        fun cancel() {
            try {
                mmSocket.close()
            } catch (e: IOException) {
                pushBroadcastMessage(
                    BluetoothUtils.ACTION_CONNECTION_ERROR,
                    null,
                    "Could not close the connect socket"
                )
            }
        }
    }

Мы закончили!

Смотрите про коптеры:  LEGO представила возможности для кооперативной игры наборов с Марио и Луиджи | Канобу

Bluetooth на андроиде

Как подключить беспроводные наушники к телефону и планшету?

У многих возникают проблемы при подключении беспроводных устройств (наушников, колонок и bluetooth-гарнитуры) к телефону. В этой статье я дам универсальное руководство по подключение практически любого беспроводного устройства к вашему смартфону или планшету.Данная инструкция актуальна для всех мобильных устройств на любой версии Андроид, для телефонов и планшетов. Включите беспроводные наушники (убедитесь,…

Новый стандарт Bluetooth 5

Тяжело представить современный смартфон без Bluetooth (напомню, это стандарт для беспроводной передачи файлов с одного устройства на другое). Каждые пару лет выходит новая версия этой технологии, последней из которых стала Bluetooth 5, анонсированная ещё в 2022 году. Хотя большинство современных смартфонов поддерживают Bluetooth 5, тяжело найти аппарат, который бы использовал…

Bluetooth затвор для фотокамер Android

Как сделать селфи стильным, оригинальным, красивым? Купить монопод? Просить прохожих сфотографировать вас? Есть способ проще: установить специальное приложение для Android, использующее в качестве дистанционного пульта спуска затвора вашу Bluetooth-гарнитуру. Об этом далее.Как работать с приложениемВсе, что нам понадобится, – это смартфон на Андроид и сопряженная с ним гарнитура. Приложений для…

Как пользоваться Bluetooth-принтером для Android

Мобильные устройства на базе операционной системы Android уже весьма плотно вошли в нашу жизнь, выполняя разнообразные задачи и практически полностью заменяя компьютеры. Теперь распечатывать документы прямо с планшетов и смартфонов стало еще проще: миру представлен мобильный Bluetooth принтер для Android устройств.Установка и настройка приложенияПрежде чем переходить к мобильному принтеру Bluetooth…

Как использовать телефон Android в качестве Bluetooth-гарнитуры

Эта статья подскажет вам решение проблемы, когда есть необходимость использовать свой мобильный гаджет под управлением Android в качестве Bluetooth-гарнитуры для другого гаджета.О функциональности подходаНа вопросы «Могу ли я использовать Android телефон в качестве Bluetooth-гарнитуры» ответом вполне может быть «да», но в большинстве случаев будет осуществляться только передача звука с основного аппарата на другой.Применить Android-телефон в качестве Bluetooth-гарнитуры полноценной, чтобы была возможность осуществлять звонки…

Как использовать Android в качестве Bluetooth-клавиатуры

В этой статье рассмотрим приложения, с помощью которых можно использовать Android в качестве Bluetooth-клавиатуры. Большинство из них требуют наличия Wi-Fi, а значит, маршрутизатора, что не всегда возможно. Поэтому остановимся на утилитах, работающих с серверной частью, установленной на компьютере: они могут взаимодействовать с ПК и через сеть, и с помощью синезуба.Unified…

Как передавать информацию через Bluetooth File Transfer

Приложение Bluetooth File Transfer для Android создано, чтобы передавать данные между устройствами: через него можно отправлять контакты поодиночке или же сразу несколько, кроме того, поддерживается отправка папки целиком, что стандартным путем нельзя сделать. Из особенностей приложения отметим также возможность отправки программ, которые у вас уже установлены, а еще работу с…

Воспроизведение звука на других устройствах через Bluetooth

В этой теме расскажем про стандартное приложение для Android Bluetooth динамика, которое предустановлено в большинстве современных смартфонов и позволяет проигрывать медиатреки на обеих смартфонах одновременно.В каких случаях это может пригодитьсяИспользовать Android как Bluetooth динамик можно, отдыхая на природе, когда у вашего товарища очень громкий с качественным звуком телефон, а у…

Каким образом происходит синхронизация Android по Bluetooth

На сегодняшний день существует масса приложений для управления смартфоном с вашего ПК. Сегодня рассмотрим, с помощью какого приложения осуществляется синхронизация Android по Bluetooth.Чем это удобноБывают случаи, когда возникает потребность управлять телефоном с ноутбука или со стационарного компьютера. Существуют специальные приложения, которые помогут нам решить данную задачу. Перед вами откроются такие…

Bluetooth и другие виджеты для Android

На сегодняшний день, Google Play для вашего смартфона может предложить большой выбор приложений, которые упрощают работу с девайсом. Таким есть и Bluetooth виджет для Android, который расширит функциональные возможности устройства. Утилиту Bluetooth Widget можно скачать в бесплатном доступе в Google Play.Принцип установкиИспользуя указанную утилиту, вы сможете получить быстрый доступ к…

Как обезопасить свой телефон по Wi-Fi и Bluetooth

В данной теме хотим поговорить про безопасность на Android-девайсах, взломы через Bluetooth и Wi-Fi сети. Выясним актуальность данной проблемы и приведем примеры, кому стоит обращать особое внимание на безопасность своего гаджета и данных, находящихся в нем.Актуальность проблемыМассовая миграция пользователей сотовой и мобильной связи на смартфоны установила высокие требования к их…

Что такое персональная сеть Bluetooth на Android

Если вы еще не слышали, что такое персональная сеть Bluetooth на Android и как она работает, то эта статья окажется вам очень кстати. Речь сегодня пойдет о технологии, которая позволит осуществить интернет-соединение с помощью беспроводного подключения между смартфонами или компьютерами. Ваши устройства должны поддерживать один из этих протоколов: PAN, GP…

Лучшее приложение для Bluetooth-гарнитуры на Android

В этой статье хотим поделиться информацией о том, как можно слушать музыку через Bluetooth гарнитуру, которая изначально не имеет поддержки трансляции мультимедийных звуков. Покажем приложение для Bluetooth-гарнитуры на Android, с помощью которого можно это сделать.ИнструкцияДанная инструкция содержит шаги с самого начала: от сопряжения гарнитуры со смартфоном до трансляции мультимедийных звуков…

Что такое адрес Bluetooth в Android и как его узнать

В наше время каждый знает, что такое Bluetooth. Более того, практически каждый умеет им пользоваться. Но мало кто углублялся в эту тему и пытался понять, как работает беспроводная связь. В этой статье мы разберем, что такое Bluetooth адрес в Android-устройствах, зачем он нужен и где его найти.Что такое адрес сетевого…

Где хранятся файлы, переданные через Bluetooth на Android

Бывает, что у некоторых начинающих пользователей возникают проблемы с тем, чтобы найти место сохранения переданных файлов через Bluetooth на Android OS. Данная работа призвана оказать помощь при решении подобной задачи.Пара слов об Android OSПрежде чем разбирать вопрос, где переданные файлы через Bluetooth на Android и как их найти, стоит рассказать…

Передача файлов с Android на iPhone по Bluetooth

Поговорим про две очень известные мобильные операционные системы, каждая из которых имеет своих преданных поклонников. Если вы предпочитаете Android, а ваш знакомый, например, iOS, может возникнуть вопрос, как передать файлы с Android на iPhone через Bluetooth. Сейчас мы рассмотрим эту каверзную задачку.Различие систем и решение проблемыДве платформы, конкурирующие между собой,…

Как подключить Android-устройство к ПК через Bluetooth

Android – функциональная система, которая предоставляет пользователям множество возможностей. О некоторых из них не знают даже люди, которые много лет используют операционную оболочку. В представленной статье мы детально рассмотрим вопрос, как подключить Android-устройство к ПК через Bluetooth и расшарить на компьютере доступ к интернету через мобильное устройство.Предварительная подготовкаПеред тем как…

Виды Buetooth устройств для Android

С развитием возможностей смартфонов и планшетов появляется большое количество аксессуаров, которые делают пользование еще функциональнее и удобнее. В данной статье рассмотрим Bluetooth устройства для Android.Обзор беспроводных гаджетовДавно известный всем метод передачи данных на основе технологии Wireless Personal Area Network работает на повсеместно доступной радиочастоте, что хорошо применимо к различным девайсам,…

Как использовать Bluetooth микрофон для Android

Операционная система Android может похвастаться огромным набором функций и большим количеством различных приложений, которые буквально каждый день выпускаются для нее. В представленной статье мы рассмотрим довольно интересную тему – что такое Bluetooth микрофон для Android.Зачем нужен микрофонТакое устройство станет хорошей находкой для автомобилистов, велосипедистов и мотоциклистов, которым правилами запрещено разговаривать…

Как работает Bluetooth напульсник для Android

Когда здоровый образ жизни и занятие фитнесом стали актуальными, появилась мода на фитнес-браслеты. Первый Bluetooth напульсник для Android появился в 2022 году, и до сих пор этот гаджет активно развивается и радует своими новыми улучшенными версиями.Браслет здорового образа жизниКаждому из нас было бы интересно следить за своим здоровьем самостоятельно, отслеживая…

Умная отмычка для Android

В этой теме предоставим вам информацию о новинке, которая, возможно, в ближайшее время будет в серийной продаже и придётся по вкусу многим продвинутым людям, упростив процедуру отмыкания и замыкания входных дверей. Итак, наша тема – умная отмычка (замок) Qrio управляемая с Android через Bluetooth.Немного о разработке новинкиРазрабатывать сей гаджет взялись…

Смотрите про коптеры:  Как вычислить движение робота на заданное расстояние
Особенности Bluetooth с низким энергопотреблением на Android

Данная статья расскажет вам про Bluetooth с низким энергопотреблением на Android. Вы сможете узнать про сильные стороны этой технологии, чем она лучше предыдущей и на каких устройствах ее можно задействовать.Немного о технологииЭта технология, исходя из ее свойств, называется low energy (LE), а также Smart. Была разработана в 2009 году; ее…

Как позвонить через Bluetooth на Android

Беспроводная гарнитура ни для кого не новость, и число людей, ее использующих, увеличивается с каждым годом. В данной статье мы рассмотрим, как совершать звонок через Bluetooth в Android.Настройка устройстваДля того чтобы совершать звонки через «синезуб», необходимо произвести такие действия: В главном меню вашего смартфона перейдите в «Приложения», нажав по соответствующей…

Как слушать Bluetooth FM-приемник на Android

Хотим поделиться с вами информацией о том, как можно слушать на гарнитуре Bluetooth FM-радио для Android-устройств. Практически во всех современных смартфонах FM-радио можно прослушивать только с подключенной проводной гарнитурой, потому что именно наушники выполняют роль антенны, и если они не вставлены в гнездо, система блокирует запуск программы. Таким образом, если…

Как перекинуть музыку по Bluetooth на Android

Несмотря на то, что такие операционные системы, как iOS и Windows Phone, используют давно известную всем технологию Bluetooth исключительно для подключения гаджетов, обладатели аппаратов на базе операционной системы от Google все еще имеют возможность передавать и файлы. Поговорим сегодня о том, как отправить музыку через Bluetooth на Android.Как это работаетПрименяя…

Как сделать Internet через Bluetooth

Internet через Bluetooth организовать достаточно просто. Зачем это нужно? Например, если у вас есть ноутбук, который подключен к активному интернету, и вы хотите раздавать глобальную сеть на другие устройства – смартфоны, планшеты и так далее. Об этом и пойдет речь в этой статье. Итак, расскажем, как раздать интернет через Bluetooth.Оформление…

Sip-клиент с поддержкой Bluetooth для Android

Сегодня поговорим про приложение для IP-телефонии, а именно про Android sip-клиент для разговоров через Bluetooth-гарнитуру. По умолчанию в Android 4.0 и выше, sip-клиент встроен в телефонную часть, что очень удобно и не требует никаких дополнительных программ. Данный режим работает через обычный номеронабиратель и имеет все те же функции, что и…

Раздача интернета через Bluetooth на Android-устройствах

Беспроводные технологии постоянно развиваются. Уже сегодня владельцы смартфонов и большинства планшетов свободно могут пользоваться мобильным интернетом, Wi-Fi связью и так далее. В этой статье подробно разберемся, как происходит раздача интернета через Bluetooth на Android – это очень просто.Как можно раздавать интернетСразу же хочется отметить, что процедура раздачи интернета на компьютер…

Рекомендуем приложения для Bluetooth-клавиатуры на Android

Можно найти немало количество программ, с помощью которых будет возможно использование вашего смартфона в качестве клавиатуры. В данной статье рассмотрим самые популярные приложения для Bluetooth-клавиатуры на Android.Unified RemoteВот самый известный продукт, который нам подойдет в решении данной задачи. Его можно найти в Google Play как за оплату, так и в свободном…

Как настроить Bluetooth на Android

В этот раз предоставим информацию о том, как настроить Bluetooth на Android, а именно – как задать имя вашего смартфона, управление его видимостью для других девайсов, экономию энергии, изменение прав на подключение.Активация настроекДля начала, перед тем, как настроить Bluetooth на телефоне Android, необходимо включить соответствующий модуль, потому что, если он будет выключен, доступ к управлению им будет закрыт.Выполните…

Что делать, если после обновления Android не работает Bluetooth

Мы часто сталкиваемся с разными проблемами в пользовании смартфона: после какого-то очередного обновления возникают глюки одних из функций или вовсе выходят из строя какие-либо отдельные модули. В этой статье расскажем, что можно сделать, если после обновления Android не работает Bluetooth.Выяснение проблемыДля начала нужно убедиться в том, что беспроводной модуль действительно…

Подключение Bluetooth-гарнитуры к смартфону на Android

Беспроводная гарнитура широко используется уже давно. Существует масса гаджетов, которые можно использовать по беспроводному подключению к вашему смартфону. О том, как подключить Bluetooth-гарнитуру к мобильному телефону на Android, и пойдет речь в данной статье.Подключение гарнитуры к смартфонуРазберем, как настроить Bluetooth-гарнитуру на Android: для этого вам потребуется не более 5 минут.Для…

Восстановление работоспособности Bluetooth на Android

Пользователи смартфонов сталкиваются с проблемами их использования: после истечения какого-то времени пользования аппаратом, или же сразу после приобретения. В данной теме поговорим о вариантах восстановления Bluetooth на Android с помощью стандартных средств системы, а также с использованием маленькой программки Bluetooth fix repair для Android.Уточняем проблемуСперва убедимся в том, что Bluetooth…

Что делать, если не передаются файлы через Bluetooth на Android

В данной теме поговорим о том, что нужно делать, если не передаются файлы через Bluetooth на Android. Расскажем о возможных причинах возникновения такой проблемы и о нюансах, из-за которых могут возникнуть проблемы при отправке файлов на соседнее устройство.Способ отправкиДля начала давайте разберемся, как правильно следует отправлять файлы, чтобы убедиться, что…

Есть ли возможность увеличить диапазон Bluetooth на Android

В данной статье поговорим немного про диапазон Bluetooth на Android. Некоторых пользователей может не устраивать радиус действия их Bluetooth модуля: например, в доме, когда телефон находится от вас за тремя стенами, ваша гарнитура теряет соединение с вашим смартфоном. Многие в таких случаях ищут решение данной проблемы, пытаясь найти способ увеличить…

Передача данных по Bluetooth FTP на Android

Маршируя в ногу со временем, производители смартфонов уделяют все меньше внимание таким стандартам связи, как Bluetooth, и все больше совершенствуют технологию интернет. Но есть еще на просторах нашей родины места, где не работает Wi-Fi, и забывать о старых привычных методах обмена рано. Рассмотрим, как Bluetooth FTP на Android улучшит нам…

Как проводить сканирования Bluetooth на Android

В этой статье поговорим про сканирования Bluetooth на Android. И покажем, как это сделать двумя способами, в одном из которых нашей целью будет дальнейшая работа с устройством; второй способ будет заключаться в том, чтобы отследить информацию о найденных девайсах, узнать их тип, адрес и прочее.Сканирование стандартным методомДанную процедуру будем выполнять…

Как пользоваться функцией Bluetooth на Android

Данная статья предназначена для пользователей, только начинающих знакомство с мобильной системой Android. В ней мы будем говорить о том, как пользоваться Bluetooth на Android. Начнем с самого простого: от того, как включить Bluetooth на Android, до сканирования новых аппаратов и отправки данных на них.Активация модуляИтак, прежде чем начинать работу с…

Приложение Bluetooth music player для Android

В этот раз рассмотрим приложение из категории Bluetooth music player для Android: оно пригодится тем, кто хочет синхронизировать проигрываемую музыку на нескольких телефонах через Bluetooth.Реализуемая идеяХотим сразу внести несколько поправок, чтобы в дальнейшем у читателей не было недопонимания, для чего мы это делаем. Наша задача заключается именно в том, чтобы…

Голосовые команды с Bluetooth-гарнитуры на Android

В данной статье речь пойдет про голосовые команды для Bluetooth-гарнитуры в Android. Пошагово покажем, как активировать данную функцию, обсудим плюсы и минусы используемого метода.В чем плюсыСразу расскажем про сильные стороны данного метода. При обычном активированном голосовом вводе все команды нужно произносить близко к смартфону, чтобы ваш голос был четко и…

Используйте свой android как bluetooth-геймпад для другого – my road

Пару недель назад мы рассмотрели Tablet Remote — приложение для Android, которое позволяет пользователям удаленно управлять одним устройством Android другим через Bluetooth. Теперь, хотя указанное приложение можно использовать, например, для удаленного управления воспроизведением мультимедиа на другом телефоне или планшете Android, подключенном к вашему телевизору через HDMI, Контроллер BT позволяет точно так же играть в игры-эмуляторы. Приложение превращает ваше Android-устройство в Bluetooth-геймпад, позволяя удаленно управлять играми-эмуляторами, запущенными на другом устройстве (хосте). Как и Tablet Remote, контроллер BT также должен быть установлен и запущен на обоих устройствах — хосте и контроллере — которые сопряжены друг с другом через Bluetooth. На данный момент приложение работает только с несколькими игровыми эмуляторами и поддерживает управление одним устройством Android с другим только через соединение Bluetooth.

BT Controller можно использовать для управления различными эмуляторами для игр Mame, Playstation, CPS2 и N64. Список всех поддерживаемых эмуляторов можно найти на странице приложения в Android Market (ссылка в конце).

Вот все шаги настройки, которые необходимо выполнить, чтобы настроить приложение на контроллере и хост-устройствах.

  • Как упоминалось ранее, сначала необходимо убедиться, что BT Controller установлен и работает на обоих устройствах.

BT-контроллер-Android-Home

  • При появлении запроса активируйте Bluetooth на обоих устройствах.
  • Сделайте Bluetooth обнаруживаемым на ваших устройствах из приложения, нажав на Видимый кнопка.
  • Затем коснитесь Соединять и выберите устройство, с которым вы хотите выполнить сопряжение.
  • В появившемся запросе выберите, хотите ли вы установить устройство в качестве Контроллер или Хозяин.
Смотрите про коптеры:  Калибровка квадрокоптера. Основные моменты

BT-контроллер-Android-подключение-выбор

  • Предполагая, что вы выбрали одно устройство в качестве контроллера, другому автоматически назначается роль хоста.
  • В то время как экран устройства-контроллера автоматически превращается в виртуальный геймпад, на экране хост-устройства отображается небольшое окно предварительного просмотра в правом верхнем углу экрана. Нажав на это окно, вы попадете в Язык и настройки ввода. Убедитесь, что вы выбрали и включили BTController в качестве метода ввода по умолчанию на главном устройстве. Как только это будет сделано, в вышеупомянутом окне предварительного просмотра должна отображаться любая клавиша, нажатая на устройстве контроллера.
Управление по Bluetooth любым Android устройством |
Устройство Контроллера
  • Вам необходимо вручную сопоставить все клавиши на геймпаде контроллера устройства с элементами управления на эмуляторе, запущенном на главном устройстве.
  • После того, как вы закончите с настройкой ключей, загрузите игровое ПЗУ в эмулятор, чтобы начать использовать свой контроллер для игры.
BT-контроллер-Android-хост
Хост-устройство

Экран настроек приложения (Меню> Настройки) позволяет включать / отключать вибрацию (тактильную / тактильную обратную связь) при нажатии клавиш на геймпаде.

Мы успешно протестировали приложение с HTC Desire в качестве контроллера и HTC Desire HD с N64oid в качестве хост-устройства.

В Android Market доступно несколько вариантов BT Controller. Один бесплатный, но содержит рекламу, а другой — без рекламы и стоит немногим более 1 доллара.

Скачать BT Controller Ad с поддержкой для Android (Бесплатно)

Скачать BT Controller Ad Free для Android (Оплаченный)

Клиент

Для инициализации соединения с удаленным устройствам (устройством, которое держит открытым серверный сокет) вам необходимо получить объект BluetoothDevice, содержащий информацию о нем. Этот объект используется для получения BluetoothSocket и инициализации соединения.

Опишем процедуру соединения:

  1. Получим BluetoothSocket вызвав метод  BluetoothDevice.createRfcommSocketToServiceRecord(UUID). Значение параметра UUID должно совпадать с значением, указанным при вызове listenUsingRfcommWithServiceRecord сервера.
  2. Инициализируем соединение, вызвав метод connect().  После вызова этого метода система будет выполнять SDP поиск на удаленном устройстве, чтобы сопоставить  UUID. В случае успеха при условии подтверждения запроса со стороны сервера будет открыт RFCOMM канал. Это блокирующий вызов. Если по каким-то причинам соединение сорвется или выйдет timeout (около 12 секунд), будет сгенерировано исключение.

Как и в случае с accept, метод connect() следует выполнять в отдельном потоке, в противном случае может произойти подвисание интерфейса.

Замечание. Прежде чем вызывать connect() убедитесь, что в данный момент не происходит сканирование с целью поиска доступных устройств. В случае одновременного выполнения этих операций соединение будет устанавливаться намного медленнее, и вы рискуете не уложиться в timeout.

Приведем пример клиентского приложения, инициализирующего соединение

privateclass ConnectThreadextends Thread{private final BluetoothSocket mmSocket;private final BluetoothDevice mmDevice;
 
public ConnectThread(BluetoothDevice device){// используем вспомогательную переменную, которую в дальнейшем// свяжем с mmSocket,
BluetoothSocket tmp=null;
mmDevice= device;
 
// получаем BluetoothSocket чтобы соединиться с BluetoothDevice
try{// MY_UUID это UUID, который используется и в сервере
tmp= device.createRfcommSocketToServiceRecord(MY_UUID);} catch(IOException e){}
mmSocket= tmp;}
 
public void run(){// Отменяем сканирование, поскольку оно тормозит соединение
mBluetoothAdapter.cancelDiscovery();
 
try{// Соединяемся с устройством через сокет.// Метод блокирует выполнение программы до// установки соединения или возникновения ошибки
mmSocket.connect();} catch(IOException connectException){// Невозможно соединиться. Закрываем сокет и выходим.
try{
mmSocket.close();} catch(IOException closeException){}return;}
 
// управлчем соединением (в отдельном потоке)
manageConnectedSocket(mmSocket);}
 
/** отмена ожидания сокета */public void cancel(){
try{
mmSocket.close();} catch(IOException e){}}}

Для остановки сканирования эфира вызывается метод cancelDiscovery(). Перед вызовом этого метода можно проверить идет ли сканирование с помощью isDiscovering().

После завершения работы с BluetoothSocket всегда вызывайте метод close(). Это поможет сэкономить ресурсы телефона.

Передача данных

После успешного соединения, каждое из соединенных устройств имеет объект BluetoothSocket с помощью которого легко реализовать передачу/прием данных:

  1. С помощью методов getInputStream() и getOutputStream() полуить объекты InputStream и OutputStream, управляющие передачей через сокет.
  2. Читать и писать данные в поток с помощью методов read(byte[]) и write(byte[]).

Вы должны использовать отдельный поток для чтения и записи данных. Это важно, поскольку методы read(byte[]) и write(byte[]) являются блокирующими и их вызов в основном потоке может парализовать вашу программу. Главный цикл в этом отдельном потоке должен считывать данные из InputStream. Для записи в OutputStream имеет смысл создать отдельный public метод.

privateclass ConnectedThreadextends 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;
 
// Получить входящий и исходящий потоки данных
try{
tmpIn= socket.getInputStream();
tmpOut= socket.getOutputStream();} catch(IOException e){}
 
mmInStream= tmpIn;
mmOutStream= tmpOut;}
 
public void run(){
byte[] buffer=new byte[1024];// буферный массив
int bytes;// bytes returned from read()
 
// Прослушиваем InputStream пока не произойдет исключениеwhile(true){
try{// читаем из InputStream
bytes= mmInStream.read(buffer);// посылаем прочитанные байты главной деятельности
mHandler.obtainMessage(MESSAGE_READ, bytes,-1, buffer).sendToTarget();} catch(IOException e){break;}}}
 
/* Вызываем этот метод из главной деятельности, чтобы отправить данные
удаленному устройству */public void write(byte[] bytes){
try{
mmOutStream.write(bytes);} catch(IOException e){}}
 
/* Вызываем этот метод из главной деятельности,
чтобы разорвать соединение */public void cancel(){
try{
mmSocket.close();} catch(IOException e){}}

В конструкторе создаются объекты для работы с потоками данных, после чего поток оживает входящие данные. После того как прочитан очередной блок данных из входящего потока он посылается в главную деятельность посредствам вызова метода Handler родительского класса.

Сервер

При соединении устройств одно из них должно вести себя как сервер, то есть удерживать открытый BluetoothServerSocket. Цель сервера – ждать запроса на входящее соединение, и когда оно подтверждено, создать BluetoothSocket. После этого BluetoothServerSocket можно закрыть. Рассмотрим поэтапно процедуру соединения с точки зрения сервера:

  1. Получить BluetoothServerSocket вызвав метод listenUsingRfcommWithServiceRecord(String, UUID). Первый параметр метода представляет собой идентификационное имя вашего сервиса. Система автоматически добавит его в базу Service Discovery Protocol (SDP). Обычно в качестве этого параметра просто указывают название приложения. Второй параметр также идентифицирует сервис. Этот параметр используется клиентом при подтверждении соединения.
  2. Начинаем прослушивать запрос на соединения через метод accept().  Это блокирующий метод, который возвращает результат либо когда соединение подтверждено, либо когда произошло исключение. Соединение считается подтвержденным, когда удаленное устройство пошлет запрос на соединение с UUID, указанным при регистрации серверного сокета. В случае успеха, accept() возвращает настроенный на соединение BluetoothSocket.
  3. Если Вы хотите принять дополнительное соединение, вызовите метод close(). Это приведет к освобождению сокета и всех его ресурсов, но не закроет соединенный BluetoothSocket. В отличие от TCP/IP, RFCOMM  позволяет работать только с одним клиентом на канале, поэтому в большинстве случаев имеет смысл вызывать метод close() срезу же после установки принятия сокета.

Поскольку метод accept() является блокирующим, его не стоит вызывать из потока главной деятельности, поскольку это приведет к подвисанию интерфейса. Обычна вся работа с BluetoothServerSocket и BluetoothSocket выполняется в отдельном потоке. Чтобы прекратить выполнение метода accept(), вызовите метод close() для BluetoothServerSocket (или BluetoothSocket) из любого другого потока вашего приложения.

Ниже приведен пример потока, реализующий описанный выше механизм работы

privateclass AcceptThreadextends Thread{private final BluetoothServerSocket mmServerSocket;
 
public AcceptThread(){// используем вспомогательную переменную, которую в дальнейшем// свяжем с mmServerSocket,
BluetoothServerSocket tmp=null;
try{// MY_UUID это UUID нашего приложения, это же значение// используется в клиентском приложении
tmp= mBluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);} catch(IOException e){}
mmServerSocket= tmp;}
 
public void run(){
BluetoothSocket socket=null;// ждем пока не произойдет ошибка или не// будет возвращен сокетwhile(true){
try{
socket= mmServerSocket.accept();} catch(IOException e){break;}// если соединение было подтвержденоif(socket!=null){// управлчем соединением (в отдельном потоке)
manageConnectedSocket(socket);
mmServerSocket.close();break;}}}
 
/** отмена ожидания сокета */public void cancel(){
try{
mmServerSocket.close();} catch(IOException e){}}}

В этом примере подразумевается, что может быть установлено только одно соединение, поэтому после того, как соединение подтверждено и получен BluetoothSocket, приложение посылает его отдельному потоку, закрывает BluetoothServerSocket и выходит из цикла.

Обратите внимание, когда accept() возвращает BluetoothSocket, сокет уже соединен, поэтому не требуется вызывать метод connect().

manageConnectedSocket() представляет собой метод, внутри которого нужно создать поток для передачи данных. Его возможная реализация будет рассмотрена ниже.

Вы должны закрыть BluetoothServerSocket сразу же после завершения прослушивания эфира на предмет наличия входящего соединения. В приведенном примере метод close() вызывается сразу после получения объекта BluetoothSocket. Также Вам может понадобиться public метод для остановки приватного BluetoothSocket.

Оцените статью
Радиокоптер.ру
Добавить комментарий

Adblock
detector