Управление чужим телефоном через блютуз. Управление компьютером через андроид

Управление чужим телефоном через блютуз. Управление компьютером через андроид Лодки

Основная активность, сопряжение arduino и android

Наследуем класс от AppCompatActivity и объявляем переменные:

public class MainActivity extends AppCompatActivity {
        private BluetoothAdapter bluetoothAdapter;
        private ListView listView;
        private ArrayList<String> pairedDeviceArrayList;
        private ArrayAdapter<String> pairedDeviceAdapter;
        public static BluetoothSocket clientSocket;
        private Button buttonStartControl;
}

Метод onCreate() опишу построчно:

@Override
protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState); //обязательная строчка
     //прикрепляем ранее созданную разметку
     setContentView(R.layout.activity_main); 
     //цепляем кнопку из разметки          
     Button buttonStartFind = (Button) findViewById(R.id.button_start_find); 
     //цепляем layout, в котором будут отображаться найденные устройства
     listView = (ListView) findViewById(R.id.list_device); 
      
     //устанавливаем действие на клик                                                                           
     buttonStartFind.setOnClickListener(new View.OnClickListener() { 
                                                                                                    
         @Override
         public void onClick(View v) {
             //если разрешения получены (функция ниже)
             if(permissionGranted()) { 
               //адаптер для управления блютузом
                bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 
                if(bluetoothEnabled()) { //если блютуз включен (функция ниже)
                    findArduino(); //начать поиск устройства (функция ниже)
                  }
              }
         }
    });

     //цепляем кнопку для перехода к управлению
     buttonStartControl = (Button) findViewById(R.id.button_start_control); 
     buttonStartControl.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
                //объект для запуска новых активностей
                Intent intent = new Intent(); 
                //связываем с активностью управления
                intent.setClass(getApplicationContext(), ActivityControl.class);
                //закрыть эту активность, открыть экран управления
                startActivity(intent); 
         }
     });

 }


Нижеприведенные функции проверяют, получено ли разрешение на использование блютуза (без разрешение пользователя мы не сможем передавать данные) и включен ли блютуз:

⇡#stereo test: проверяем кабель наушников

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

Чтобы проверить отдельно левый и правый канал, можно использовать простенькое приложение Stereo Test. Эту же программу можно применить на симметричных наушниках, чтобы точно определить, где правый канал, а где левый. При использовании несовместимой со смартфоном гарнитуры каналы могут поменяться местами. Stereo Test легко поможет понять, так ли это.

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

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

А если еще и источник оцифровки представлял собой пожеванную магнитную пленку «времен очаковских и покоренья Крыма», разобрать слова диктора на записи бывает очень трудно. Вот тут-то как раз и пригодится эквалайзер. Им можно, например, отсечь высокочастотные помехи, поднять средние или убрать чрезмерные низкие частоты, сделать акцент на голосе.

Инструментов для коррекции звука в магазине приложений вы найдете немало, к тому же во многих проигрывателях имеются свои инструменты для обработки звука в режиме реального времени. Но все эти опции работают, так сказать, в «слепом режиме», не учитывая акустических характеристик наушников.

А вот в Headphones Equalizer все по-другому. Приложение обладает исключительной особенностью: пытается калибровать аудиосигнал, анализируя звучание наушников через микрофон смартфона. Делается это с помощью мастера, в несколько этапов. Сначала программа проверяет наличие фонового шума, а затем пытается определить частотные характеристики наушников, фиксируя контрольный, изменяющийся по частоте тон. Если контрольный тест не удался, необходимо увеличить громкость.

Приложение определяет завалы и горбы в АЧХ гарнитуры и подстраивает эквалайзер таким образом, чтобы компенсировать недостатки используемой модели.

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

А еще в Headphones Equalizer есть приятное дополнение для тех, кто свято верит в пользу прогрева наушников (к слову, советуем посмотреть на эту тему материал «В поисках теплого звука: нужно ли греть наушники?»). С помощью генератора шума наушники можно прогревать прямо в этой программе.

И не просто так, а одним из двух типов шума — белым или розовым (белый, вероятно, мальчикам, девочкам — розовый). В процессе прогрева Headphones Equalizer будет отсчитывать время, затраченное на «запекание». Пара-тройка недель прогрева, автоматическая коррекция по встроенному в смартфон микрофону и… страшно подумать, как гарнитура после этого заиграет.

Не секрет, что длительное ношение наушников отрицательно сказывается на здоровье человека. Постоянная нагрузка на орган слуха ведет к тому, что чувствительность восприятия звуков у человека падает. Если вы заботитесь о своем здоровье, помните, что громкий звук — прямая дорога к глухоте.

Чтобы вовремя обратить внимание на появившийся недуг, следует регулярно проверять свой слух у врача. Ну или на крайний случай воспользоваться своим смартфоном. В магазине приложений Google Play можно найти специальное приложение, которое так и называется «Проверяем свой слух».

В основе работы программы лежит принцип тональной аудиометрии — технологии определения пороговых значений частоты, слышимой человеческим ухом. Проще говоря, программа генерирует тональность, а пользователь отмечает нажатием кнопки слышимые звуки. В результате серии таких замеров составляется график, упрощенная АЧХ слухового аппарата.

Периодически проходя этот тест, можно увидеть (а еще лучше — не увидеть) отклонения от нормы. Первый тест — калибровочный. Его желательно пройти человеку с идеальным слухом. Программа ведет наглядную статистику проверок, по которой можно оценить текущее состояние «пациента».

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

С другой стороны, разработчики утверждают, что можно делать проверку даже с наушниками, которые обычно идут в комплекте со смартфоном. Перед проверкой слуха нужно указать, используете ли вы «родные» наушники и если так, то программа задействует корректировочные коэффициенты конкретно для модели используемого смартфона (если, конечно, эти данные будут найдены в базе. Для смартфона Lenovo A680, например, их не оказалось). Калибровка в таком случае не понадобится.

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

Заключение

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

⇡#tunity: превращаем гарнитуру в беспроводные наушники

Отсутствие проводов при использовании наушников — несомненный плюс, многим хотелось бы иметь пару беспроводных наушников. С такими наушниками можно удобно разместиться на диване и смотреть телевизор, не путаясь в длинном кабеле.

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

Конечно, это будет не так удобно, как с настоящими беспроводными наушниками, где встроенный приемник вообще незаметен (чего нельзя сказать про смартфон). Но зато вы не переплачиваете за комфорт, да и сам «приемник» не займет много места в кармане. «Откуда же смартфон будет принимать сигнал телевизора?» — спросите вы. Из Интернета! На помощь придет сервис Tunity.

Смотрите про коптеры:  Дистанционное управление компьютером через Bluetooth на примере SE W700i

Установив на свое устройство одноименное приложение, направьте камеру гаджета на экран телевизора, после чего программа сделает снимок и отошлет его на сервер.

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

https://www.youtube.com/watch?v=subscribe_

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

Приложение Tunity может быть установлено как на устройства под управлением Android, так и на смартфон с iOS.

TeamViewer – бесплатный удаленный контроль

Управление чужим телефоном через блютуз. Управление компьютером через андроид

Самое известное бесплатное удаленное управление чужим телефоном Андроид. Устанавливается на оба телефона. Время установки не более 10 минут. Работает следующим образом:

Шаг 1. Установить TeamViewer на свой телефон.

Для этого нужно на своем телефоне Андроид войти в Google Play Маркет – в поисковой строчке написать «teamviewer» — нажать на «TeamViewer — удаленный доступ» — нажать на «Установить» — нажать на «Принять».

Шаг 2. Установить TeamViewer QuickSupport на подконтрольном телефоне.

Для этого нужно на другом телефоне войти в Google Play Маркет – в поисковой строчке написать «teamviewer quicksupport» — нажать на «Team QuickSupport» — нажать на «Установить» — нажать на «Принять».

Шаг 3. Запустить TeamViewer QuickSupport на подконтрольном телефоне.

Для этого нужно нажать на иконку установленного приложения – пролистать инструкцию и найти Главную страницу TeamViewer QuickSupport – найти ID устройства (9-тизначный код).

Шаг 4. Запустить TeamViewer на своем телефоне.

Этот шаг нужно сделать последним перед тем, как управлять чужим смартфоном – нажать на иконку установленного приложения – пролистать инструкцию и найти Главную страницу TeamViewer – ввести ID подконтрольного устройства в «ID партнера» — нажать на «Удаленное управление».

Шаг 5. Принять подключение на подконтрольном телефоне.

Теперь Вам останется только нажать на «Принять/Подключить».

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

RemoDroid – бесплатный удаленный контроль Андроид с Root доступом

Управление чужим телефоном через блютуз. Управление компьютером через андроид

Вторая по популярности бесплатная программа для управления чужим телефоном. Работает только на рутированных устройствах. Root права нужны как на подконтрольном телефоне, так и на своем. Совершенно не важно, каким приложением Вы будете их рутировать. Главное, чтобы были права суперпользователя.

Шаг 1. Установить RemoDroid на свой телефон.

Для этого нужно на своем телефоне Андроид войти в Google Play Маркет – в поисковой строчке написать «remodroid» — нажать на него и на «Установить» — нажать на «Принять».

Шаг 2. Установить RemoDroid на подконтрольном телефоне.

Полностью аналогично шагу 1. Точно такая же установка той же программы.

Шаг 3. Запустить RemoDroid на подконтрольном телефоне.

Нажать на иконку установленного приложения – нажать на ALLOW REMOTE CONTROL (Разрешить удаленное управление) – включится режим Обнаружения».

Шаг 4. Запустить RemoDroid на своем телефоне.

Нажать на иконку установленного приложения – нажать на CONNECT TO PARTNER (Подключиться к партнеру) – в открывшемся списке найти подконтрольный телефон – нажать на него – нажать на CONNECT (Подключиться).

Шаг 5. Принять подключение на подконтрольном телефоне.

Нажать на «Принять/Подключить».

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

Определение 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"
                )
            }
        }
    }

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

Смотрите про коптеры:  abb robotics products купить по низкой цене на Aliexpress

Дистанционное управление android устройствами с помощью bluetooth | 4tablet-pc

У вас есть Android планшет или смартфон с HDMI выходом, и вы знаете, что с его помощью можно смотреть фильмы на большом экране телевизора или монитора. Но это очень неудобно – скажете вы. То ли дело медиаплеер: расположился на диване, взял в руки дистанционку, и смотри все что хочешь в свое удовольствие.

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

Программа Tablet Remote позволит вам управлять воспроизведением видео и музыки, регулировать яркость изображения и громкость звука, отправлять такие команды, как «Воспроизведение», «Пауза», «Перемотка» и переключать треки. Кроме того, вы можете подавать системные команды «Назад», «Меню», «Домой» и «Поиск» и даже вводить текст на другом устройстве с помощью экранной клавиатуры.
Мало того, вам даже не потребуются root права ни на одном из устройств.

Программы для планшетов

Для того, чтобы настроить программу, вам нужно запустить ее на обеих устройствах, включить на них Bluetooth и подключить их друг к другу. Для этого вы должны выбрать «Connection» -> «Scan Devices», и после того, как устройство будет обнаружено, нажать «Make Device Discoverable», чтобы оно появилось в списке. По умолчанию Bluetooth активируется на 120 секунд (2 минуты), поэтому не забудьте убрать это ограничение в разделе “Настройки” -> “Беспроводные сети” -> “Bluetooth” настроек вашего устройства.

Теперь нам нужно на устройстве, которым мы хотим управлять зайти в настройки программы, нажав кнопку «Setup» и включить обе опции: «Enable Tablet Remote» и «Change The Input method For Tablet Remote»

Программы для планшетов

Все, с настройками покончено. Теперь, когда ваши устройства подключены друг к другу, просто нажмите на устройстве, которое будет выступать в качестве пульта управления кнопку «Remote», и на нем откроется окно с имитацией пульта управления, которым вы и будете посылать команды на второе устройство.

Чтобы включить полноэкранный режим, включите опцию «Hide Status bar» в разделе настроек «Settings» приложения.
Приложение Tablet Remote прекрасно работает как на телефонах, так и на планшетах, и когда мы пробовали управлять HTC Desire Z, он принимал команды от другого смартфона, даже в режиме ожидания (когда его экран был погашен).

Скачать бесплатно программу Tablet Remote можно в Android Market:


Похожие материалы:

Управляем закачкой торрентов с помощью Android телефона или планшета

Программы для Андроид. Samsung Smart View портирован на все Android устройства! (Скачать)

Приложение Smart View App для Samsung Galaxy S II позволяет передавать видео с телевизора на экран смартфона.

Mobile Mouse Lite. Удобный пульт ДУ для компьютера из Android телефона или планшета

Motorola Corvair. Новый компактный планшет или просто умная дистанционка?

Метод loop() и дополнительные функции

В постоянно повторяющемся методе loop() происходит считывание данных. Сначала рассмотрим основной алгоритм, а потом функции, задействованные в нем.


void loop() {
  //если хоть несчитанные байты
  if(BTSerial.available() > 0) {
     //считываем последний несчитанный байт
     char a = BTSerial.read();
     
    if (a == '@') {
      //если он равен @ (случайно выбранный мною символ)
      //обнуляем переменную val
      val = "";
      //указываем, что сейчас считаем скорость
      readSpeed = true;

    } else if (readSpeed) {
      //если пора считывать скорость и байт не равен решетке
      //добавляем байт к val
      if(a == '#') {
        //если байт равен решетке, данные о скорости кончились
        //выводим в монитор порта для отладки
        Serial.println(val);
        //указываем, что скорость больше не считываем
        readSpeed = false;
        //передаем полученную скорость в функцию езды 
        go(val.toInt());
        //обнуляем val
        val = "";
        //выходим из цикла, чтобы считать следующий байт
        return;
      }
      val =a;
    } else if (a == '*') {
      //начинаем считывать угол поворота
      readAngle = true; 
    } else if (readAngle) {
      //если решетка, то заканчиваем считывать угол
      //пока не решетка, добавляем значение к val
      if(a == '#') {
       Serial.println(val);
       Serial.println("-----");
        readAngle = false;
        //передаем значение в функцию поворота
        turn(val.toInt());
        val= "";
        return;
      }
      val =a;
    }
    //получаем время последнего приема данных
    lastTakeInformation = millis();
  } else {
     //если несчитанных байтов нет, и их не было больше 150 миллисекунд 
     //глушим двигатели
     if(millis() - lastTakeInformation > 150) {
     lastTakeInformation = 0;
     analogWrite(angleSpeed, 0);
     analogWrite(speedRight, 0);
     analogWrite(speedLeft, 0);
     }
     
  }
}

Получаем результат: с телефона отправляем байты в стиле “@скорость#угол#” (например, типичная команда “@200#60#”. Данный цикл повторяется каждый 100 миллисекунд, так как на андроиде мы установили именно этот промежуток отправки команд. Короче делать нет смысла, так как они начнут становится в очередь, а если сделать длиннее, то колеса начнут двигаться рывками.

Все задержки через команду delay(), которые вы увидите далее, подобраны не через физико-математические вычисления, а опытным путем. Благодаря всем выставленным задрежам, машинка едет плавно, и у всех команд есть время на отработку (токи успевают пробежаться).

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

void go(int mySpeed) {
  //если скорость больше 0
  if(mySpeed > 0) {
  //едем вперед
  digitalWrite(dirRight, HIGH);
  analogWrite(speedRight, mySpeed);
  digitalWrite(dirLeft, HIGH);
  analogWrite(speedLeft, mySpeed);
  } else {
    //а если меньше 0, то назад
    digitalWrite(dirRight, LOW);
    analogWrite(speedRight, abs(mySpeed)   30);
    digitalWrite(dirLeft, LOW);
     analogWrite(speedLeft, abs(mySpeed)   30);
  }
  delay(10);
 
}

void turn(int angle) {
  //подаем ток на плюс определителя угла
  digitalWrite(pinAngleStop, HIGH);
  //даем задержку, чтобы ток успел установиться
  delay(5);
  
  //если угол 150 и больше, поворачиваем вправо 
  //если 30 и меньше, то влево 
  //промежуток от 31 до 149 оставляем для движения прямо
  if(angle > 149) {
        //если замкнут белый, но разомкнуты  черный и красный
        //значит достигнуто крайнее положение, дальше крутить нельзя
        //выходим из функции через return 
        if( digitalRead(pinWhite) == HIGH && digitalRead(pinBlack) == LOW && digitalRead(pinRed) == LOW) {
          return;
        }
        //если проверка на максимальный угол пройдена
        //крутим колеса
        digitalWrite(angleDirection, HIGH);
        analogWrite(angleSpeed, speedTurn);
  } else if (angle < 31) { 
        if(digitalRead(pinRed) == HIGH && digitalRead(pinBlack) == HIGH && digitalRead(pinWhite) == HIGH) {
          return;
        }
        digitalWrite(angleDirection, LOW);
        analogWrite(angleSpeed, speedTurn);
  }
  //убираем питание 
  digitalWrite(pinAngleStop, LOW);
  delay(5);
}

Поворачивать, когда андроид отправляет данные о том, что пользователь зажал угол 60, 90, 120, не стоит, иначе не сможете ехать прямо. Да, возможно сразу не стоило отправлять с андроида команду на поворот, если угол слишком мал, но это как-то коряво на мой взгляд.

Подключение bluetooth-модуля к arduino

Так теперь нам нужно подключить нашу Arduino с Bluetooth. Если на Arduino нет вывода с 3.3В , а только 5В то нужен будет поставить стабилизатор чтобы снизить питание. Назначение выводов HC-05 легко найти в интернете. Для использования рекомендуем вам сделать плату с выведенными линиями питания, Rx и Tx. Подключение к Arduino необходимо производить в следующем порядке:

  • вывод Arduino 3.3В или (5В через стабилизатор!) — к 12 пину модуля Bluetooth
  • вывод Arduino GND — к 13 пину модуля Bluetooth
  • вывод Arduino TX — к 2 пину модуля RX Bluetooth
  • вывод Arduino RX — к 1 пину модуля TX Bluetooth
Смотрите про коптеры:  Управление RC машинкой 27mhz с компьютера / Хабр

После подключения необходимо проверить работоспособность Bluetooth модуля. Подключим Светодиод к 12 выводу Arduino и загрузим на плату следующий скетч:

char incomingByte;  // входящие данные
int  LED = 12;      // LED подключен к 12 пину

void setup() {
  Serial.begin(9600); // инициализация порта
  pinMode(LED, OUTPUT); //Устанавливаем 12 вывод как выход
  Serial.println("Press 1 to LED ON or 0 to LED OFF...");
}

void loop() {
  if (Serial.available() > 0) {  //если пришли данные
    incomingByte = Serial.read(); // считываем байт
    if(incomingByte == '0') 
    {
       digitalWrite(LED, LOW);  // если 1, то выключаем LED
       Serial.println("LED OFF. Press 1 to LED ON!");  // и выводим обратно сообщение
    }
    if(incomingByte == '1') {
       digitalWrite(LED, HIGH); // если 0, то включаем LED
       Serial.println("LED ON. Press 0 to LED OFF!");
    }
  }
}

Теперь скачиваем из Play Market программу Bluetooth-терминал и устанавливаем его. Включаем нашу Arduino. В приложении Нажимаем кнопку меню->Connect a device-Secure.Тем самым ваше устройство начнём искать Bluetooth поблизости. Наш модуль должен называться HC-05.

Вам потребуется выписать его MAC-адрес, так он понадобится в дальнейшем. Как только он обнаружит устройство HC-05 выберите его. Пароль, если потребуется: 1234 (это стандартный код). После того как вы подключились к нему у вас должно вывести сообщение которое пришло в Bluetooth терминал от Arduino:

“Press 1 to LED ON or 0 to LED OFF..” Далее введите 1 и нажмите отправить. Тем самым вы посылаете цифру 1 через Bluetooth на Arduino. Как только он примет цифру 1 должен загореться светодиод подключенный к 12 выводу Arduino. После введите цифру 0 и светодиод должен погаснуть. Если всё получилось переходим дальше.

Создание приложения

Выбираем File->New->Project.
Window
Так как мы создаём приложение для android, выбираем Android-> Android Application Project, и нажимаем Next
Window2
Так как мы создаём приложение для android, выбираем Android-> Android Application Project, и нажимаем Next
Управление чужим телефоном через блютуз. Управление компьютером через андроид

Следующее диалоговое окно:
Window3
Application Name -> пишем имя приложение,
Project Name -> пишем имя проекта,
Package Name -> Ни чего не пишем он создается автоматически!
Minimum Required SDK -> это минимальные требование указываем нашу версию Android у меня 4.1 её я и выбираю.
Target SDK -> выбираем вашу версию Android
Compile with -> выбираем вашу версию Android
Theme: для начала я бы советовал выбрать None.
Нажимаем Next.
В следующем окне ничего менять не нужно. Просто жмем Next.
Window4
Application Name -> пишем имя приложение,
Project Name -> пишем имя проекта,
Package Name -> Ни чего не пишем он создается автоматически!
Minimum Required SDK -> это минимальные требование указываем нашу версию Android у меня 4.1 её я и выбираю.
Target SDK -> выбираем вашу версию Android
Compile with -> выбираем вашу версию Android
Theme: для начала я бы советовал выбрать None.
Нажимаем Next.
В следующем окне ничего менять не нужно. Просто жмем Next.
Управление чужим телефоном через блютуз. Управление компьютером через андроид

Далее нам предлагают создать свою иконку для приложения, можете изменить стандартный ярлык загрузив свою картинку, я же для начала предлагаю просто нажать Next.
Window5
В следующем необходимо выбрать пункт меню Blank Activity и нажимать Next.
Window6
В следующем необходимо выбрать пункт меню Blank Activity и нажимать Next.
Управление чужим телефоном через блютуз. Управление компьютером через андроид

Жмем Finish и через несколько секунд открывается главное окно нашей программы. Выбираем вкладку Activity_main.xml и видим наш редактор:
Window7

Трюк 4: работаем с bt-адаптером напрямую

Долгое время Bluetooth стеки для Windows предоставляли настолько скудные возможности
, что программисты просто обходили эту платформу стороной. Этим объясняется, что большинство программ для серьезных забав c «синим зубом» разрабатываются под никсовую платформу.

Некоторые из хитрых приемов мы разберем именно на это платформе, а именно FreeBSD
(напомню, что на диске прошлого номера мы выкладывали свежий 7.0 релиз этой ОС). Сама технология Bluetooth
официально стала поддерживаться на ней только с 5-ой ветки на базе подсистемы Netgraph.

  1. Подключаем устройство: kldload ng_ubt
  2. Копируем сценарий подгрузки стека в удобное место: cp /usr/share/examples/netgraph/bluetooth/rc.bluetooth /usr/local/etc/rc.bluetooth
  3. Копируем сценарий подгрузки стека в удобное место и запускаем: sh /usr/local/etc/rc.bluetoots start ubt0

Теперь хочу познакомить тебя с утилитой hccontrol. Это одна из основных программ для работы с BT-модулем. Именно она выполняет все операции, связанные с интерфейсом HCI, и имеет следующий синтаксис: hccontrol –n . Проверим функциональность нашего устройства, просканиров эфир на наличие устройств:

hccontrol –n ubt0hci Inquiry

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

Базовый перечень включает в себя: CIP (Common ISDN Access), CTP (Cordless Telephony), DUN (dial-up networking), FAX (FAX), FTRN (Obex File Transwer), HSET (Headset), NAP (Network Access Point). Чтобы выяснить, какие сервисы предоставляет то или иное устройство, используется запрос на специальном протоколе SPD (Service Descovery Protocol).

# spdcontrol -a browse

Трюк 6: перехватываем из эфира разговоры по гарнитуре

Одна из основных угроз радиотехнологий состоит в том, что данные можно перехватить. Первое, что приходит в голову, касаемо Bluetooth – прослушать разговоры людей, использующих гарнитуру
. И зачастую это реально! На хакерском фестивале What the Hack
в Нидерландах специалисты из группы Trifinite продемонстрировали, как при помощи ноутбука с Linux, специальной программы и направленной антенны можно подслушать, о чем говорит через Bluetooth-гарнитуру водитель
проезжающего автомобиля.

Группа разработала программу Car Whisperer
(«Автомобильный шептун»). Возможности программы относительно невелики: прослушать можно только тех, кто забыл сменить заводские пароли доступа к Bluetooth наподобие«0000» или «1234». Но таких бедолаг, поверь, очень и очень много!

«Шептун» способен вклиниться и успешно пройти «pairing» устройств, получив информацию, передаваемую с каркита или хедсета на мобилку. Хочу обратить внимание: утилита позволяет не только получить информацию, передающуюся между хедсетом и мобилой, но и инжектить туда свою. Мы решили проверить возможности этой программы, скачав Car Whisperer
с сайта разработчиков.

hciconfig адаптер class 0x500204# 0x500204 – это класс «phone»

В противном случае некоторые «умные» девайсы могут заподозрить неладное. Смотрим синтаксис утилиты, который выглядит следующим образом:

./carwhisperer «что внедряем в линию» «что захватываем из линии» «адрес устройства» [канал]

Мы взяли внедряемый файл прямо из папки утилиты, а в качестве выходного указали out.raw:

./carwhisperer 0 message.raw /tmp/out.raw00:15:0E:91:19:73

На выходе получаем файл out.raw. Прослушать его в чистом виде нельзя: необходимо преобразовать в аудио формат, для чего потребуется дополнительная утилита. Подойдут довольно многие аудио конвертеры, например :

raw –r 8000 –c 1 –s –w out.raw –t wav –r 44100 –c 2 out.wav

Кроме прослушивания, можно войти в систему, просмотреть телефонную книгу и воспользоваться другими возможностями «свободных рук» с Bluetooth. Принцип такой: сначала осуществляется поиск активных устройств и проверка на предмет сервиса HS (Head Set).

На практике это выглядит следующим образом. Сначала осуществляется поиск всех активных гарнитур с помощью команды «sdptool search HS», которая выдает примерно такой ответ:

Inquiring …Searching for HS on 00:0A:3A:54:71:95 …Service Name: HeadsetService RecHandle: 0x10009Service Class ID List:”Headset” (0x1108)”Generic Audio” (0x1203)Protocol Descriptor List:”L2CAP” (0x0100)”RFCOMM” (0x0003)Channel:

Далее осуществляется попытка открыть RFCOMM соединение на SCO audio channel с помощью команды «rfcomm connect 2 00:0A:3A:54:71:95 1» и посылка нужных AT-команд. Приведу небольшую статистическую заметку о данных авторизации на некоторые модели беспроводных гарнитур:

Nokia (00:02:EE…) – pin=”5475″Audi UHV (00:0E:9F…) – pin=”1234″O”Neill (00:80:37…) – pin=”8761″Cellink (00:0A:94…) – pin=”1234″Eazix (00:0C:84…) – pin=”1234″

Кстати говоря, тот же принцип может использоваться для несанкционированного подключения и ко всем остальным устройствам
. При помощи AT-команд и протокола RFCOMM можно, к примеру, прочитать SMS-сообщение или даже отправить его с чужого телефона на платный номер, поставив владельца девайса на деньги. Будь бдителен!

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

Adblock
detector