- Работа с COM портом в Android приложениях
- Android: Bluetooth в качестве сервиса
- Почему? И как?
- 1) Определите действия
- 2) Определите события-функции обратного вызова
- 3) Определение BroadcastReceiver
- 4) Определите сервис Bluetooth
- Заключение
- COM порт на Android
- РОБОТ на базе: android, arduino, bluetooth. Начало
- Приступим к работе
Работа с COM портом в Android приложениях
Все доброго времени суток!
Однажды я задумался над разработкой приложения, которое требовало бы общения с hardware устройством, через COM порт. Хотя Android заботливо предоставляет api для работы с usb устройствами, оно мне к сожалению не подходило, так как хотелось осуществлять поддержку моего старого планшета на базе андроид версии 2.2. Стандартное api ото Гугла, не подходило
по двум причинам:
- во первых оно не сработало для меня.
- девайс у меня все-таки старенький
Итак, после длительного поиска в интернете, я наткнулся на очень интересное решение android-serialport-api. Данное решение представляет собой Java обертку в которой через JNI в которой осуществляются вызовы к USB устройству.
Разработчики библиотеки предлагают 4 различных варианта подключения Android устройства к COM порту через USB.
Так как я имел в своем распоряжении планшет с USB host портом, и у меня под рукой имеется USB to RS232 преобразователь, то я пошел по варианту номер 2.
Преимущества и недостатки такого решения заключаются в
Преимущества
- USB — RS232 преобразователь можно легко найти на ближайшем радио рынке
- никаких извращений с моим дорогим моему сердцу планшетом
- возможная высокая скорость передачи информации
Недостатки
- потребуется USB хост коннектор
- возможно, что девайс придется рутануть
Тут я опишу подход в использовании этой библиотеки.
Для корректной работы serialPortFinder необходимо чтобы переходник USB-RS232 был подключен, определен в /dev.
Вот таким нехитрым способом можно осуществлять общение с очень большим количеством железа через COM порт,
Источник
Android: Bluetooth в качестве сервиса
Почему? И как?
Вы когда-нибудь задавали себе вопрос, прочитав официальное руководство по bluetooth для Android, как управлять им внутри вашего приложения? Как сохранить соединение активным, даже когда вы переходите от одного действия к другому?
Что ж, в этом руководстве я постараюсь показать вам, как я реализовал связь bluetooth через Service, чтобы управлять bluetooth и соединением с различными действиями, используя Service Binding, а также установил слушатель обратного вызова для операций, получающих информацию о состоянии связи bluetooth.
В этом руководстве мы создадим четыре файла:
BluetoothSDKService :который реализует функциональные возможности bluetooth и выдает LocalBroadcast сообщения во время операций
BluetoothSDKListenerHelper : который выполняет BroadcastReceiver и запускает функции IBluetoothSDKListener
IBluetoothSDKListener : наш Interface, который определяет функции обратного вызова
BluetoothUtils : который содержит имена действий, определенных для фильтрации событий в BroadcastReceiver
1) Определите действия
Первым шагом является определение файла BluetoothUtils.kt , который содержит действия, о которых мы хотим получать уведомления в нашей активности:
Я определил несколько, но вы можете добавлять их по своему усмотрению.
2) Определите события-функции обратного вызова
Второй шаг — это определение нашего интерфейса, который будет содержать события, соответствующие действиям, которые мы определили в первом шаге. Итак, давайте продолжим и определим IBluetoothSDKListener как:
Этот интерфейс будет позже реализован в нашей активности, или фрагменте, который будет выполнять некоторые действия при появлении события. Например, когда устройство подключается, срабатывает функция onDeviceDiscovered , и затем вы можете перейти к выполнению определенных операций, например, как мы увидим в следующих шагах, отправить сообщение по bluetooth на только что подключенное устройство через наш BluetoothSDKService .
3) Определение BroadcastReceiver
Следующим шагом будет определение нашего BroadcastReceiver , задачей которого будет фильтрация намерений с нашими действиями, определенными до получения LocalBroadcastManager , для запуска функций обратного вызова, определенных в предыдущем разделе. Поэтому мы используем BluetoothSDKListenerHelper как:
В действии или фрагменте мы реализуем наш IBluetoothSDKListener , который мы зарегистрируем через две функции registerBluetoothSDKListner() и unregisterBluetoothSDKListner() . Например:
Теперь наш фрагмент может быть запущен для событий, полученных BroadcastListener , который передает их через обратные вызовы в интерфейс нашего фрагмента. Чего теперь не хватает? Ну, важная часть: сервис Bluetooth!
4) Определите сервис Bluetooth
А теперь самая сложная часть — Bluetooth Service. Мы собираемся определить класс, расширяющий Service , в котором мы определим функции, позволяющие привязывать Service и управлять потоками Bluetooth-соединения:
Чтобы сделать суть более читабельной, я закомментировал части о потоках, которые вы можете получить из официальной документации.
Как вы видите, в LocalBinder можно определить функции, которые будут видны действиям после привязки к ним. Например, мы можем определить функции для операций обнаружения, отправки сообщения или соединения, которые затем будут выполняться операции внутри сервиса.
Затем в потоках, управляющих сокетами, вы можете использовать функцию pushBroadcastMessage() для генерации событий и добавления информационного наполнения, такого как удаленное устройство и сообщение. Например:
Заключение
Мы видели, как из нашей активности можем связать сервис Bluetooth (1), который выполняет и управляет операциями Bluetooth. В нем мы можем запускать многоадресное событие (broadcast event) (2), которые получает Bluetooth-приемник. Получив их, Bluetooth-приемник, в свою очередь, вызывает функцию интерфейса, реализованную (4) в нашей активности, зарегистрированной на bluetooth-приемник(3)
Мой совет — всегда следовать официальному руководству и рекомендациям по написанию чистого кода.
Всех желающих приглашаем на двухдневный онлайн-интенсив «Делаем мобильную мини-игру за 2 дня». За 2 дня вы сделаете мобильную версию PopIt на языке Kotlin. В приложении будет простая анимация, звук хлопка, вибрация, таймер как соревновательный элемент. Интенсив подойдет для тех, кто хочет попробовать себя в роли Android-разработчика. >> РЕГИСТРАЦИЯ
Источник
COM порт на Android
Сейчас я расскажу, как, имея в наличии совершенно стандартное устройство на Android с поддержкой USB Host (в моем случае Nexus 7), совершенно стандартный USB Host переходник на полноразмерный разъем «мама», совершенно стандартный USB serial контроллер на чипе PL2303 (они почти все работают именно на этом чипе) и не менее стандартный цискин голубой шнурок, зайти на консоль сетевого оборудования и без всяких ограничений работать с ней. Хотя никто не мешает подключать к планшету/телефону и любое другое оборудование, работающее с командной строкой поверх RS-232.
Первым делом получаем на планшете рут-права. Иначе никак.
Вторым делом ставим Busybox. Кто не знает — это отличный комплект утилит, одна из которых нам потребуется. После установки надо запустить его и нажать в самой программе «Install», когда программа спросит про метод установки — сказать «Normal».
Затем понадобится любой приличный эмулятор терминала. Мне нравится Irssi ConnectBot.
Ну и напоследок — штатные клавиатуры плохо годятся для работы с консолью. Нам ведь нужны клавиши Tab, ctrl и прочие, верно? Да и цифры хочется иметь в верхнем ряду, над буквами, а не где-то еще. Потому — Hacker’s Keyboard. Лучше, конечно, подключить внешнюю клавиатуру, но мы пока не собираемся набивать вручную многоэкранные конфиги.
Всё готово для подключения.
Запускаем терминальный клиент, выбираем локальное подключение, и подключаем к планшету контроллер. Нужно убедиться, что он определился, хотя тут проблем не ожидается, драйвера для PL2303 уже много лет как включены в ядро Linux. Под рутом запускаем dmesg.
(если кому мелковато — кликните на картинку)
Нужно запомнить, куда смонтировало контроллер. В моем случае это всегда был /dev/ttyUSB0.
Осталось установить соединение. В комплект Busybox входит программа «microcom», она-то нам и пригодится.
Набираем в консоли «microcom -s [скорость порта] [точка монтирования устройства]».
Выход из microcom по ctrl+x. Break должен посылаться по ctrl+b (пока не проверял). Другие горячие клавиши передаются корректно.
Альтернативы?
Можно купить один из многих «Bluetooth Serial» адаптеров. Вот только такие адаптеры и стоят дороже (>$50), и требуют внешнего питания. Ни одного на аккумуляторах не видел. В лучшем случае батарейку надо самому прикрутить.
Для пользователей техники Apple есть проводное решение за те же >$50.
Источник
РОБОТ на базе: android, arduino, bluetooth. Начало
Создание робота, даже простенького с ограниченным функционалом, довольно интересная и увлекательная задача. В последнее время любительская робототехника переживает настоящий бум, ей начали увлекаться даже те люди, которые от электроники очень далеки (к ним отношусь и я). Прошло то время, когда нужно было сидеть ночами с паяльником, или травить платы. Все стало гораздо проще, нужно лишь купить Arduino, комплект проводков, сенсоры, датчики, моторчики и вперед к сборке своего первого робота. Таким образом, фокус разработчиков — любителей сместился с электроники и механической части к программированию.
Данная серия статей будет содержать информацию для быстрого старта по созданию своего первого робота, от покупки необходимых деталей до его запуска в наш мир.
Отмечу, что статьи я пишу по ходу самостоятельного изучения материала и создания своего первого робота.
Предполагается, что человек читающий статью уже имеет опыт в:
- Установке и настройке среды разработки для android устройств.
- Написании первой программы Hello World для android устройства.
- Установке драйверов и среды разработки для Arduino.
- Написании первой программы (включать, выключать) светодиоды на Arduino.
Сокращения
БТ – Bluetooth;
Андроид – устройство с ОС android, к примеру, смартфон;
Скетч – приложение для Arduino;
Ардуино – Arduino Nano.
Общая схема робота
Пусть робот имеет следующую общую схему (рис.1). Андроид, является «головным мозгом», в котором обрабатываются все данные и проводятся вычисления. На основании результатов вычислении по БТ каналу передаются команды, принимаемые БТ модулем и в дальнейшем поступающие по последовательному порту в Arduino. Arduino обрабатывает поступившие команды и выполняет их при помощи «мышц» (Моторы светодиоды и др.). Кроме того в Arduino поступают данные от «органов чувств» (сенсоры, датчики и др.), которые он приводит в удобный вид и отправляет при помощи БТ модуля в «головной мозг». И так все повторяет до бесконечности.
Рисунок 1
Обоснование именно такой схемы робота следующее:
-БТ модуль и Arduino Nano имеют низкую стоимость, а также маленький объем и вес.
-Андроид, не дорогое и доступное устройство, уже имеется у огромного количества людей, в том числе и у меня.
-Андроид имеет свои сенсоры, датчики и экран для вывода информации
-Простота написания кода для приложений как для андроида так и для ардуино.
Для упрощения задачи построения робота, предлагаю воспользоваться методом «от простого к сложному», т.е. как и при изучении языка программирования создадим первую программу «Hello word». Конечно, это будет не одна программа, а как минимум две (для ардуино и андроида). В каждой последующей статье функционал робота будет увеличиваться.
Постановка задачи
Собрать простенькое устройство, у которого имеются:
-2 кнопки (b1, b2).
-1 светодиод (Led).
И выполняется функционал:
-главное activity содержит 2 кнопки «Отпарвить 0» и «Отправить 1», при нажатии на которые от андроида к ардуино по БТ каналу передаются данные, соответствнно «0» и «1», ардуино их обработвает и зажигает либо тушит светодиод.
-данные о нажатии или отпускании кнопок от ардуино передаются в андроид, на экране главного activity выводится информация об этом.
Закуп необходимых деталей и узлов.
1) Android устройство – смартфон LG P500 (версия Android 2.3.3), либо любое другое устройство на базе Android версией 2.3.3 и выше. Цену не указываю, так как отдельно не покупал, а использую свой смартфон.
2) Arduino NanoV3.0 ( dx.com/ru/p/nano-v3-0-avr-atmega328-p-20au-module-board-usb-cable-for-arduino-118037 ) — 11,32$
3) Модуль Bluetooth ( dx.com/ru/p/bluetooth-board-module-4-pin-121326 ) — 10,57$
4) Макетные провода ( dx.com/ru/p/30cm-breadboard-wires-for-electronic-diy-40-cable-pack-80207 ) — 2,51$
5) Кнопки — 2шт., светодиод – 1 шт. – 50 рублей
Итого: 855,20 рублей.
Приступим к работе
Arduino
Соберем из имеющихся деталей схему (рис. 2)
Рисунок 2
Питание на arduino подается по USB кабелю, который подключается к компьютеру, по нему же загружается и программное обеспечение (скетч) выполняемое на нем. Необходимо отметить, что загружать скетч в arduino можно только тогда, когда отключено питание от Bluetooth модуля (Вывод (17) 3V3), в противном случае возникает ошибка.
Подробности установки среды разработки Arduino и драйверов можно найти на официальном сайте: arduino.ru/Guide/Windows
Ниже приведен скетч который необходимо загрузить в ардуино:
Объявляем переменные, напротив каждой стоит комментарий.
Инициируем последовательное соединение и задаем скорость передачи данных в бит/c (бод). Мой БТ модуль работает на скорости 38400, но может быть скорость 9600 (скорость БТ модуля можно задавать при помощи AT команд). Устанавливаем режим работы заданного входа/выхода(pin) как входа или как выхода. Подаем HIGH значение на входы и выходы.
Функция void contact_bounce(int buttton) обрабатывает нажатие кнопок и позволяет устранить дребезг контактов, который возникает при соприкосновении или расхождении контактов в механических переключающих устройствах, таких, как кнопка, происходит многократное замыкание и размыкание.
В основном цикле Loop слушаем последовательный порт, и если на него пришли данные мы их обрабатываем. Кроме того вызываем функцию обработки нажатия кнопок и устранения дребезга контактов.
Загрузив скетч в ардуино, можем проверить его работоспособность – запустив монитор порта. При нажатии кнопок в окне монитора будет выводиться надпись «Press button b». Проверить работу светодиода удастся только после написания приложения для андроида.
В данной статье для ардуино будет использоваться только этот скетч.Приступим к разработки приложения для андроида.
Android
Для удобства отладки приложения андроида, рекомендую использовать не «Android virtual device», а реальный смартфон с ОС Android версии от 2.3.3 подключенный через USB кабель к компьютеру в режиме «Отладки». Существует огромное количество статей как это сделать.
Android ШАГ 1
Создаем новый проект «Android application project»
Для работы с БТ необходимо выставить права на использование его нашим приложением. Для этого заходим в манифест, выбираем закладку Permissions, нажимаем add, далее Uses permission, и устанавливаем следующие права: android.permission.BLUETOOTH, android.permission.BLUETOOTH_ADMIN
Теперь оформим основное activity, в res/layout/activity_main.xml поместим код:
Таким образом, основное activity примет вид:
Рисунок 3
Текстовое поле «txtrobot», будет отображать всю необходимую нам информацию. Кнопки b1 и b2, будут отправлять команды в arduino.
Теперь переходим в src/../MainActivity.java здесь и будет располагаться наш основной код. Подключим пакет Api для Bluetooth:
Перед тем как использовать БТ необходимо убедится, что в нашем андроиде он присутствует. Создадим экземпляр класса BluetoothAdapter (отвечающий за работу с установленным в андроиде БТ модулем):
Если андроид не имеет БТ то будет возвращено null:
В данном виде программу уже можно запустить. На экране андроида вы должны увидеть надпись: «Bluetooth присутствует».
Теперь необходимо убедиться, что БТ включен, либо предложить его включить. Добавим константу:
Запустив измененное приложение на андроиде, Вам будет выдан «Запрос разрешения на включения Bluetooth», подтвердив его, тем самым Вы активируете БТ.
Полный код приложения:
Android ШАГ 2
Для дальнейших экспериментов, необходимо «спарить» наш андроид и БТ модуль, для этого на андроиде в настройках БТ, выполним поиск и подключимся к БТ модулю, пароль «1234».
Если вдруг удаленный БТ модуль не будет нормально работать, просто отключите от него все провода (VCC, GND,RX,TX), тем самым сделав жесткую перезагрузку, и снова подключите их — это должно помочь.
Теперь попробуем программно подключится к удаленному БТ модулю: основной код подключения разместим в onResume. onResume – это одно из состояний нашего Activity, а именно, Activity видно на экране, оно находится в фокусе, пользователь может с ним взаимодействовать. Ниже приведен основной код Activity:
Доступ к удаленному БТ модулю получаем по его МАС адресу btAdapter.getRemoteDevice(MacAdress). Узнать MAC-адрес БТ модуля можно, при помощи программы для андроида: Bluetooth Terminal.
Что бы убедится, что доступ к БТ модулю получен, используем метод getName(), который позволяет получить имя удаленного БТ модуля, и выводим результат на экран андроида.
Также в этом примере, была добавлена возможность ведения лога, который по ходу выполнения программы можно просматривать, и обнаруживать существующие ошибки. Кроме того создана функция MyError, которая вызывается в том случае если нужно аварийно завершить приложение.
Запустив приложение, на экране андроида в текстовом поле «txtrobot» отобразится имя удаленного БТ модуля.
Android ШАГ 3
Доступ к удаленному БТ модулю получен, следующий наш шаг передать данные от андроида к нему. Для этого в onResume(), создадим сокет:
где UUID (Universally Unique Identifier) — это стандарт идентификации, используемый в создании программного обеспечения. Добавим в определение константу UUID:
Чтобы не тормозить соединение отменим поиск других БТ устройств:
При не удаче закроем сокет:
Так как методы отправки и получения данных являются блокирующими, их следует выполнять в отдельном потоке, что бы предотвратить зависание основного приложения. Для этого создадим класс:
В конструкторе public ConnectedThred(BluetoothSocket socket) создается объект управляющий передачей данных через сокет:
Для отправки данных из главного activity вызывается метод sendData(String message) с параметром текстового сообщения, которое преобразуется к типу byte. Метод cancel() позволяет закрыть сокет.
Напишем, обработчики нажатия кнопок b1 и b2, содержащие вызов функции sendData(String message) и сделаем запись об этом в логе. Полный код приложения приведен ниже:
Написанное нами приложение, позволяет передавать по БТ от андроида к ардуино данные – «0» и «1», которые в свою очередь для ардуино являются командами «1» — зажечь светодиод, а «0» — потушить. Таким образом, с учетом общей схемы робота, мы научились отдавать команды от «головного мозга» к «мышцам». Осталось дело за малым, научить андроид принимать данные от «органов чувств».
Android ШАГ 4
Получение данных также как и отправку, необходимо выполнять в отдельном потоке, чтобы избежать зависание главного activity. Принятые данные от БТ модуля мы будем выводить на экран главного activity в текстовом поле – MyText. Но возникает трудность — работа с view-компонентами доступна только из основного потока. А новые потоки, которые мы создаем, не имеют доступа к элементам экрана. Для решения данной проблемы воспользуемся механизмом Handler.
Handler — это механизм, который позволяет работать с очередью сообщений. Он привязан к конкретному потоку (thread) и работает с его очередью. Handler умеет помещать сообщения в очередь. При этом он ставит самого себя в качестве получателя этого сообщения. И когда приходит время, система достает сообщение из очереди и отправляет его адресату (т.е. в Handler) на обработку.
Объявим Handler:
Источник