понедельник, 4 мая 2009 г.

Настройка GPRS (Sony Ericsson K530i) в Linux (Debian) через Bluetooth-контроллер

В предыдущей статье я настроил доступ в Internet по GPRS через USB-кабель телефона. В той статье также описана настройка доступа через Bluetooth-интерфейс.

28 апреля я из чистого интереса к новым технологиям решил купить Bluetooth-контроллер. Я прошёлся по сайтам местных магазинов и выписал все Bluetooth-контроллеры, которые были в наличии. Их было довольно много и естественно я не знал, какой из них мне выбрать. Выбирать по внешнему виду, цвету и цене было бы глупо. Хотя, я думаю, большинство покупателей интересуют только эти характеристики :)

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

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

2. поддерживать стандарт Bluetooth 2.0 как минимум. Данный стандарт позволяет осуществлять обмен данными на скорости до 3 мегабит в секунду. Опять же, скорость обмена во многом определяется наличием перекрытий, дальностью между источником и приёмником, от зашумлённости радиосреды, от наличия в зоне радиосвязи других Bluetooth-устройств и их активности, а также снижается из-за накладных расходов на передачу служебной информации.
- иметь интерфейс USB 2.0. В принципе, USB 2.0 отличается от USB 1.0 (или 1.1) наличием дополнительной скорости приёма-передачи - 25-480 мегабит в секунду, поэтому для обслуживания радиопередатчика, работающего на скорости 3 мегабита в секунду было бы достаточно и разъёма USB 1.0 (1.1), но душе было угодно пользоваться именно USB 2.0 :)

3. поддерживать как можно больше Bluetooth-профилей. Bluetooth-профиль - это разновидность сервиса, который может поддерживать Bluetooth-устройство. Это могут быть сервисы передачи файлов (OBEX), модемный сервис (DUN), передача звуковой информации (A2DP) и тому подобные сервисы. Самое главное - должны поддерживаться синхронный (SCO) и асинхронный (ACL) режимы передачи данных. Синхронный режим предназначен для передачи аудио-информации, передаваемые пакеты в нём не подтверждаются, поэтому потерянные при передаче данные не передаются повторно. В асинхронном режиме осуществляется подтверждение приёма информации, этот режим ориентирован на передачу разнородных данных.

4. должен работать в Linux. Тут всё понятно и без слов.

Больше всего по этим параметрам мне приглянулся контроллер Tekram TM-308, который я и приобрёл в тот же день.

Итак, вставляем Bluetooth-контроллер в USB-разъём. Устанавливаем служебные программы для работы с Bluetooth-устройствами:
# aptitude install bluez-utils
И подгружаем модуль ядра для работы с Bluetooth-устройствами:
# modprobe hci_usb
Открываем на редактирование файл /etc/bluetooth/hcid.conf и приводим его к следующему виду:
options {
  autoinit yes;
  security auto;
  pairing multi;
  passkey "1234";
}
Где 1234 - PIN-код, который будет использоваться для получения доступа к компьютеру. Это может быть довольно длинный пароль из латинских букв в разном регистре, цифр и знаков препинания.

Запускаем службу Bluetooth:
# /etc/init.d/bluetooth start
Теперь нужно найти телефон. Активируем Bluettoth на телефоне. Запускаем поиск Bluetooth-устройств, находящихся поблизости:
$ hcitool scan
Должно найтись устройство, соответствующее вашему телефону. На телефоне можно выставить Bluetooth-имя устройства. Если вы не выставляли его сами, то скорее всего именем будет модель телефона.

Выписываем MAC-адрес, соответствующий телефону. MAC-адрес моего телефона - 00:21:9E:1D:A5:17, далее в статье будет фигурировать он.

Запускаем перечислтель профилей Bluetooth, поддерживаемых устройством.
$ sdptool browse 00:21:9E:1D:A5:17
В выдаче нужно найти номер канала, соответствующего профилю DUN или Dialup Networking. Если вы не нашли профиль DUN или Dialup Networking, то можно воспользоваться профилем NAP или PAN, хотя он предназначен для создания локальной сети из нескольких Bluetooth-устройств.

Теперь приведём файл /etc/bluetooth/rfcomm.conf в соответствии с найденными MAC-адресом и каналом. У меня получилось вот так:
rfcomm0 {
  bind yes;
  device 00:21:9E:1D:A5:17;
  channel 2;
  comment "Dial-up networking gateway";
}
Где 00:21:9E:1D:A5:17 - MAC-адрес телефона, а 2 - номер профиля DUN.

Проводим первичное подключение к телефону с помощью команды:
$ rfcomm connect 0 00:21:9E:1D:A5:17 2
Где 0 - номер устройства /dev/rfcomm0, 00:21:9E:1D:A5:17 - MAC-адрес телефона и 2 - номер канала DUN.

После выполнения этой команды телефон запросит разрешение на подключение со стороны компьютера. Нужно ввести PIN-код, который мы прописали в соответствие телефону в файле /etc/bluetooth/hcid.conf и указать опцию - "разрешать автоматическое подключение".

Теперь осталось исправить название устройства в файле /etc/ppp/peers/megafon и прописать вместо оставшегося там с прошлой статьи устройства ttyACM0 устройство rfcomm0.

Теперь можно установить GPRS-подключение в Интернет:
# pon megafon
Отключиться можно как и прежде:
# poff megafon
Использованные пр подготовке статьи материалы:
  1. Bluetooth - Википедия - статья в Википедии, где описаны классы и профили Bluetooth
  2. Подключение GPRS/EDGE в GNU/Linux - статья, по которой была написана моя прошлая заметка
  3. Настройка GPRS (Sony Ericsson K530i) в Linux (Debian) - моя прошлая заметка
  4. Bluesnarfing - взлом Bluetooth-устройств с помощью направленной антенны

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

P.P.S. Одним из интересных и, на мой взгляд, спорных моментов Bluetooth-стека в Linux, является жёсткая привязка к подсистеме D-Bus. В FreeBSD и NetBSD такой привязки нет.

Одной из особенностей современных операционных систем на базе Linux является довольно интересное противоречие подходов к разработке системы. Существует как бы два лагеря разработчиков Linux: условно назовём их системщиками и прикладниками. Системщики хорошо помнят ценности Unix и продолжают вести разработки в духе Unix, прикладники по большей части духа Unix не чувствуют и делают в основном так, чтобы было не хуже чем в Windows. Работая с Linux'ом можно понять, что существует два Linux'а: пропитанный Unix-традициями консольный неразговорчивый Linux-раб и гламурный и дружественный Linux-приятель. Если вы знаете Linux только со стороны Gnome или KDE, в большинстве случаев можно с большой уверенностью сказать, что собственно Linux вы и не знаете - вам знакома лишь его оболочка, которая совершенна ему чужда.

В последнее время наблюдается взаимопроникновение этих двух подходов разработки. Одним из таких сигналов является привязка подсистемы D-Bus к Bluetooth-стеку. Другим характерным сигналом является привязка X-сервера к уровню абстракции от оборудования HAL, тоже работающему только совместно с D-Bus. Проблема в том, что прикладники постепенно портят всё то, что нравится в Linux системщикам. Следует заметить, что эта тема волнует не меня одного. Например прямо на этой неделе в рассылке russian-debian уже поднималась эта тема:
xserver-xorg и hal

Эта тенденция довольно печальна и периодически заставляет задумываться о необходимости поиска и освоения "более других" систем...

2 комментария:

Dmitry S. Dolzhenko комментирует...

Не подскажите в чем может быть проблема - при подключении к телефону ( та же модель что и в статье ) тот запрашивает пин код, ввожу пин из файла hcid.conf но соединение не происходит: телефон пишет "Сбой соединения .... "

morbo комментирует...

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