Enable bluetooth page scan что это

Обновлено: 06.07.2024

Bluetooth стал очень популярной технологией, особенно на мобильных устройствах. Это технология для обнаружения и передачи данных между соседними устройствами. В наши дни практически каждое современное мобильное устройство обладает возможностями Bluetooth. Если вы хотите создать интерфейс приложения с другим устройством с поддержкой Bluetooth, от телефонов до динамиков, вы должны знать, как использовать Bluetooth API Android.

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

  • включить Bluetooth на устройстве
  • отобразить список сопряженных устройств
  • обнаружить и перечислить близлежащие устройства Bluetooth

Мы также рассмотрим основы подключения и отправки данных на другое устройство Bluetooth. Я создал проект для начала, который вы можете скачать с GitHub . На скриншоте ниже показано, как выглядит стартовый проект. Если вы застряли или столкнулись с проблемами, то вы можете взглянуть на готовый проект на GitHub .

Pre App Что дает данный стартовый код

1. Включение Bluetooth

Прежде чем мы сможем включить Bluetooth на устройстве Android, нам нужно запросить необходимые разрешения. Мы делаем это в манифесте приложения. Разрешение BLUETOOTH позволяет нашему приложению подключаться, отключаться и передавать данные с другого устройства Bluetooth. Разрешение BLUETOOTH_ADMIN позволяет нашему приложению обнаруживать новые устройства Bluetooth и изменять настройки Bluetooth устройства.

Мы будем использовать адаптер Bluetooth для взаимодействия с Bluetooth. Мы создаем экземпляр адаптера в классе ListActivity . Если адаптер null , это означает, что Bluetooth не поддерживается устройством, и приложение не будет работать на текущем устройстве. Мы справляемся с этой ситуацией, показывая пользователю диалоговое окно с предупреждением и закрывая приложение.

// Phone does not support Bluetooth so let the user know and exit. public void onClick(DialogInterface dialog, int which) < public class ListActivity extends ActionBarActivity implements DeviceListFragment.OnFragmentInteractionListener < Intent enableBT = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

2. Получение списка сопряженных устройств

На этом этапе мы сканируем сопряженные устройства Bluetooth и отображаем их в виде списка. В контексте мобильного устройства устройство Bluetooth может быть:

Важно знать разницу между сопряженным и подключенным устройством Bluetooth. Сопряженные устройства знают о существовании друг друга и имеют общий ключ связи , который можно использовать для аутентификации, что приводит к установлению соединения. Устройства автоматически подключаются после установления зашифрованного соединения.

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

Устройства Bluetooth представлены объектом BluetoothDevice . Список сопряженных устройств можно получить, вызвав метод getBondedDevices() , который возвращает набор объектов BluetoothDevice . Мы вызываем метод getBondedDevices() в DeviceListFragment onCreate() .

Set<BluetoothDevice> pairedDevices = bTAdapter.getBondedDevices();

Мы используем getName() и getAddress() для получения дополнительной информации об устройствах Bluetooth. Метод getName() возвращает открытый идентификатор устройства, а метод getAddress() возвращает MAC-адрес устройства , идентификатор, однозначно идентифицирующий устройство.

Теперь, когда у нас есть список сопряженных устройств, мы создаем объект DeviceItem для каждого объекта BluetoothDevice . Затем мы добавляем каждый объект DeviceItem в массив с именем deviceItemList . Мы будем использовать этот массив для отображения списка сопряженных устройств Bluetooth в нашем приложении. Код для отображения списка объектов DeviceItem уже присутствует в стартовом проекте.

3. Откройте для себя близлежащие устройства Bluetooth

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

Сначала нам нужно создать BroadcastReceiver и переопределить метод onReceive() . Метод onReceive() вызывается всякий раз, когда обнаруживается устройство Bluetooth.

public class DeviceListFragment extends Fragment implements AbsListView.OnItemClickListener< private final BroadcastReceiver bReciever = new BroadcastReceiver() < public void onReceive(Context context, Intent intent) < BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

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

Мы также ArrayAdapter объект mAdapter , mAdapter , когда начинается обнаружение. Когда мы начинаем сканирование, мы не хотим включать старые устройства, которые могут больше не находиться в пределах досягаемости устройства.

public View onCreateView(LayoutInflater inflater, ViewGroup container, View view = inflater.inflate(R.layout.fragment_deviceitem_list, container, false); ToggleButton scan = (ToggleButton) view.findViewById(R.id.scan); scan.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() < public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) < IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);

Вот и все. Мы закончили наш сканер Bluetooth.

4. Подключение к устройству

Соединения Bluetooth работают как любое другое соединение. Есть сервер и клиент, которые общаются через сокеты RFCOMM. В Android сокеты RFCOMM представлены в виде объекта BluetoothSocket . К счастью для нас, большая часть технического кода для серверов обрабатывается Android SDK и доступна через Bluetooth API.

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

Как только BluetoothSocket создан, вы вызываете connect() для BluetoothSocket . Это инициализирует соединение с BluetoothDevice через гнездо RFCOMM. Как только наше устройство подключено, мы можем использовать сокет для обмена данными с подключенным устройством. Это похоже на любую стандартную реализацию сервера.

Поддержание соединения Bluetooth стоит дорого, поэтому нам нужно закрыть сокет, когда он нам больше не нужен. Чтобы закрыть сокет, мы вызываем close() на BluetoothSocket .

В следующем фрагменте кода показано, как подключиться к данному BluetoothDevice :

Для начала должен сказать, что услышал всех тех людей, которые просили меня найти решение повышенному расходу батареи пунктом «Система Android» после обновления на MIUI 12.

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

А ещё хотелось бы ответить на вопрос: Как включить постепенное нарастание громкости звонка при использовании звонилки от Google ?

Оптимизация Bluetooth соединения

Ещё одной проблемой, на которую жалуются многие пользователи после обновления на MIUI 12, стал периодический разрыв связи между смартфоном и браслетами / часами / беспроводными наушниками.

Всем кто столкнулся с подобными проблемами я рекомендую сделать несколько манипуляций, которые могут помочь:

1. Заходите в «Настройки» —> Защита конфиденциальности —> Специальные разрешения (в MIUI 11 расположение другое и проще воспользоваться поиском).

Затем нажимаете на «Экономия заряда батареи» —> выбираете «Все приложения» —> находите в списке системную службу «Bluetooth» —> активируете режим без экономии.

2. Если и это не помогает, возвращаетесь в главное меню настроек —> заходите в пункт «Bluetooth» —> Расширенные настройки —> и выключаете пункт «Подключать совместимые ус…».

Выключение скрытых китайских сервисов

Это одна из последних настроек, которую я рекомендую отключить для повышения автономности вашего смартфона под управлением MIUI 11 или 12.

Для её деактивации, нам снова понадобится приложение «Запуск Activity» (Activity Launcher), так что если у вас оно не установлено, вы сможете скачать его по ссылке в конце статьи.

Запускаете программу, дожидаетесь окончания загрузки, ищите в списке приложение «Безопасность» и нажимаете на него.

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

А всё что не используется - должно быть отключено, чтобы не тратить ресурсы системы. Поэтому поочерёдно заходите в каждый из пунктов и выключаете все активные функции.

Перевод прикреплять не буду, но поверьте, ничего полезного в этих функциях нет, а негативных последствий, после отключения на смартфонах для тестов (Redmi Note 8T, Redmi Note 8 Pro, Redmi Note 9) я не заметил.

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

Хотя Bluetooth имеет ту же частоту 2,4 ГГц , что и Wi-Fi, его свойства отличаются, так как протоколы не совсем одинаковые. Существует повышенная безопасность, так что популярные инструменты взлома Wi-Fi не будут работать на Bluetooth.

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

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

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

Что вам понадобится для Bluetooth-разведки?
Для начала Bluetooth-наблюдения Вам понадобится полностью обновленная версия Kali Linux, потому что мы будем использовать встроенные инструменты Bluetooth. Чтобы сохранить супер-основные вещи, мы не устанавливаем ничего лишнего, и мы можем просто работать с Bluetooth инструментами, которые Kali Linux имеет по умолчанию.

Встроенные инструменты, которые мы рассмотрим ниже, включают hciconfig , hcitool , sdptool , l2ping и btscanner . Многие из этих инструментов включены в BlueZ , стек протоколов Bluetooth по умолчанию почти в каждой версии Linux, включая Kali. (Мы также будем использовать некоторые специализированные инструменты для Bluetooth-разведки в Kali Linux).

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


Шаг 1 - Включите адаптер Bluetooth с помощью hciconfig
Если вы знакомы с ifconfig для карт и адаптеров Wi-Fi, есть еще один инструмент, аналогичный для устройств Bluetooth. И это называется hciconfig .

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

Если у нас есть Wi-Fi интерфейс, который подключен, но еще не готов, мы можем ввести ifconfig , затем имя интерфейса, а затем вверх. Так как hciconfig в основном то же самое, что ifconfig , мы можем использовать множество тех же команд, которые вы можете увидеть на странице руководства.

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

Теперь, когда мы знаем немного больше о hciconfig, давайте продолжим и нажмите Q , чтобы выйти. Нам нужно взять обнаруженное нами устройство Bluetooth и запустить его. Просто введите hciconfig , затем имя устройства, которое мы нашли, и вверх .


Чтобы увидеть, сработало ли это, снова запустите команду hciconfig :

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

Hcitool используется для настройки и выполнения различных задач, таких как сканирование, запросы и извлечение имен. Это действительно полезно, чтобы узнать об устройстве, но некоторые из этих команд требуют MAC-адрес для их использования.

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


Выше мы видим разъем OBD2, который подключен к автомобилю. Это довольно интересно. С MAC-адресом мы можем теперь сделать другую команду, которая требовала, чтобы у нас был MAC-адрес. Давайте попробуем получить название устройства:

Это должно позволить нам получить название устройства, но мы уже знали это с того первого сканирования. Однако, если мы этого не знаем, это позволит нам узнать больше об этом. Чтобы узнать больше, мы можем использовать команду inq :

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

Шаг 3 - Сканирование служб с помощью sdptool
Чтобы узнать больше об услугах, мы можем использовать инструмент под названием sdptool, чтобы узнать больше о том, что доступно на устройстве, и узнать о свойствах - возможно, что мы можем и не можем сделать. Нам нужно будет снова использовать MAC-адрес, но сначала давайте проверим его справочную страницу:

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

Выйдите из man-страницы, наберите sdptool , затем просмотрите , а затем MAC-адрес, который мы захватили.

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

Шаг 4 - Пинг устройств Bluetooth с помощью l2ping
Теперь, когда у нас есть MAC-адреса всех соседних устройств, мы можем проверить их с помощью инструмента под названием l2ping , независимо от того, находятся они в режиме обнаружения или нет, чтобы узнать, доступны ли они. Для меня это всего лишь одно устройство. Прежде чем сделать это, давайте запустим человек страницу для инструмента просто увидеть все , что доступно.


Нам не нужно ничего делать здесь, просто пингуйте устройство Bluetooth следующим образом:

Это указывает на то, что устройство находится в пределах досягаемости и доступно.

Шаг 5 - Сканирование Bluetooth-устройств с помощью btscanner
Теперь пришло время перейти к последнему инструменту, который мы собираемся охватить, - это полноценный графический пользовательский интерфейс, используемый для обнаружения устройств Bluetooth. Он называется btscanner , и как только мы его запустим, мы можем набрать btscanner . Но перед этим, так как мы просмотрели справочные страницы по остальным инструментам, давайте кратко рассмотрим и здесь:


Вы можете видеть, что btscanner не так много, и это потому, что это инструмент с графическим интерфейсом, всё происходит после запуска инструмента, поэтому давайте сделаем это сейчас:

bt-recon-snoop-bluetooth-devices-using-kali-linux.w1456.jpg


Интерфейс может выглядеть немного похожим на людей, знакомых с интерфейсом Kismet , что позволяет нам делать много вещей в формате командной строки с чувством GUI . Это полезно и здорово, потому что это означает, что, набрав i , мы можем начать сканирование запросов и найти близлежащие устройства Bluetooth, и это может позволить нам подключиться или установить команду или что-то в этом роде.

bt-recon-snoop-bluetooth-devices-using-kali-linux.w1456 (1).jpg


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

bt-recon-snoop-bluetooth-devices-using-kali-linux.w1456 (2).jpg

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

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

bt-recon-snoop-bluetooth-devices-using-kali-linux.w1456 (3).jpg

Если у вас нет Bluetooth на вашем компьютере, вы всегда можете подключить адаптер Bluetooth, но вы можете проверить его совместимость, прежде чем идти дальше и решать проблемы. Я не уверен, что каждый адаптер Bluetooth будет работать с любой программой Linux.

Выше видно, что мы нашли второе устройство, так что давайте продолжим и нажмем на него.

bt-recon-snoop-bluetooth-devices-using-kali-linux.w1456 (4).jpg

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

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

То, что мы узнали в статье.
Сегодня мы изучили разведку Bluetooth, и есть несколько более сложных вещей, которые мы можем сделать с этой информацией. Многие устройства Bluetooth не пытаются рандомизировать свой MAC-адрес, а это означает, что он будет одинаковым все время. Это может быть использовано для отслеживания человека с места на место.

Например, трекеры Bluetooth Tile , где вы можете найти потерянный предмет у любого, у кого запущено приложение. Это означает, что человек отслеживается, и его невозможно отключить. Если вы хотите отказаться от такого рода отслеживания, обязательно отключите Bluetooth на таких устройствах, как сотовый телефон. Но для устройств, которые, естественно, включают его, таких как трекер, нет другого выбора, кроме как оставить его дома.

Bluetooth является беспроводной технологией для создания персональных сетей на расстоянии не более 10 метров, работающей на частоте 2.4 ГГц, которая не подлежащит лицензированию. Обычно такие сети формируются из портативных устройств, таких, как сотовые телефоны, КПК и лаптопы. В отличие от Wi-Fi, другой популярной беспроводной технологии, Bluetooth предоставляет более высокий уровень сервиса, например, файловые серверы типа FTP, передачу файлов, голоса, эмуляцию последовательного порта и другие.

Стек протоколов Bluetooth во FreeBSD реализован на основе технологии Netgraph (обратитесь к netgraph (4) ). Широкий спектр USB-устройств Bluetooth поддерживается драйвером ng_ubt (4) . Устройства Bluetooth на основе набора микросхем Broadcom BCM2033 поддерживается драйвером ng_bt3c (4) . Устройства Bluetooth, работающие через последовательные и UART-порты, поддерживаются драйверами sio (4) , ng_h4 (4) и hcseriald (8) . В этой главе описывается использование Bluetooth-устройств, подключаемых через USB. Поддержка Bluetooth имеется во FreeBSD 5.0 и более новых версиях системы.

19.4.2 Подключение устройства

По умолчанию драйверы устройств Bluetooth поставляются в виде модулей ядра. Перед подключением устройства вам необходимо подгрузить драйвер в ядро.

Если Bluetooth-устройство в момент запуска системы подключено, то загружайте модуль из файла /boot/loader.conf.

19.4.3 Host Controller Interface (HCI)

Host Controller Interface (HCI) предоставляет интерфейс для управления контроллером передатчика и менеджером соединений, а также доступ к данным о состоянии оборудования и его управляющим регистрам. Этот интерфейс предоставляет унифицированный метод доступа к передающим возможностям Bluetooth. Уровень HCI на управляющей машине обменивается данными и командами с микрокодом HCI в оборудовании Bluetooth. Драйвер для Host Controller Transport Layer (то есть физической шины) предоставляет обоим слоям HCI возможность обмениваться данными друг с другом.

Для одного Bluetooth-устройства создаётся один узел Netgraph типа hci . HCI-узел обычно подключается к узлу драйвера устройства Bluetooth (входящий поток) и к узлу L2CAP (исходящий поток). Все операции с HCI должны выполняться на узле HCI, но не на узле драйвера устройства. В качестве имени по умолчанию для узла HCI используется ``devicehci''. Дополнительные подробности можно найти на справочной странице ng_hci (4) .

Одной из самой часто выполняемой задач является обнаружение Bluetooth-устройств в радиусе RF-доступности. Эта операция называется опросом (inquiry). Опрос и другие операции, связанные с HCI, выполняются при помощи утилиты hccontrol (8) . Пример ниже показывает, как найти доступные устройства Bluetooth. Список таких устройств должен быть получен в течение нескольких секунд. Заметьте, что удалённые устройства будут отвечать на опрос, если только они находятся в режиме обнаруживаемости (discoverable).

BD_ADDR является уникальным адресом устройства Bluetooth, вроде MAC-адресов сетевых адаптеров. Этот адрес необходим для дальнейшей работы с устройством. Адресу BD_ADDR можно присвоить удобное для чтения имя. Файл /etc/bluetooth/hosts содержит информацию об известных хостах Bluetooth. В следующем примере показано, как получить имя, назначенное удалённому устройству.

Если вы выполните опрос на другом Bluetooth-устройстве, но ваш компьютер будет опознан как ``your.host.name (ubt0)''. Имя, назначаемое локальному устройству, может быть в любой момент изменено.

Система Bluetooth предоставляет услуги по соединениям типа точка-точка (при этом задействованы только два устройства Bluetooth) или точка-ко-многим-точкам. В последнем случае соединение используется совместно несколькими устройствам Bluetooth. В следующем примере показывается, как получить список активных для локального устройства соединений.

Идентификатор соединения ( connection handle ) полезен, когда необходимо прекратить соединение. Заметьте, что обычно нет нужды делать это вручную. Стек будет автоматически разрывать неактивные соединения.

Обратитесь к помощи посредством hccontrol help для получения полного списка доступных HCI-команд. Большинство команд HCI для выполнения не требуют прав администратора системы.

19.4.4 Logical Link Control and Adaptation Protocol (L2CAP)

Протокол L2CAP (Logical Link Control and Adaptation Protocol) предоставляет услуги по работе с данными, как ориентированные на соединения, так и без ориентации на них, протоколам более высокого уровня с возможностями мультиплексирования и обеспечением операций по сегментации и обратной сборке. L2CAP позволяет протоколам более высокого уровня и приложениям передавать и получать пакеты данных L2CAP длиной до 64 Кбайт.

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

Для одного Bluetooth-устройства создается один узел Netgraph типа l2cap . Узел L2CAP обычно подключается к узлу Bluetooth HCI (нижестоящий) и узлам Bluetooth-сокетов (вышестоящие). По умолчанию для узла L2CAP используется имя ``devicel2cap''. Для получения дополнительной информации обратитесь к справочной странице по ng_l2cap (4) .

Полезной является программа l2ping (8) , которая может использоваться для проверки связи с другими устройствами. Некоторые реализации Bluetooth могут не возвращать все данные, посылаемые им, так что 0 bytes в следующем примере - это нормально.

Утилита l2control (8) используется для выполнения различных операций с узлами L2CAP. В этом примере показано, как получить список логических соединений (каналов) и перечень радиосоединений локального устройства.

Ещё одним диагностическим инструментом является btsockstat (1) . Она выполняет действия, подобные тем, что обычно выполняет netstat (1) , но со структурами данных, связанных с работой в сети Bluetooth. В примере ниже описывается то же самое логическое соединение, что и с l2control (8) выше.

19.4.5 Протокол RFCOMM

Протокол RFCOMM эмулирует последовательные порты поверх протокола L2CAP. Он основан на ETSI-стандарте TS 07.10. RFCOMM представляет собой простой транспортный протокол, с дополнительными возможностями по эмуляции 9 цепей последовательных портов RS-232 (EIATIA-232-E). Протокол RFCOMM поддерживает одновременно до 60 соединений (каналов RFCOMM) между двумя устройствами Bluetooth.

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

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

Во FreeBSD протокол RFCOMM реализован на уровне сокетов Bluetooth.

19.4.6 Pairing of Devices

По умолчанию связь Bluetooth не аутентифицируется, поэтому любое устройство может общаться с любым другим. Устройство Bluetooth (например, сотовый телефон) может задать обязательность аутентификации для предоставления определённого сервиса (в частности, услугу доступа по коммутируемой линии). Bluetooth-аутентификация обычно выполняется через PIN-коды . PIN-код представляет из себя ASCII-строку длиной до 16 символов. Пользователь обязан ввести один и тот же PIN-код на обоих устройствах. Как только он введёт PIN-код, оба устройства сгенерируют ключ связи . После этого ключ может быть сохранён либо в самом устройстве, либо на постоянном носителе. В следующий раз оба устройства будут использовать ранее сгенерированный ключ соединения. Процедура, описанная выше, носит название подгонки пары (pairing). Заметьте, что если ключ связи потерян любой из сторон, то подбор пары должен быть повторен.

За обработку всех запросов на Bluetooth-аутентификацию отвечает даемон hcsecd (8) . По умолчанию файл конфигурации называется /etc/bluetooth/hcsecd.conf. Пример раздела, содержащего информацию о сотовом телефоне с явно заданным PIN-кодом ``1234'' приведен ниже.

Кроме длины, на PIN-коды не накладывается никаких ограничений. Некоторые устройства (например, Bluetooth-гарнитуры) могут иметь фиксированный встроенный PIN-код. Параметр -d позволяет запустить hcsecd (8) как нефоновый процесс, что облегчает просмотр происходящих событий. Задайте получение парного ключа на удалённом устройстве и инициируйте Bluetooth-соединение с этим устройством. Удалённое устройство должно подтвердить получение пары и запросить PIN-код. Введите тот же самый код, что находится в hcsecd.conf. Теперь ваш ПК и удалённое устройство спарены. Альтернативным способом является инициация процесса создания пары на удалённом устройстве. Ниже даётся пример выдачи протокола команды hcsecd.

19.4.7 Service Discovery Protocol (SDP)

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

SDP подразумевает коммуникации между SDP-сервером и SDP-клиентом. Сервер поддерживает список сервисов, в котором описываются параметры сервисов, связанных с сервером. Каждая запись об услуге содержит информацию об одном сервисе. Клиент может запросить информацию об опеределённом сервисе, обслуживаемом SDP-сервером, выдавая SDP-запрос. Если клиент или приложение, связанное с клиентом, решат воспользоваться сервисом, то для его использования необходимо открыть отдельное соединение к устройству, предоставляющему сервис. SDP предоставляет механизм обнаружения услуг и их параметров, но не даёт механизма использования этих сервисов.

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

Существующие на данный момент серверы и клиенты SDP реализованы в пакете стороннего разработчика sdp-1.5, который можно сгрузить здесь. Утилита sdptool является SDP-клиентом, управляемым из командной строки. В следующем примере показано, как выполнять запрос на SDP-обзор.

. и так далее. Заметьте, что каждый сервис имеет перечень атрибутов (например, канал RFCOMM). В зависимости от сервиса вам может потребоваться где-то сохранить эти атрибуты. Некоторые реализации Bluetooth не поддерживают просмотр сервисов и могут возвращать пустой список. В этом случае возможен поиск конкретной услуги. В примере ниже показано, как выполнить поиск службы OBEX Object Push (OPUSH).

Во FreeBSD предоставление сервисов клиентам Bluetooth осуществляется сервером sdpd.

Для регистрации сервиса в локальном SDP-сервере также применяется утилита sdptool. В примере ниже показывается, как зарегистрировать Network Access с услугой PPP (LAN). Заметьте, что некоторые сервисы требуют указания их атрибутов (например, канала RFCOMM).

19.4.8 Доступ к сети по коммутируемой линии связи (DUN) и по протоколу PPP (LAN)

Модуль работы с коммутируемым доступом к сети (DUN - Dial-Up Networking) в большинстве случаев используется с модемами и сотовыми телефонами. Этот модуль покрывает следующие случаи:

сотовый телефон или модем используется вместе с компьютером в качестве беспроводного модема для подключения к серверу коммутируемого доступа в Интернет, или другой коммутируемой услуге;

сотовый телефон или модем используется компьютером для приёма входящих соединений.

Модуль доступа к сети по протоколу PPP (Network Access with PPP - LAN) может использоваться в следующих ситуациях:

доступ к ЛВС для одного Bluetooth-устройства;

доступ к ЛВС для нескольких Bluetooth-устройств;

связь между двумя ПК (при помощи протокола PPP поверх эмулируемого последовательного канала связи).

Во FreeBSD оба случая реализуются при помощи сервисных программ ppp (8) и rfcomm_pppd (8) - это обработчик, преобразующий RFCOMM-соединения Bluetooth в нечто, с чем может работать PPP. Перед тем, как использовать любой модуль, в файле /etc/ppp/ppp.conf должна быть создана новая PPP-метка. Примеры использования можно найти в справочной странице к rfcomm_pppd (8) .

В следующем примере rfcomm_pppd (8) будет использоваться для открытия RFCOMM-соединения к удалённому устройству с BD_ADDR 00:80:37:29:19:a4 на DUN RFCOMM-канале. Реальный номер RFCOMM-канала будет получаться с удалённого устройства через SDP. Возможно указать RFCOMM-канал вручную, и в этом случае rfcomm_pppd (8) не будет выполнять SDP-запрос. Для нахождения RFCOMM-канала на удалённом устройстве используйте утилиту sdptool.

19.4.9 OBEX Push (OPUSH) Profile

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

Сервер и клиент OBEX реализованы в виде пакета стороннего разработчика obexapp-1.0, который можно сгрузить отсюда. Пакет требует наличия библиотеки openobex (она включена в пакет) и порта devel/glib12. Заметьте, что для работы obexapp привилегий администратора системы не требуются.

Клиент OBEX используется для посылки или приёма объектов с сервера OBEX. Объектом, к примеру, может быть визитная карточка или указание. Клиент OBEX может получить номер RFCOMM-канала, указав вместо него имя сервиса. Поддерживаются следующие имена сервиса: IrMC, FTRN и OPUSH. Канал RFCOMM можно задать его номером. Ниже даётся пример сеанса OBEX, где с сотового телефона забирается объект с информацией об устройстве, а новый объект (визитная карточка) передаётся в каталог сотового телефона.

19.4.10 Модуль последовательного порта (SP)

Модуль последовательного порта (SP - Serial Port) позволяет Bluetooth-устройству осуществлять эмуляцию последовательного порта RS232 (или подобного). Этот модуль покрывает случаи, касающиеся работы унаследованных приложений с Bluetooth в качестве замены кабельному соединению, при это используется абстракция виртуального последовательного порта.

Утилита rfcomm_sppd (1) является модулем, реализующим последовательный порт. В качестве виртуального последовательного порта используется псевдотерминал. В примере ниже показано, как подключиться к сервису Serial Port удалённого устройства. Заметьте, что вы не указываете RFCOMM-канал - rfcomm_sppd (1) может получить его с удалённого устройства через SDP. Если вы хотите переопределить это, укажите RFCOMM-канал явно в командной строке.

После подключения псевдотерминал можно использовать как последовательный порт.

19.4.11 Решение проблем

19.4.11.1 Удалённое устройство не подключается

Некоторые старые Bluetooth-устройства не поддерживают переключение ролей. По умолчанию, когда FreeBSD подтверждает новое соединение, она пытается выполнить переключение роли и стать ведущим устройством. Устройства, которые это не поддерживают, не смогут подключиться. Заметьте, что переключение ролей выполняется при установлении нового соединения, поэтому невозможно выяснить, поддерживает ли удалённое устройство переключение ролей. На локальной машине имеется возможность отключить переключение ролей при помощи HCI-параметра.

19.4.11.2 Что-то идёт не так, можно ли посмотреть, что в точности происходит?

Да, можно. Воспользуйтесь пакетом hcidump-1.5 стороннего разработчика, который доступен для сгрузки здесь. Утилита hcidump похожа на tcpdump (1) . Она может использоваться для вывода на терминал содержимого Bluetooth-пакетов и сбрасывать пакеты Bluetooth в файл.

Читайте также: