Обзор Bluetooth

Первая статья серии, рассказывающей о работе Bluetooth в Linux

[Guylhem Aznar. Перевод: Сгибнев Михаил (www.dreamcatcher.ru)]

Original
Оригинал перевода

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

Вы знакомы с Bluetooth? Может быть, вы даже использовали эту технологию с вашим сотовым телефоном или наушниками? Если это так, то вы можете задуматься, как получить больше, особенно если вам доступна только техническая литература, полная всяких умных слов вроде "piconets" или "scatternets", но лишенная прикладных задач.

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

Итак, мы рассмотрим сборку и настройку модуля Bluetooth, обзор устройств беспроводной сети и соединение с ними. Я представлю сервис PAN, обеспечивающий работу с беспроводными IP-сетями.

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

Чего мы хотим добиться? Необходимо синхронизировать беспроводные устройства, экспортировать последовательный порт для работы факса или модема, обмен файлами и работа HID периферии.

Определения

Чем является Bluetooth? Есть много определений, но лично мне больше нравится - WiFi с уменьшеным энергопотреблением.

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

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

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

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

Ядро Linux может использовать различные программные стеки. Самые известные - bluez и affix. Я предпочитаю bluez, потому что теперь он входит в состав ядра Linux.

Установка

Аппаратное обеспечение
Есть три основных реализации Bluetooth: USB, последовательный порт и PCMCIA. Возможно, в ваш компьютер Bluetooth уже установлен? Для того, чтобы выяснить это, обратитесь к документации на компьютер.

PCMCIA карты обычно представляют собой мост PCMCIA-to-serial и сам чип Bluetooth при бо`льшей стоимости. Поэтому, если необходимого устройства у вас нет, остановите свой выбор на последовательном или USB устройстве.

Я рекомендую D-Link DBT-120, поскольку содержит удобные особенности, которые я рассмотрю несколько позже, особенно если вы будете использовать клавиатуру Bluetooth. Если нет каких либо предпочтений, то вы можете приобрести любой USB адаптер. Адаптеры для последовательных линий обычно более дороги и медленны.

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

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

Большое количество сайтов содержат решения, как добавить поддержку Bluetooth к наладонникам Siemens Simpad, Sharp Zaurus или Psion MX. Вот некоторые из них: Конечно, помимо проводов, припаяных к материнской плате, нужно еще подключить сам чип Bluetooth. Самый простой вариант - собрать модуль "все в одном", в этом случае сам чип, антенна и конвертер питания (TTL 5V/CMOS 3.3V) собираются на одной маленькой плате.

Если вы хотете сэкономить немного денег, то можете переделать более дешевые USB-токены на последовательный порт. Если же вы хотите сэкономить время, то можете купить все необходимое в онлайн-магазинах. Вот некоторые полезные ссылки: Протокол последовательного порта
Если ваш последовательный порт ограничен двумя линиями (receive/send), вам необходимо сконфгурировать устройство на использование протокола BCSP вместо H4. H4 - промышленный стандарт, который требует управления потоком данных, в то время как BCSP - пропиетарный протокол, который работает точно также без управления потоком данных. Поскольку стек bluez поддерживает оба протокола, то выбор остается за вами.

Учтите, что ваш чип может уже быть настроен на использование какого-либо из этих протоколов. Для смены протокола необходимо воспользоваться утилитой pskey. Иструкции по использованию можно прочитать в этом документе или в Opensimpad introduction to Pskey.

Будьте внимательны! Очень легко уничтожить модуль ошибкой в pskey.

Программное обеспечение
В зависимости от конфигурации вашего ядра Linux и установленного программного обеспечения, поддержка Bluetooth может заработать "из коробки".

Если вы используете дистрибутив с автоматической установкой пакетов, такой как Debian или Red Hat, вы можете получить прекомпилированную версию bluez, без всяких проблем с зависимостями. В этом случае просто перейдите к разделу "Запускаем bluez".

В противном случае, я рекомендую перекомпилировать ядро со следующим патчем. (смотри также www.holtmann.org/linux/kernel).

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

Итак, я предполагаю, что у вас имеется ядро с поддержкой bluez или загружаемый автоматически модуль ядра.

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

Я рекомендую скачать bluez-libs-2.10, bluez-utils-2.10, bluez-hcidump-1.12, and bluez-hciemu-1.0:
    
    $ wget http://bluez.sf.net/download/bluez-libs-2.10.tar.gz
    $ wget http://bluez.sf.net/download/bluez-utils-2.10.tar.gz
    $ wget http://bluez.sf.net/download/bluez-hcidump-1.12.tar.gz
    $ wget http://bluez.sf.net/download/bluez-hciemu-1.0.tar.gz
    
Если вы используете не i386-совместимый компьютер (например наладонник с ARM или MIPS CPU), пожалуйста сделайте кросс-компиляцию с инструментарием, которого требует ваша архитектура. Узнать все необходимые параметры можно на соответствующих сайтах (например Zaurus toolchain).

Компиляция осуществляется как и все в GNU. Я предпочитаю помещать все в /opt/bluetooth, чтобы не войти в противоречие с установкой по умолчанию.

Сначала установим библиотеки, которые будут использоваться в дальнейшем:
    <
    $ tar zxvf bluez-libs-2.10.tar.gz
    $ cd bluez-libs-2.10
    $ ./configure --prefix=/opt/bluetooth
    $ make ; make install
    $ echo "/opt/bluetooth/lib" >> /etc/ld.so.conf
    $ ldconfig
    
Устанавливаем утилиты:
    $ tar zxvf bluez-utils-2.10.tar.gz
    $ cd bluez-utils-2.10
    $ ./configure --disable-debug --disable-dbus --disable-cups --disable-pcmcia \
        --disable-initscripts  --disable-bluepin --enable-hid2hci --enable-bcm203x \
        --prefix=/opt/bluetooth
    $ make ; make install
    
    
В заключение, устанавливаем приложение для отладки:
    $ tar zxvf bluez-hcidump-1.12.tar.gz
    $ cd bluez-hcidump-1.12
    $ ./configure --prefix=/opt/bluetooth
    $ make ; make install
    
Для использования установленных бинарных файлов выполните:
    export PATH=$PATH:/opt/bluetooth/bin:/opt/bluetooth/sbin
    
или добавьте соответствующую строку в .bashrc. Теперь мы готовы!

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

Например, у нас имеется токен, подключенный к первому порту, по протоколу BCSP, с конфигурацией прошивки на 115200 и вы хотите установить рабочую скорость в 230400, используйте:
    $ hciattach /dev/ttyS0 bcsp 115200 noflow 230400
    
В случае последовательного токена вы или непосредственно знаете параметры соединения, поскольку установили их с помощью pskey или можете найти их на сайте, где брали инструкции по включению Bluetooth.

Я настоятельно не рекомендую изменять скорость порта утилитой pskey. Сохраните имеющееся значение по умолчанию и предоставьте hciattach показать волшебство работы на более высоких скоростях. С его помощью вы можете совершенно безопасно подняться до скорости 921600, в случае появления проблем достаточно будет просто перегрузить чип, что-бы вернуться до 115200.

Запуск Bluetooth и подключение к другому устройству

Запустить устройство можно следующей командой:
    $ hciconfig hci0 up
            hci0:   Type: USB
            BD Address: 00:80:C8:45:31:F8 ACL MTU: 192:8  SCO MTU: 64:8
            UP RUNNING PSCAN ISCAN AUTH ENCRYPT
            RX bytes:2882377 acl:151624 sco:0 events:212 errors:0
            TX bytes:2591 acl:184 sco:0 commands:20 errors:0
    
Это означает, что у вас имеется устройство USB с адресом 00:80:C8:45:31:F8, работаещее с различными опциями.

Адрес устройства уникален и похож на MAC адрес для устройств Ethernet. Его невозможно изменить, если только вы не используете модуль Bluetooth для разработчиков. В этом случае, для смены адреса адреса используется утилита pskey. Вследствие этого, я хочу отговорить вас использовать этот адрес в качестве секретного ключа.

Давайте посмотрим Bluetooth окружение:
    $ hcitool scan
        Scanning ...
           00:A0:96:0A:D1:80       zaurus.guylhem.net
    
Как удивительно, мы что-то обнаружили!

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

Пежде, чем мы двинемся дальше, запустим демон hcid и установим PIN, для защиты наших соединений. Отредактируйте файл hcid.conf из каталога /opt/bluetooth/etc/bluetooth так, чтобы он выглядел следующим образом:
    options {
            # automatically put new hciN devices up
            autoinit yes;
    
            # security mode
            #  none : security disabled
            #  auto : use local pin for incoming connections
            #  user : always ask a pin to the user
            security auto;
            pairing multi;
            pin_helper /opt/bluetooth/bin/bluepin;
    }
    
    device {
            # whatever you want
            name "MyDevice.MyDomain.us";
    
            # 0x100 is fine for a PC, 0x120112 is better for a PDA
            class 0x100;
    
            # enable inquiry scan
            iscan enable;
    
            # enable page scan
            pscan enable;
    
            # default link mode
            #  none : no policy
            #  accept : always accept incoming connections
            #  master : becomes the master on incoming connections
            #           and deny role switch on outgoing connections
            lm accept;
    
            # default link policy
            #  none : no policy
            #  rswitch : allow role switch
            #  hold : allow hold mode
            #  sniff : allow sniff mode
            #  park : allow park mode
            lp rswitch,hold,sniff,park;
    
            # enable authentication
            auth enable;
    
            # enable encryption
            encrypt enable;
    }
    
    
Что все это значит?

Устройства Bluetooth автоматически организовывают себя в piconets, где есть мастер и подчиненные устройства.В piconet может быть только один мастер, но мастер может быть подчиненным в другой piconet. Два piconets, объединившись, образуют scatternet.

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

Другие важные опции - inquiry scan и page scan. По умолчанию, устройства Bluetooth находятся в резервном режиме и периодически сканируют эфир. С page scan, устройство ожидает, что другие устройства войдут с ним в контакт посредством его кодового имени. Удаленное устройство должно знать это имя. inquiry scan - противоположный процесс; любое устройство может делать вызов, даже если оно не знает надлежащее кодовое имя. Класс позволяет вам искать любой тип устройства, когда вокруг слишком много устройств Bluetooth. Если вы хотите скрыть ваши устройства от других людей, отключите сканирование - или в hcid.conf, или вручную, после того, как вы подключили ваши устройства:
    $ hciconfig hci0 iscan disable
    
Самая важная опция - конечно, опция безопасности.

Для создания соединения между двумя Bluetooth устройствами необходимо, чтобы у них был выставлен одинаковый PIN-код. Этот код может быть размером и 8 и 128 бит, но на сотовых телефонах или беспроводной гарнитуре, вам врядли захочется набирать что-то более чем "1234".

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

Что касается безопасности, то используйте auto и напишите коротенький скрипт, выводящий PIN. Например:
    $ echo "
    #!/bin/sh
    echo -n PIN:
    cat /opt/bluetooth/etc/pin
    ">/opt/bluetooth/bin/bluepin
    
    $ echo "9874" > /opt/bluetooth/etc/pin
    
    $ chmod +x /opt/bluetooth/bin/bluepin
    
Это выведет "PIN:9874", когда вы выполните:
    $ /opt/bluetooth/bin/bluepin PIN:9874
    
Вы можете сделать данный скрипт более сложным, например, прося пользователя ввести определенный пароль каждый раз, когда пытается подключиться новое устройство. Это не входит в рамки данной статьи. Gnome и KDE уже обеспечивают графические bluepin приложения, не стесняйтесь улучшать их, если хотите.

Обратите внимание на режимы: hold - когда мастер отключается, входя в режим энергосбережения, или по какой другой причине (возможно, чтобы слушать в другом piconet или выполнить сканирование). sniff, когда подчиненное устройство время от времени засыпает, чтобы сохранить энергию. park - подчиненное устройство покидает piconet. Вы можете разбудить это устройство, указав мастеру распарковать его.

В самом общем случае, вы должны работать во всех этих режимах, если ваши аппаратные средства их поддерживают - а в настоящее время это именно так. Вы сбережете много энергии и получите больше возможностей. Старые устройства Bluetooth, такие как мое Socket CF+ Rev E (with a Nokia chipset, hci v 1.0b), поддерживает только некоторые из этих опцийи (Смотрите short introduction to the theoretical aspects behind a Bluetooth connection и hardware features.)

Теперь, когда пароль и все необходимые опции установлены, попробуем подключиться: Запустите демоны hcid и sdpd, обеспечивающие связь (например для получения PIN или запроса возможностей):
    $ /opt/bluetooth/sbin/hcid -f /opt/bluetooth/etc/bluetooth/hcid.conf
    $ /opt/bluetooth/sbin/sdpd
    
В настоящий момент нет никакого эквивалента /etc/hosts, чтобы отображать адреса устройств в имена, поэтому придется использовать аппаратный адрес:
    $ l2ping 00:A0:96:0A:D1:80
    
Вы будете знать, что устройство требует пароля, если получите:
    Can't connect.: Connection timed out
    
Если устройство выключено, то сообщение будет выглядеть так:
    Can't connect.: Host is down
    
В случае успеха картина будет выглядеть примерно так:
    # l2ping 00:A0:96:0A:D1:80
    Ping: 00:A0:96:0A:D1:80 from 00:80:C8:45:31:F8 (data size 20) ...
    20 bytes from 00:A0:96:0A:D1:80 id 200 time 64.76ms
    20 bytes from 00:A0:96:0A:D1:80 id 201 time 45.80ms
    20 bytes from 00:A0:96:0A:D1:80 id 202 time 38.89ms
    20 bytes from 00:A0:96:0A:D1:80 id 203 time 95.60ms
    20 bytes from 00:A0:96:0A:D1:80 id 204 time 43.26ms
    20 bytes from 00:A0:96:0A:D1:80 id 205 time 53.72ms
    20 bytes from 00:A0:96:0A:D1:80 id 206 time 39.92ms
    20 bytes from 00:A0:96:0A:D1:80 id 207 time 28.68ms
    8 sent, 8 received, 0% loss
    
И теперь просмотрим записи в syslog, чтобы увидеть процесс обмена PINами и установку соединения:
    # tail /var/log/syslog
    Aug  2 22:20:44 [hcid] link_key_request (sba=00:80:C8:45:31:F8,
    dba=00:A0:96:0A:D1:80)_
    Aug  2 22:20:44 [hcid] pin_code_request (sba=00:80:C8:45:31:F8,
    dba=00:A0:96:0A:D1:80)_
    Aug  2 22:20:44 [hcid] link_key_notify (sba=00:80:C8:45:31:F8)_
    Aug  2 22:20:44 [hcid] Replacing link key 00:80:C8:45:31:F8 00:A0:96:0A:D1:80
    

Службы предложения и запроса

Вы нашли устройство. Что же можно с ним делать дальше? Можете ли вы использовать его для выхода в сеть, передачи файлов, прослушивания музыки? Это работа для протокола SDP - службы предложения и запроса. Что предлагает мой Zaurus?
    # sdptool browse 00:A0:96:0A:D1:80
    Browsing 00:A0:96:0A:D1:80 ...
    #
    
Судя по увиденному, никаких сервисов тут нет. Мне их необходимо добавить. NAP для работы сети, DUN для работы с PPP, OPUSH для передачи файлов и SP для того, чтобы иметь возможность использовать серийный порт другого устройства.
    # sdptool add NAP
    # sdptool add DUN
    # sdptool add OPUSH
    # sdptool add SP
    
Внимание! В этой статье у меня нет места, чтобы рассматривать настройку DUN, OPUSH и SP. Я только покажу, как подделать поддержку для этого профиля. Почему бы на этот раз не поиграть в притворщиков? Одним из плюсов такого подхода - организация honeypot и поиск в syslog устройств, обращающихся к этим сервисам для атак типа Bluesnarfing или Bluejacking.

Теперь посмотрим, что нам предлагает Zaurus:
    # sdptool browse 00:A0:96:0A:D1:80
    Browsing 00:A0:96:0A:D1:80 ...
    Service Name: Network Access Point Service
    Service RecHandle: 0x10000
    Service Class ID List:
      "Network access point" (0x1116)
    Protocol Descriptor List:
      "L2CAP" (0x0100)
        PSM: 15
      "BNEP" (0x000f)
        Version: 0x0100
        SEQ16: 10 20 30 40
    Profile Descriptor List:
      "PAN access point" (0x1116)
        Version: 0x0100
    
    Service Name: Dial-Up Networking
    Service RecHandle: 0x10001
    Service Class ID List:
      "Dialup Networking" (0x1103)
      "Generic Networking" (0x1201)
    Protocol Descriptor List:
      "L2CAP" (0x0100)
      "RFCOMM" (0x0003)
        Channel: 1
    Profile Descriptor List:
      "Dialup Networking" (0x1103)
        Version: 0x0100
    
    Service Name: OBEX Object Push
    Service RecHandle: 0x10002
    Service Class ID List:
      "OBEX Object Push" (0x1105)
    Protocol Descriptor List:
      "L2CAP" (0x0100)
      "RFCOMM" (0x0003)
        Channel: 4
      "OBEX" (0x0008)
    Profile Descriptor List:
      "OBEX Object Push" (0x1105)
        Version: 0x0100
    
    Service Name: Serial Port
    Service Description: COM Port
    Service RecHandle: 0x10003
    Service Class ID List:
      "Serial Port" (0x1101)
    Protocol Descriptor List:
      "L2CAP" (0x0100)
      "RFCOMM" (0x0003)
        Channel: 1
    Language Base Attr List:
      code_ISO639: 0x656e
      encoding:    0x6a
      base_offset: 0x100
    Profile Descriptor List:
      "Serial Port" (0x1101)
        Version: 0x0100
    
Намного лучше.

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

Запустите на Zaurus сетевой демон в серверном режиме:
    # pand --listen --master --role NAP
    
На своем компьютере выполните поиск NAP:
    # sdptool search NAP
    Inquiring ...
    Searching for NAP on 00:A0:96:0A:D1:80 ...
    Service Name: Network Access Point Service
    Service RecHandle: 0x10000
    Service Class ID List:
      "Network access point" (0x1116)
    Protocol Descriptor List:
      "L2CAP" (0x0100)
        PSM: 15
      "BNEP" (0x000f)
        Version: 0x0100
        SEQ16: 10 20 30 40
    Profile Descriptor List:
      "PAN access point" (0x1116)
        Version: 0x0100
    
Теперь убедимся в том, что Zaurus правильно обьявляет поддержку PAN. Подключимся с помощью pand в клиентском режиме:
    /usr/bin/pand --role PANU --service NAP --connect 00:A0:96:0A:D1:80
    
Также вы можете выполнить поиск серверов NAP:
    # /usr/bin/pand --role PANU --service NAP --search
    
В этом случае каждое устройство будет иметь сетевой интерфейс bnep0, поддерживающее автоматическую конфигурацию - с DHCP или статическим IP

на Zaurus введите (и сохраните в /etc/bluetooth/pan/dev-up на потом):
    ifconfig bnep0 192.168.1.1
    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat  -A POSTROUTING -o eth0 -j MASQUERADE
    
на PC введите (и сохраните в /etc/bluetooth/pan/dev-up на потом):
    ifconfig bnep0 192.168.1.2
    route add default gw 192.168.1.1
    
Теперь вы можете пропинговать Zaurus и использовать это соединение для выхода в Интернет.

pand - это сетевой демон, который можно использовать для разных целей, включая работу с peer-to-peer сетями, если вы используете GN вместо NAP. На клиентской машине выполните:
    # pand --listen --role GN
    
В этом случае будет осуществлятся поиск peer-to-peer серверов в то время, когда вы проходите мимо. Наряду с DHCP запросом на получение IP адреса для bnep0, появляются такие интересные возможности, как обмен файлами с прохожими, чьи устройства сконфигурированы подобным образом. Для получения дополнительной информации, обратитесь к The PAN HOWTO.

Заключение

В настоящий момент ваше устройство Bluetooth по функциональным возможностям только приблизилось к WiFi - возможно с более хорошими опциями и возможностями для автоматизации.

Даже просто работая в сети, можно получить больше с PAN в Bluetooth.

В следующей статье мы рассмотрим работу DUND и SP (PPP по Bluetooth и экспорт последовательного порта соответственно), dial-on-demand и беспроводную синхронизацию с Palm.

Я также покажу, как обмениваться файлами с помощью OBEX и как их копировать в сотовый телефон и расскажу об атаках Bluesnarfing и Bluejacking, преобразующих резервную копию телефона в "cellphone slurper", что позволяет скопировать телефонную книгу, календарь, изображения и т.д.

[ опубликовано 28/12/2006 ]

Guylhem Aznar. Перевод: Сгибнев Михаил (www.dreamcatcher.ru) - Обзор Bluetooth   Версия для печати