Алё, говорит Linux. Как слышно? Приём! (Linux + OBEX + GPRS...)
Автор: Олег Бройтман
http://phd.pp.ru/
phd@phd.pp.ru
Предоставлено специально для www.linuxrsp.ru
В прошлый раз мы наладили связь с сотовым
телефоном и настроили 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. Слышу вас хорошо. Приём...
См. также:
Пингвин показывает зубки (Linux + Bluetooth...) (Олег Бройтман)
Алё! Пингвин ищет телефон (Linux + Siemens...) (Олег Бройтман)