Как подключить внешние устройства к смартфону: полный гайд по Bluetooth, USB, Wi-Fi и ИК-порту

Подключение устройств к смартфону
Как подключить к смартфону
Bluetooth смартфон
USB смартфон
Wi-Fi смартфон
ИК-порт смартфон
Android подключение устройств
iOS подключение устройств
Bluetooth Low Energy
Умный дом смартфон
Современный смартфон — это не просто гаджет для звонков и серфинга в интернете. Это мощный центр управления, который может взаимодействовать с огромным количеством внешних устройств: от наушников и умного дома до специализированного промышленного оборудования. В этой статье мы подробно разберем все основные способы подключения устройств к смартфону, рассмотрим их плюсы, минусы и практические примеры использования.
Зачем подключать что-то к смартфону?
Цели подключения внешних устройств к смартфону можно условно разделить на две большие категории: бытовые и специализированные.
Бытовые и известные устройства. С ними сталкивался практически каждый пользователь:
  1. Аудиоустройства: Наушники, колонки.
  2. Устройства ввода: Компьютерные мыши, клавиатуры, геймпады.
  3. Умный дом: Управление через смартфон чайником, стиральной машиной, освещением и другими девайсами.
  4. Пульт ДУ: Использование ИК-порта для управления телевизором или кондиционером.
Специализированные и сложные устройства. Это сфера для профессионалов и энтузиастов:
  1. Пульты управления медицинским или научным оборудованием (например, рентгеновским детектором).
  2. Системы бесключевого доступа к автомобилю.
  3. Сбор данных с различных датчиков и сенсоров.
  4. Возможности ограничены только фантазией и технологиями.
Способы подключения внешних устройств к смартфону
Существует четыре основных способа подключения внешних устройств к смартфону. Конечно, можно придумать ещё что-то, например, радиосигналы и тому подобное. Но тут мы уже не напрямую работаем с каким-то железом, а нам понадобится посредник.
Собственно, вот наш список:
  1. Инфракрасный порт или ИК-порт
  2. Bluetooth Classic и Bluetooth Low Energy
  3. Wi-Fi
  4. USB
С некоторыми из этих способов мы работали много. С другими работали совсем чуть-чуть. А одного совсем не касались. Разберём каждый способ детально и с примерами.
Инфракрасный порт (ИК-порт)
Изображение одного из хакатонов проведенных 7bits
Разберем сначала способ, с которым мы совсем не работали. И это ИК-порт — некоторая технология передачи данных по воздуху с помощью инфракрасного излучения.
Для его работы требуется передатчик и приемник. Единого стандарта в работе инфракрасных портов нет. Но существует довольно много организаций, которые публиковали и публикуют свои стандарты.
Реализация на мобильных платформах
Для работы в Android с ИК-портом есть ConsumerIrManager. С его помощью можно передавать данные по определенному паттерну через ИК-порт телефона, главное, чтобы он там был.
А вот в iOS всё немного сложнее. В смартфонах-то они есть. Но вот найти какую-то документацию у нас не получилось. Поэтому можем сказать лишь одно: ИК-порты в смартфонах от Apple есть, но как их использовать — неизвестно.
Возможно, надо связываться напрямую с Apple или через какую-то специальную программу для разработчиков (одну такую специальную программу мы рассмотрим ниже, когда речь пойдет про USB).
Плюсы ИК-порта:
  • Малое энергопотребление. Но тут важное условие, что дальность передачи напрямую зависит от мощности и стоимости ИК-порта. В телефонах они чаще всего слабенькие и дешевые (вспомните, кто передавал картинки/музыку/видео по ИК-портам, телефоны надо держать прямо вплотную).
  • Устойчивость к электромагнитным помехам, так как он работает в спектральной области и ему все это не страшно.
  • Безопасность, так как чтобы перехватить данные, понадобится поставить другой приемник и направить его четко на ваш излучатель, по-другому перехватить данные, передаваемые по ИК-порту, невозможно.
Но у инфракрасного порта есть и минусы:
  • Цена. Построить большой и мощный передатчик стоит довольно дорого, да и обеспечить его питанием не так просто.
  • Низкая скорость передачи данных. Поэтому что-то больше передавать будет очень долго и скучно (вспоминаем передачу больших файлов по ИК-порту).
  • Большая зависимость от среды передачи данных. Например, если стало туманно, то дальность передачи сигнала резко упадет. Или если поставить что-то между приемником и передатчиком, то передача прервется.
Bluetooth
Изображение одного из хакатонов проведенных 7bits
Данная технология работает на небольших расстояниях, в большинстве телефонов до 10 метров. Хотя по спецификации может работать на расстоянии и до 400 метров. Также хочется отметить, что есть умельцы, которые смогли заставить его работать аж на 1,5 км, но там всё не так просто.
Сразу заметим, что Bluetooth не очень безопасен. Поскольку данные передаются в определённом радиусе, да, там есть какое-то шифрование, и да, создатели и сообщество прилагает всё больше и больше сил, чтоб сделать эту технологию безопаснее. Но всё равно надо быть осторожнее, работая с чем-либо по Bluetooth.
Реализация на мобильных платформах
Чтобы использовать на Android, нам понадобится запросить у пользователей разрешение на работу с этим самым Bluetooth, а также ещё и на работу с местоположением, поскольку по Bluetooth можно определять местоположение смартфона, и с этим всё немного сложно. И всё нужное для работы с Bluetooth в Android находится в пакете android.bluetooth.
А вот в iOS всё немного проще. Необходимо указать, что нам требуется Bluetooth, и всё, мы можем спокойно работать. Всё нужное для работы с bluetooth в iOS лежит в Core Bluetooth
Отличие Bluetooth Classic от Bluetooth Low Energy
Первое и самое важное, чем отличается Bluetooth Classic от Bluetooth Low Energy — это механизм работы. Когда мы используем Bluetooth Classic, то между двумя устройствами устанавливается стабильное, полнодуплексное соединение, то есть мы можем по нему как отправлять, так и получать сообщения. Данное соединение продолжительное и устойчивое, то есть мы установили соединение, и оно остаётся активным до тех пор, пока один из участников не решит его закрыть. Поддержание активным соединения требует довольно много энергии, из-за чего Bluetooth Classic очень быстро разряжает батарею. Чаще всего Bluetooth Classic используется для передачи любых видов потоковых данных, к которым можно отнести музыку, видео и тому подобное.
А вот Bluetooth Low Energy, в отличие от старшего брата, устанавливает соединение только на небольшой промежуток времени. За этот небольшой временной интервал происходит отправка и приём всех нужных сообщений, а затем соединение закрывается. Сообщения чаще всего небольшие, около 20 байт полезной нагрузки, можно и больше, но тогда Bluetooth сам начнёт делить его на части, и передача занимает ощутимо больше времени. И вот как раз за счёт использования небольших сообщений и установки соединения на небольшой период времени мы и получаем низкое потребление батареи, что сделало Bluetooth LE очень популярным среди IoT-устройств.
Схема работы Bluetooth Classic и Bluetooth Low Energy
Теперь давайте разберём схему работы с Bluetooth Classic. В самом общем случае она происходит следующим образом:
  1. Выполняем поиск устройств.
  2. Проводим сопряжение (или pairing). На этом этапе два устройства обмениваются ключами, которые обеспечивают относительно безопасное взаимодействие. А также определяют способ взаимодействия, и открывается соединение.
  3. Следующий шаг — процесс связывания (bonding). Это опциональный шаг, и он предназначен для того, чтобы запомнить ключи и при следующих попытках подключения пропускать шаг сопряжения устройств. Теперь мы можем передавать любые нужные или не очень потоковые данные через Bluetooth.
  4. Финальный шаг работы — закрытие соединения и отключения от устройства.
С Bluetooth Classic мы работали на проекте по управлению ассетами. Это небольшой проект, где мы получали данные и настройки с IoT-устройств, а затем могли менять настройки и передавать их обратно с помощью Bluetooth.
На проекте использовались следующие технологии:
  • Android, Java 8 (Kotlin тогда ещё набирал популярность и не стал основным языком для Android).
  • RxJava, которую мы использовали для написания асинхронных функций.
  • Bluetooth-Library, которая уже устарела, и в целом всё спокойно реализуется встроенными в Android библиотеками, и использовать какие-то обёртки я не советую.
Теперь рассмотрим, как работает Bluetooth Low Energy:
  1. Первый шаг остался без изменений — поиск устройств.
  2. И второй шаг тоже, выполняем сопряжение. То есть оба устройства обмениваются ключами, которые помогают обеспечивать какую-никакую, но безопасность.
  3. И третий шаг остаётся каким был — связывание. Оно может происходить, а можем обойтись и без него, всё зависит от наших целей.
  4. И единственная разница появляется на четвёртом шаге. Тут мы открываем соединение, передаём все нужные данные другому устройству и получаем их, если нужно. А затем закрываем соединение и отключаемся. Важный момент: есть два способа передать сообщение в Bluetooth LE — с подтверждением и без него. И если мы передаём без подтверждения, то есть шанс закрыть соединение, когда устройство на другой стороне не получило ещё все байты.
И давайте немного погрузимся в то, как устроен BLE. Это одна большая табличка, в которой ключ — это идентификатор устройства, а значение — набор сервисов. Сервисы, в свою очередь, имеют свой идентификатор и могут содержать от одной до нескольких характеристик. Характеристики отвечают за какое-то значение, они содержат свой идентификатор, само значение и могут содержать один дескриптор, но это необязательно. Дескриптор, в свою очередь, отвечает за какое-то дополнительное свойство или пояснение к характеристике, состоит из идентификатора и значения. И в BLE мы как раз работаем со значениями характеристики или дескриптора. Мы можем как читать их, так и записывать.
Давайте рассмотрим пример. Пусть есть устройство — комнатный термометр. Сервис — это термометр. У него две характеристики: одна отвечает за температуру в комнате, а вторая — за влажность в комнате. А дескриптором может быть, например, единицы измерения температуры, там, цельсии или фаренгейты. Или максимальный процент влажности.
Пример из практики: проект для бронирования машин
Проект, над котором мы работали с Bluetooth Low Energy — это проект для бронирования машин.
Из важного и интересного, в рамках статьи, на нём мы использовали следующее:
  • React Native
  • React Native BLE Manager
Bluetooth Low Energy мы тут использовали для того, чтобы иметь возможность открывать машины без ключа.
И кажется, что ничего сложного нет, но:
  • Есть небольшая проблема найти нужную машину среди всех ближайших устройств, да и машин. Это мы решили довольно просто, взяли идентификатор машины, захешировали его и взяли первые n символов, так как есть ограничение на имя устройства
  • Местоположение на Android. В какой-то момент на Android-телефонах у людей перестали находиться ближайшие устройства. И мы понять не могли, почему так происходит, вот другой телефон — всё ок, у нас всё ок. И только потом до нас дошло, что там человек выключил местоположение, а мы этот момент никак не обрабатывали. В итоге добавили библиотеку, которая проверяет, включено ли местоположение, и если нет, то отправляет запрос на его включение.
  • Также была проблема с передачей больших пакетов данных. Нам надо было передавать больше 20 байт. И тут появился вопрос, как это правильно сделать: передавать большой кусок и надеяться на BLE или делить по частям самим. Мы поэкспериментировали, и способ с BLE оказался в разы медленнее. Тогда мы решили делить этот пакет сами. И тут было два решения: либо делить сообщение на нашей стороне, либо воспользоваться встроенными функциями библиотеки. Изначально мы решили воспользоваться встроенными функциями библиотеки, но тут возникла проблема из-за внутреннего устройства. Мы пытались писать сообщения асинхронно, нам надо было записать две разные характеристики, и получилось так, что большое сообщение стало писаться то в одну, то в другую характеристику. В итоге мы решили сами делить сообщения и отправлять эти небольшие кусочки.
  • Также нужно обеспечить безопасность. Протокол Bluetooth не очень хорошо защищен, и при достаточных умениях и знаниях в нём легко натворить делов. И решение данной проблемы нам понадобится в будущем. Но пока всё устраивает так, как есть, так как тестирование этого функционала будет проводиться в закрытых и отдалённых от внешнего мира условиях.
  • И конечно, нам нужно уметь с разными автомобилями. И на ходу понимать, как и какую машину мы можем открыть и иметь к ней доступ. Но это снова задача на будущее, сейчас нам хватает одного автомобиля.
USB
Изображение одного из хакатонов проведенных 7bits
Если смартфон выступает в роли хоста, то он управляет любым подключенным к нему устройством, которое является аксессуаром и обеспечивает им всем необходимое питание.
А вот если смартфон выступает в роли аксессуара, то он знает и может работать лишь с одним подключенным устройством — хостом, которое также может служить источником питания для нашего смартфона.
Если еще раз и коротко, то разница между аксессуаром и хостом заключается в том, что аксессуар потребляет энергию и может работать только с хостом, отправляя данные ему. А хост раздает питание и отвечает за доступность к другим устройствам и может передавать какие-то данные на аксессуары.
Работа с USB на разных платформах
В Android, если мы хотим сделать наше устройство хостом, то тут все просто:
  • Открываем USB-соединение
  • Отправляем или читаем байты
  • Закрываем соединение
А вот в случае аксессуара лучше обратиться в специальный документ Android Open Accessory (AOA), в котором описан стандарт взаимодействия со смартфоном как с аксессуаром.
В iOS с USB все немного сложнее. Тут, в любом случае, нам надо попасть в программу Made For iOS (MFi). Других способов нет, и каких-то открытых источников или документации о том, как работать по USB с iOS-смартфонами, нет.
На примере Android разберем, как происходит вся работа по USB
Как и в случае с Bluetooth, нам надо найти нужное устройство. Тут есть несколько вариантов:
  • Фильтр намерений (IntentFilter), который позволит понять, когда нужное нам устройство было подключено, и начать с ним работать.
  • Либо внутри кода выполнить поиск по всем устройствам и обратиться к нужному.
Затем обязательно нужно запросить разрешение на работу с подключенным устройством, иначе операционная система пошлет нас куда подальше и скажет, что ничего не знаю — нельзя.
И затем мы можем работать — отправлять и принимать байты по USB.
Пример из практики: проект калибровки сенсоров
Проект, на котором нам довелось поработать с USB, был про настройку и калибровку сенсоров. Суть заключалась в том, что мы по USB подключали сенсор, получали его настройку, получали какие-то тестовые данные для него и меняли эти настойки или калибровали сенсор.
На проекте мы использовали следующие ключевые технологии:
  • Android, Java 8
  • felHR85/UsbSerial — библиотека, которая позволяла работать с USB как с серийным портом
То есть мы могли писать и читать по одному байту последовательно. На данный момент она не актуальна и давно не поддерживается, но есть аналог, например usb-serial-for-android.
Выводы и уроки проекта
  1. Важность мок-объектов
Mock’и важны и нужны. У нас не было физически этого сенсора, и поэтому мы изначально ничего не могли проверять в приложении, кроме пары экранов. Но как же хорошо, что какое-то время спустя заказчики подумали об этом, написали моки, и все жили долго и счастливо.
2. Рефакторинг старого кода
Второе, старый код иногда стоит выкинуть. Была у нас секция, которая работала с картой и местоположением, и работала она плохо, местоположение очень странно кэшировалось, все дергалось и глючило.
Поначалу мы пытались это как-то поддерживать, закрывать одни проблемы, но появлялись другие. В итоге мы просто выкинули старый сервис и переписали по новой с использованием более современного API по работе с картами и местоположением, и ура — все отлично заработало.
3. Особенности работы с файлами на Android
И последнее, но не по значению — файлы на Android это «страшно», особенно когда речь заходит о работе с версиями. Настройки и некоторые вещи нам надо было сохранять на телефоне, и вот незадача: с использованием одного и того же метода в разных версиях Android один и тот же файл сохранялся в разные места.
Где-то к нему можно было получить доступ извне легко, где-то нет. Да и, как вы все знаете, любое устройство, подключенное к Android (у которого под капотом Linux), это файл, с которым нам надо работать.
В целом, файлы на Android — это очень интересная тема, которая заслуживает отдельного внимания.
Wi-Fi
Изображение одного из хакатонов проведенных 7bits
И напоследок разберем Wi-Fi. Это ещё одна беспроводная технология передачи данных. В её основе лежат радиоволны, и она основана на стандарте IEEE 802.11, используется для доступа в интернет и создания локальных сетей.
Плюсы работы таким способом:
  • Большая скорость, все мы это хорошо знаем и работали с ним. Скорость даже простого Wi-Fi 2.4 GHz превосходит Bluetooth, а в Wi-Fi 5 GHz она стала ещё больше (хоть и пришлось пожертвовать силой сигнала).
  • Большая дальность, но тут важно смотреть на версии.
  • Защищенность, поскольку люди, когда его создавали, сразу задумались об этом, и всё есть в стандарте.
Однако минусы у данного способа тоже очень весомы:
  • Очень большое энергопотребление. Скорее всего, вам потребуется внешний источник питания или куча батареек.
  • Цена. Все Wi-Fi модули очень дорогие, особенно если сравнивать с Bluetooth или Bluetooth Low Energy.
Пример из практики: пульт для рентгеновского детектора
Проект, с которым нам довелось поработать с Wi-Fi, это как раз тот самый пульт для рентгеновского детектора.
Ключевые технологии, которые мы использовали:
  • Android, Kotlin
  • Самописная библиотека на Kotlin для взаимодействия по Wi-Fi с детектором.
Из опыта, полученного на этом проекте, хочется выделить следующее:
  1. Фасады и моки — это хорошо. Так как нам изначально скинули очень сырую версию библиотеки, где не все методы были реализованы, и мы поставили заглушки, потом их убрали. А потом и вовсе решили поменять Kotlin библиотеку на C++.
  2. Настраивать Wi-Fi непросто, пришлось какое-то время повозиться, чтобы детектор понял, что вот телефон надо общаться с ним, слушать от него команды и всё такое.
  3. В офисе всегда нужна большая железная кастрюля. С помощью неё мы проверяли, что происходит, если сила сигнала между детектором и телефоном уменьшается. Хотя выйти за несколько дверей иногда эффективнее.
Заключение
  • Берем ИК-порт, если мы знаем, что делаем, а также нам нужен защищенный способ беспроводной передачи данных.
  • Берем USB, если провода нас не смущают, а также нам нужен быстрый способ передачи данных, а ещё и дополнительное питание.
  • Берем Bluetooth Classic, если хотим работать без проводов и передавать какие-то потоковые данные. Ну и высокое энергопотребление — небольшая беда.
  • Берем Bluetooth Low Energy, если нам нужен беспроводной способ передачи небольшого объема данных и важно низкое энергопотребление.
  • И берем Wi-Fi, если хотим стрелять из пушки по воробьям. А вообще, если мы знаем, что делаем, нам нужен быстрый, защищенный способ передачи данных и мы можем покрыть высокое энергопотребление.
Грамотная приемка работ — залог успешного сотрудничества. Нужна помощь в разработке и прозрачной передаче проекта? Напишите нам на aloha@7bits.it — обсудим ваш проект.