phdru.name / Russian / Admin / cellphones
Автор: Олег Бройтман http://phd.pp.ru/ phd@phd.pp.ru
Перепечатка. Оригинал статьи опубликован по адресу http://www.linuxrsp.ru/artic/Linux-OBEX-GPRS.html
В прошлый раз мы наладили связь с сотовым телефоном и настроили Bluetooth в Linux. Встаёт задача эту связь использовать. С самого начала автор собирался использовать Bluetooth для трёх вещей: научиться налаживать Bluetooth в Linux - это сделано; обмениваться файлами - сохранить записную книжку, загрузить мелодии, картинки, мидлеты; и использовать GPRS. Решениям этих двух задач и посвящена статья.
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 такой парсер написать было бы нелегко.
В стандарте 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. Слышу вас хорошо. Приём...
Эта страница https://phdru.name/Russian/Admin/cellphones/Linux_OBEX_GPRS.html была сгенерирована 16.06.2024 в 13:02:52 из шаблона CheetahTemplate Linux_OBEX_GPRS.tmpl; Некоторые права зарезервированы. Вы можете узнать о технических аспектах этого сайта.