phdru.name / Russian / Admin / cellphones

Алё, говорит Linux. Как слышно? Приём!

Автор: Олег Бройтман
http://phd.pp.ru/
phd@phd.pp.ru

Перепечатка. Оригинал статьи опубликован по адресу http://www.linuxrsp.ru/artic/Linux-OBEX-GPRS.html

В прошлый раз мы наладили связь с сотовым телефоном и настроили Bluetooth в Linux. Встаёт задача эту связь использовать. С самого начала автор собирался использовать Bluetooth для трёх вещей: научиться налаживать Bluetooth в Linux - это сделано; обмениваться файлами - сохранить записную книжку, загрузить мелодии, картинки, мидлеты; и использовать GPRS. Решениям этих двух задач и посвящена статья.

OBEX

OBEX (OBject EXchange) - это протокол для обмена файлами между мобильными устройствами (сотовые телефоны, КПК и т.п.). Не всякое устройство этот протокол реализует, но S55 его поддерживает. В Linux этот протокол реализует пакет OpenOBEX. Он позволяет использовать 3 транспорта - TTY (для соединения телефона с компьютером кабелем RS-232 или USB), IrDA (инфракрасный порт) и Bluetooth. На основе реализации OpenOBEX существует несколько библиотек и программ для доступа к мобильным телефонам. Особенно интересно выглядит SieFS - файловая система для доступа к телефона Siemens; SieFS является модулем для FUSE - Filesystem in USErspace; это модуль ядра и демон, которые позволяют создавать в Linux файловые системы, работающие вне ядра. Другая интересная идея - модуль виртуальной файловой системы для GNOME. Начнём, однако, с простого - программы ObexFTP; она работает полностью вне ядра, и ничего, кроме OpenOBEX не требует.

Компиляция OpenOBEX и ObexFTP не представляет из себя ничего особенного, надо лишь для вызова ./configure указать, где находятся библиотеки Bluetooth. Устанавливаем OpenOBEX и ObexFTP, скажем, в /usr/local/obex. ObexFTP 0.10.3 у автора не заработал - Bluetooth он ещё не понимает, а по rfcomm (эмуляция TTY поверх Bluetooth) не хочет соединяться. Тут надо не растеряться, а пойти в Google поискать информацию. Находим упоминание про версию 0.10.4. Ищем её или более позднюю версию на сайте ObexFTP. Сайт неудобен для навигации и поиска, но в конце концов ссылка обнаруживается внизу страницы загрузки. ObexFTP начиная с версии 0.10.4 уже понимает Bluetooth, и она наконец заработала.

Перед тем, как пользоваться OBEX, необходимо посмотреть, какие сервисы предоставляет телефон, и по какому каналу можно использовать ObexFTP. Разделение потока данных на каналы позволяет подключаться к телефону нескольким программам одновременно, скажем, одновременно использовать OBEX и GPRS. Список сервисов показывает команда sdptool browse 00:CP:AD:RE:SS (будем считать, что это адрес телефона). Эта команда выдаёт длинную "простыню", состоящую из секций - описаний сервисов. В каждой секции надо обращать внимание на Service Name, имя сервиса. Например, DUN (Dial-up Networking). Для ObexFTP нужен сервис OBEX File Transfer. Эта секция выглядит приблизительно так:

Service Name: OBEX File Transfer
Service RecHandle: 0x10005
Service Class ID List:
  "Obex File Transfer" (0x1105)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel/Port: 11
  "OBEX" (0x0008)
Profile Descriptor List:
  "Obex File Transfer" (0x1105)
    Version: 1
Канал для доступа ObexFTP - 11.

Пользоваться ObexFTP просто. Получить листинг корневой директории: obexftp -b 00:CP:AD:RE:SS -B 11 -l / . Листинг директории Pictures: obexftp -b 00:CP:AD:RE:SS -B 11 -l /Pictures. Листинги директорий ObexFTP выдаёт в XML. Можно этот XML отпарсить и получить полезную информацию. Чтение файлов из телефона: obexftp -b 00:CP:AD:RE:SS -B 11 -c Pictures -g Dog.jpg - перейти в директорию Pictures и считать (get) файл Dog.jpg. Загрузить (put) файл в телефон: obexftp -b 00:CP:AD:RE:SS -B 11 -c Java -p Chess.jar.

Протокол OBEX позволяет создавать и удалять файлы и директории, и ObexFTP все эти операции полностью реализует. Автор создал VFS - виртуальную файловую систему для Midnight Commander. MC - замечательный менеджер файлов для тех, кто привык к клонам Commnder'ов, и автор давно уже хотел научиться писать VFS для MC, а тут такой случай представился! Скрипт написан на языке Python, во-первых, потому что это замечательный язык, а во-вторых, потому что нужен парсер XML для чтения листингов, которые выдаёт ObexFTP. На shell такой парсер написать было бы нелегко.

GPRS

В стандарте GSM можно передавать по речевому каналу разнообразные данные - например, факсы, трафик Интернет. Но это, во-первых, очень медленно - речевой канал передаёт данные со скоростью 9600 бит в секунду, максимум 14400. Во-вторых, очень дорого - занят целый канал, оплата ведётся по времени передачи данных. Поэтому в GSM помимо передачи речи есть несколько способов передачи данных - SMS, USSD, GPRS. Их достоинство в том, что они передаются не по речевому каналу, а либо по дополнительным каналам, либо разделением основного канала на сегменты или пакеты; и оплата берётся не за время использования, а за объём трафика. SMS и USSD передают текстовые сообщения, GPRS - произвольные данные, скажем, трафик Интернет, или мультимедийные сообщения (MMS). Передача трафика GPRS ведётся путём разделения канала на тайм-слоты. Один тайм-слот может передавать данные со скоростью 13.5-14.3 и даже 21 Кбит/сек. в зависимости от способа кодирования. Но одному пользователю может быть выделено несколько тайм-слотов, в зависимости от оборудования, установленного у оператора, в зависимости от возможностей мобильного устройства, и в зависимости от загруженности сети. Максимальная пропускная способность канала GPRS - 172 Кбит/сек (8 тайм-слотов по 21 Кбит/сек). Максимальная, конечно, не достигается никогда, особенно если учесть, что трафик GPRS у операторов имеет обычно меньший приоритет, чем голосовой.

Использовать GPRS в телефоне совсем просто. Подключаете у оператора услугу, включаете GPRS в телефоне - и пользуетесь. Шлите и принимайте мультимедийные сообщения (MMS). Пишите и читайте email, если телефон реализует почтовые протоколы (SMTP, POP3, IMAP). Или загрузить в телефон мидлет Java, реализующий эти протоколы, плюс, скажем, ICQ/IRC/Jabber, и выходите в Сеть пообщаться.

Использовать GPRS в компьютере не намного сложнее. Подключаете телефон к компьютеру кабелем, через инфракрасный порт (IrDA), или Bluetooth, и запускаете программу доступа к Интернету через модем. В Linux это программа pppd. Для доступа к сотовому оператору надо настроить pppd.

В Сети есть подробные инструкции по использованию GPRS в Linux, в том числе и посредством Bluetooth. Остаётся адаптировать их для конкретных условий. Это совсем просто.

Файл /etc/ppp/peers/beeline-gprs (автор пользуется услугами Би Лайн GSM) и пояснения:

# Most GPRS phones don't reply to LCP echo's
lcp-echo-failure 0
lcp-echo-interval 0
Не использовать LCP echo - большинство провайдеров GPRS не отвечают на сигналы LCP echo.
# Connect chat
connect /etc/ppp/peers/beeline-gprs-connect-chat
Процедура установки связи описана в отдельном файле /etc/ppp/peers/beeline-gprs-connect-chat (см. ниже).
#/dev/ttyUSB0 for USB
#/dev/ttyS0 # serial port one
#/dev/ttyS1 # serial port two
#/dev/ircomm0 # IrDA serial port one
/dev/rfcomm0 # Bluetooth serial port
Использовать указанное устройство, эмулирующее TTY. При подключении посредством транспорта Bluetooth эмуляцию терминала надо включить командой rfcomm bind 0 00:CP:AD:RE:SS 1; здесь 0 - номер устройства /dev/rfcomm0, а 1 - номер канала DUN (Dial-Up Networking).
# Serial port line speed
115200 # fast enough
#57600 # perhaps useful with IrDA as some phones don't like
       # speeds higher than this
Скорость порта TTY. Для инфракрасного порта рекомендуется понизить.
# Hardware flow control:
# Use hardware flow control with cable, Bluetooth and USB but not with IrDA.
crtscts  # serial cable, Bluetooth and USB, on some occasions with IrDA too
#nocrtscts # IrDA
Для всех типов подключения, кроме ИК использовать аппаратное управление потоком данных.
# Ignore carrier detect signal from the modem:
local
Игнорировать управляющие сигналы модема.
# pppd must not propose any IP address to the peer!
noipdefault

# Accept peers idea of our local address
ipcp-accept-local
Не предлагать никаких адресов по умолчанию. Использовать для создаваемого интерфейса ppp0 адрес, предложенный провайдером.
# Add the ppp interface as default route to the IP routing table
defaultroute

# Newer pppd's also support replacing the default route, if one is
# already present, when the GPRS connection should be set as the default route
# to the network
#replacedefaultroute
Установить маршрутизацию по умолчанию используя создаваемый интерфейс ppp0. В тех версиях pppd, которые это умеют - заменить маршрутизацию по умолчанию, если она была установлена (например, локальная сеть); не забудьте раскомментировать replacedefaultroute, если Ваш pppd это позволяет; узнать, позволяет или нет, можно в man pppd.
# DNS servers from the phone:
# some phones support this, some don't.
usepeerdns
Использовать сервера DNS, предоставляемые провайдером GPRS.
# ppp compression:
# ppp compression may be used between the phone and the pppd, but the
# serial connection is usually not the bottleneck in GPRS, so the
# compression is useless (and with some phones need to disabled before
# the LCP negotiations succeed).
novj
nobsdcomp
novjccomp
nopcomp
noaccomp
Отключить все виды сжатия заголовков и данных PPP.
# The phone is not required to authenticate:
noauth
Аутентификация телефона не требуется.
# Username and password:
# If username and password are required by the APN, put here the username
# and put the username-password combination to the secrets file:
# /etc/ppp/pap-secrets for PAP and /etc/ppp/chap-secrets for CHAP
# authentication. See pppd man pages for details.
user beeline
Имя пользователя для подключения. Пароль берётся из файла /etc/ppp/pap-secrets (см. ниже).

Файл /etc/ppp/peers/beeline-gprs-connect-chat:

exec chat -vS  \
    '' \rAT \
    TIMEOUT 12 \
    OK ATH \
    OK ATE1 \
    OK 'AT+CGDCONT=1,"IP","internet.beeline.ru"' \
    OK ATD*99***1# \
    TIMEOUT 22 \
    SAY "\nwaiting for connect...\n" \
    CONNECT "" \
    SAY "\nConnected."
Выполняет процедуру установки связи - посылает GPRS-модему управляющие AT-команды, дожидается ответов OK и CONNECT, или сообщает об ошибке установки связи.

Файл /etc/ppp/pap-secrets:

beeline * beeline
Это имя пользователя и пароль, использующиеся для аутентификации.

В директориях /etc/ppp/ip-up.d и ip-down.d можно создать скрипты, которые будут вызываться при каждом включении и выключении ppp. Там могут быть изменение настроек сетевого экрана (firewall), proxy и тому подобное.

Редактируем /usr/local/bluez/etc/bluetooth/rfcomm.conf, пишем туда секцию для Dial-up Networking:

rfcomm0 {
   bind no;
   device 00:CP:AD:RE:SS;
   channel 1;
   comment "DUN";
}
Запускаем rfcomm bind 0. Эта команда загружает драйвер для /dev/rfcomm0, который прописан в /etc/ppp/peers/beeline-gprs в качестве серийного порта для pppd.

Всё готово. Запускаем pon beeline-gprs, и наблюдаем в syslog, как pppd устанавливает связь.

Всякая нормальная связь должна иногда рваться. Страдает этим и GPRS; хотя всё же это не настоящий модем и не телефонная линия; связь без перерыва может держаться и час, и больше. В случае же обрыва связи надо просто остановить pppd командой poff, освободить эмулятор TTY командой rfcomm release 0, включить эмулятор заново - rfcomm bind 0, и перезапустить pppd указанной выше командой pon. При остановке pppd укажет в syslog время, потраченное на связь, и количество принятых и отправленных байтов. Бывает, что глючит связь Bluetooth - программа (pppd или obexftp) уже отсоединилась, а телефон показывает, что соединение ещё есть, и, соответственно, не даёт установить новое соединение по тому же каналу. В такой ситуации достаточно просто выключить и включить Bluetooth в телефоне. Перезагружать телефон (полностью выключить и включить питание) автору не приходилось ещё ни разу.

Алё, говорит Linux. Слышу вас хорошо. Приём...


Эта страница http://phdru.name/Russian/Admin/cellphones/Linux_OBEX_GPRS.html была сгенерирована 08.06.2014 в 20:52:32 из шаблона CheetahTemplate Linux_OBEX_GPRS.tmpl; Некоторые права зарезервированы. Вы можете узнать о технических аспектах этого сайта.