Поводом к написанию статьи послужило то, что за прошедший год понадобилось подключать Bluetooth (BT) модуль HC-06 к проекту Android три раза. Стало понятно, что необходимо данный материал законспектировать (хотя бы для себя), возможно кому-то еще пригодится!
Коротко о том, что такое HC-06, для тех кто этого не знает. HC-06 - это преобразователь (конвертер) сигналов последовательного интерфейса RS232 (UART) в сигналы, которые передаются с помощью интерфейса Bluetooth и наоборот. Этот модуль чрезвычайно популярен в настоящее время у разработчиков, т.к. врядли на сегодняшний день Вы найдете что-нибудь дешевле (стоимость на Aliexpress вместе с пересылкой 200-250 рублей). Для чего все это нужно? К примеру, у Вас есть устройство на микроконтроллере, которое должно передавать данные (управляться) без проводов в пределах комнаты.
Статья адресована Android-разработчикам, которые хотели бы применить этот модуль в своем проекте для передачи данных. Я создаю приложения в Android Studio (AS), поэтому описание будет "заточено" под эту IDE.
Также стоит сказать, что за основу BT-приложения было выбрано приложение-пример из Android sample application - BluetoothChat. Это приложение можно установить в AS через меню File->New->Import Sample. Приложение многопоточное и достаточно сложное для понимания, но, как говорится "волков бояться - в лес не ходить". Для того чтобы на первых порах "поиграть" с BT через терминальную программу, можно подключить модуль HC-06 со стороны UART к адаптеру USB2COM, например на микросхеме FTDI, с уровнями сигналов 3,3V, который подключается уже в USB-порт компьютера. Как подключать смотри на рис.1
Рис.1 Подключение модуля HC-06 к адаптеру на микросхеме FTDI
Теперь опишем что необходимо сделать в приложении для того чтобы обменяться данными через модуль HC-06. Куски кода можно копировать прямо из BluetoothChat. Если нужно что-то изменить я постараюсь описать как можно подробнее.
Во-первых, для работы с Bluetooth приложение должно иметь в файле AndroidManifest.xml следующие разрешения:
Второе, создаем класс в проекте, что-то типа BluetoothService (в BluetoothChat этот класс называется BluetoothChatService), добавляем импорт и код из BluetoothChat, можно поменять константу TAG, если она вдруг не нравится.
Для модуля HC-06 необходимо установить следующие константы:
Замечание: в этом классе я, например, не использовал класс AcceptThread, т.к. он нужен для обеспечения подключения других устройств в нашему, что по логике работы моих приложений оказалось лишним. Закомментировал его объявление, объявление всех его экземпляров и вызовы методов этого класса. Далее, "играясь" с BluetoothChat обнаружил "тонкое" место в методе connected этого класса. привожу часть кода
// Send the name of the connected device back to the UI Activity
Message msg = mHandler.obtainMessage(Constants.MESSAGE_DEVICE_NAME);
Bundle bundle = new Bundle();
bundle.putString(Constants.DEVICE_NAME, device.getName());
msg.setData(bundle);
mHandler.sendMessage(msg);
//setState(STATE_CONNECTED);
т.е. пришлось перенести установку состояния "ПОДСОЕДИНЕНО" ( setState(STATE_CONNECTED);
) перед стартом потока mConnectedThread.start();
. Плавающий баг приложения заключался в том, что подключение к модулю происходило, что называется "через раз".
Третье, создаем интерфейс Constants (файл Constants.java), в котором определены некоторые константы, используемые классом BluetoothChatService.
Четвертое, внедряем работу с BT в Activity (или Fragment) приложения.
Объявляем глобальные переменные в Activity (или Fragment)
/**
* Name of the connected device
*/
private String mConnectedDeviceName = null;
/**
* Array adapter for the conversation thread
*/
private ArrayAdapter<String> mConversationArrayAdapter;
/**
* String buffer for outgoing messages
*/
private StringBuffer mOutStringBuffer;
/**
* Local Bluetooth adapter
*/
private BluetoothAdapter mBluetoothAdapter = null;
/**
* Member object for the chat services
*/
private BluetoothChatService mChatService = null;
В метод onCreate() активности или фрагмента добавляем:
if (mBluetoothAdapter == null) {
FragmentActivity activity = getActivity();
Toast.makeText(activity, getString(R.string.bt_not_enabled_leaving), Toast.LENGTH_LONG).show();
activity.finish();
}
Добавляем метод onStart() с кодом:
а также onDestroy():
if (mChatService != null) {
mChatService.stop();
}
}
В активность или фрагмент добавляем setupChat(), sendMessage(), connectDevice(), класс Handler, метод onActivityResult().
Пятое - добавляем нужные для сообщений и названий строки в values/strings.xml
Шестое, добавляем активность DeviceListActivity и xml-файл разметки для нее и в манифест приложения нужно добавить схему и описание активности:
Файл device_name.xml, который используется в DeviceListActivity для описания строк с именами устройств.
Вот в общем-то и все! Должно работать.
Комментарии
i.s.kuznetcov
пн, 12/11/2017 - 22:03
Постоянная ссылка (Permalink)
hc-05
Почитал Вашу статью, попытался реализовать. Но вопросов больше чем ответов появилось.
Можно ли увидеть Ваш пример в виде архива проекта? Что лишнее нужно удалить? Есть процедуры synchronized. С ними что делать?
root
сб, 01/27/2018 - 13:37
Постоянная ссылка (Permalink)
hc-05
Извиняюсь за задержку с ответом! Во-первых, скажу сразу, что это не статья начального уровня, скорее название статьи должно быть где-то "Как я скрестил BluetoothChat от Google и модуль HC-06". Однако Ваш вопрос побудил на написание другой статьи. Беру месяц на разработку!
Страницы