GPRS линк в Linux через Nokia 6021 по Bluetooth. (bluetooth modem linux phone mobile gprs)
Ключевые слова: bluetooth, modem, linux, phone, mobile, gprs, (найти похожие документы)
From: Денис Евстигнеев <http://www.livejournal.com/users/yevstigneyevda>
Date: Mon, 9 Dec 2007 14:31:37 +0000 (UTC)
Subject: GPRS линк в Linux через Nokia 6021 по Bluetooth.
Оригинал: http://carpenter.bofh.ru/texts/bluetooth/bttm.html
Предисловие
Motorola Timeport T-260
В принципе, эта покупка назревала давно - ну не всю же жизнь
использовать для связи Motorola Timeport T-260? Тем более, что GPRS
4-й категории (3+2 -- три слота на приём и два -- на передачу,
соответственно, что обеспечивает максимальную скорость приёма данных
до 43.2 Кб/сек, а на деле не больше 20 кб/сек) Не самое лучшее
оборудования для общения в чате.
Nokia 6021
После недолгих поисков, остановил свой выбор на Nokia 6021.
Причиниы довольно просты:
1) Отсутствие фотоапаарата (если ещё добавить в фотоаппарат
кислородный баллон и укомплектовать его маской для подводного
плавания, то из него получится отличный акваланг -- плавай и
фотографируй)
2) При наличии IrDA, Bluetooth интерфейсов, поддержке протокола
беспроводной связи EDGE (EGPRS 6-го класса, позволяющий развивать
скорость передачи данных до 177,6 кб/с) и мультислотовый GPRS 10-й
категории (скорость передачи данных до 80 кб/с, 4 слота на приём, 2
слота на передачу, 5 слотов могут быть одновременно активны)
Встал вопрос: в Linux/FreeBSD оно работает? Интересно, но оказалось,
что через IrDA (инфракрасный интерфейс) и Bluetooth -- безо всяких
нареканий, а вот через кабель DKU-X (3,4,5) -- нареканий масса. Под
Windows -- ещё как-то, а под Юниксом пока так и не настроил.
Tekram TM-304
Tekram TM-304
Признаться, меня всегда занимало самое название: BlueTooth --
синие зубы-то тут причём? В конце концов удалось отыскать в интернете
статью "Apple и беспроводные технологии - Bluetooth", в которой
была выдвинута такая версия:
Bluetooth - это английский перевод прозвища датского короля Харальда
Синезубого (Harald Blutend, в поздней транскрипции -- Bluetooth --
Синезубый -- прозвище свое он получил из-за потемневшего переднего
зуба, есть, правда, и другие версии). Король знаменит тем, что
объединил Данию и Норвегию. Это имя было выбрано в качестве названия
технологии потому, что первоначально Bluetooth задумывалась как
средство для простого соединения компьютеров и телекоммуникационных
устройств, вроде мобильных телефонов.
Ну Харальд Харальдом, а в ближайшем магазине ничего кроме
подозрительной Tekram TM-304 ничего не случилось. Стоило это
удовольствие 600 рублей, вполне красиво, по новогоднему упаковано.
Самое главное, что этот USB BlueTooth порт значился в списке
поддерживаемых Linux/FreeBSD устройств
Кстати, на сайте Tekram й штучки не значилось и впомине. Слишком
маленькая, наверное, чтобы её описывать. На самом деле, это USB
устройство значится на сайте MTWO, как "40 Meter Bluetooth
USB Dongle, class 2, SiliconWave + IVT"
Windows
Скриншот программы BlueSoleil
Найденные устройства
Телефон теперь подключён
Связь установлена
Подключение к удалённому устройству
Как бы то там ни было, но под Windows(TM) эта штуковина заработала
более чем великолепно: сразу "ухватила" близлежащий компьютер и мой
мобильный телефон. Единственная проблема состояла в том, что обычным
путём нельзя было поставить драйвера, т.е., в нужный момент
"подхватить" inf-файл с диска драйверов и не ставить ничего лишнего.
Здесь пришлось ставить драйвера при помощи программы-установщика.
Подключение к удалённому устройству
Далее, не составило никакого труда создать попарное соединение
устройств: программа запросила пароль на соединение. Этот же пароль
пришлось ввести с мобильного телефона. Не сразу, правда, догадался,
что через это подключение не получится выйти в интернет. Для этой цели
лучше всего воспользоваться "Bluetooth Dial-Up Networking service"
Собственно, надо "спарить телефон" и вызвать подключение. Не
забудьте взять в руки аппарат, согласится принять подключения и ввести
PIN-код. Также, проверьте, что в свойствах модема прописана строку
инициализации "AT+CGDCONT=1,"IP","internet.beeline.ru"" (ну или кто
у Вас там в провайдерах ходит?) Замечу, что если Вы не сделаете этого,
то подключиться не сможете, а аппарат выдаст сообщение "Нет подписки
GPRS". Учтите, что Windows (TM) имеет привычку эти строки терять
самопроизвольно, так что если Ваш аппарат перестал подключаться к сети
-- прежде всего проверьте отсутствие этой строки.
Трей подключённого модема
Чтобы стал доступен список сервисов, предоставляемых устройством, надо
кликнуть правой кнопкой на устройстве (галочка, свидетельствующая о
том, что устройство уже связано с компьютером, должна уже стоять) и
выбрать "Refresh services"
Должна подсветиться иконка "Bluetooth Dial-Up Networking
Service".(DUN) на экране программы BlueSoleil (не забудьте в списке
модемов открыть DUN-Modem и в нужной вписать пресловутую строку
инициализации AT+CGDCONT=1,"IP","internet.beeline.ru"1)
Что приятно, так это то, что с программой BlueSoleil поставляется
вразумительная документация в формате chm. Т.е., разобраться с
настройкой и установкой не составило никакого труда.
Linux
Под Linux всё это настраивается чуть-чуть сложнее. Ну, поскольку
Linux я знаю не очень хорошо, то поставил себе Gentoo. На мой
взгляд, эта система наиболее подробно документирована и начинающему
пингвиноводу подходит больше всего. К тому же, почти сразу удалось
найти в Google статью по установке и настройке -- "The
host-to-host Bluetooth HOWTO". Также, есть очень подробная статья (на
немецком языке) статьи "Bluetooth und Linux" и на русском, не
очень подробная, но весьма толковая: "Как быстро настроить
Internet over GPRS на Linux + Siemens S55 + Bluetooth (gprs mobile
linux bluetooth ppp)". Следуя рекомендациям этой статьи, прежде всего
собрал необходимые модули ядра (kernel-2.6.12).
make menuconfig
Должна показать следующий набор экранов (здесь они собраны в один
экран, заголовки выделены цветом):
Networking support --->
<*> Bluetooth subsystem support --->
--- Bluetooth subsystem support
<M> L2CAP protocol support
<M> SCO links support
<M> RFCOMM protocol support
[*] RFCOMM TTY support
<M> BNEP protocol support
[ ] Multicast filter support
[*] Protocol filter support
<M> HIDP protocol support
Bluetooth device drivers --->
<M> HCI USB driver
[*] SCO (voice) support
<M> HCI UART driver
[*] UART (H4) protocol support
[*] BCSP protocol support
[*] Transmit CRC with every BCSP packet
<M> HCI BCM203x USB driver
<M> HCI BPA10x USB driver
<M> HCI BlueFRITZ! USB driver
<M> HCI VHCI (Virtual HCI device) driver
USB support --->
--- USB Host Controller Drivers
<M> EHCI HCD (USB 2.0) support
[*] Full speed ISO transactions (EXPERIMENTAL)
[*] Root Hub Transaction Translators (EXPERIMENTAL)
<M> OHCI HCD support
<M> UHCI HCD (most Intel and VIA) support
< > SL811HS HCD support
--- USB Device Class drivers
<M> USB Audio support
--- USB Bluetooth TTY can only be used with disabled Bluetooth subs
В списке загружаемых модулей нам, соответственно, понадобятся:
usbcore 142332 10 hci_usb,usbserial,ehci_hcd,uhci_hcd,ohci_hcd
bluetooth 55684 7 rfcomm,l2cap,hci_usb
Так или иначе, но если нам удалось загрузить модули и устройство
"подхватилось", то
brat3 linux# dmesg | grep -i blue
Bluetooth: Core ver 2.7
Bluetooth: HCI device and connection manager initialized
Bluetooth: HCI socket layer initialized
Bluetooth: HCI USB driver ver 2.8
Bluetooth: L2CAP ver 2.7
Bluetooth: L2CAP socket layer initialized
Bluetooth: RFCOMM ver 1.5
Bluetooth: RFCOMM socket layer initialized
Bluetooth: RFCOMM TTY layer initialized
и
brat3 linux # dmesg | grep -i rfcomm
Bluetooth: RFCOMM ver 1.5
Bluetooth: RFCOMM socket layer initialized
Bluetooth: RFCOMM TTY layer initialized
показали что-то вроде этого, то можно заглянуть в proc и, если всё
удачно "поднялось", увидеть что-то вроде этого:
brat3 linux # cat /proc/bus/usb/devices | grep -e^[TPD] | grep -e Cls=e0 -B1 -A1
T: Bus=02 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=12 MxCh= 0
D: Ver= 1.10 Cls=e0(unk. ) Sub=01 Prot=01 MxPS=64 #Cfgs= 1
P: Vendor=1310 ProdID=0001 Rev=15.00
Следующим шагом нам понадобятся пакеты bluez-libs и
bluez-utils.
# emerge net-wireless/bluez-libs net-wireless/bluez-utils
Неплохо бы ещё обзавестись пакетами hotplug и coldplug для
автоматической "горячей" подгрузки модулей по мере необходимости:
# emerge hotplug coldplug
# rc-update add hotplug boot
# rc-update add coldplug boot
Далее, можем без перезагрузки запустить все сервисы:
/etc/init.d/hotplug start
/etc/init.d/coldplug start
/etc/init.d/bluetooth start
И можно запустить hciconfig из пакета утилит BlueZ:
brat3 linux # hciconfig
hci0: Type: USB
BD Address: 00:0B:0D:08:CF:91 ACL MTU: 120:20 SCO MTU: 64:0
UP RUNNING PSCAN ISCAN
RX bytes:200079 acl:5056 sco:0 events:8905 errors:0
TX bytes:1215812 acl:15575 sco:0 commands:57 errors:0
(при первом запуске все параметры будут по нулям)
Теперь правим /etc/bluetooth/hcid.conf:
#
# HCI daemon configuration file.
#
# $Id: hcid.conf,v 1.7 2004/12/13 14:16:03 holtmann Exp $
#
# HCId options
options {
# Automatically initialize new devices
autoinit yes;
# Security Manager mode
# none - Security manager disabled
# auto - Use local PIN for incoming connections
# user - Always ask user for a PIN
#
security auto;
# Pairing mode
# none - Pairing disabled
# multi - Allow pairing with already paired devices
# once - Pair once and deny successive attempts
pairing multi;
# PIN helper
# pin_helper /usr/bin/bluepin;
pin_helper /etc/bluetooth/pin-helper;
# D-Bus PIN helper
#dbus_pin_helper;
}
# Default settings for HCI devices
device {
# Local device name
# %d - device id
# %h - host name
name "Brat3 (%d)";
# Local device class
class 0x3e0100;
# Default packet type
#pkt_type DH1,DM1,HV1;
# Inquiry and Page scan
iscan enable; pscan enable;
# Default link mode
# none - no specific policy
# accept - always accept incoming connections
# master - become master on incoming connections,
# deny role switch on outgoing connections
lm accept;
# Default link policy
# none - no specific policy
# rswitch - allow role switch
# hold - allow hold mode
# sniff - allow sniff mode
# park - allow park mode
lp rswitch,hold,sniff,park;
# Authentication and Encryption (Security Mode 3)
#auth enable;
#encrypt enable;
}
Поправить надо немного:
security user, которая стоит там по умолчанию, надо заменить на auto и
pin_helper /usr/bin/bluepin; на pin_helper /etc/bluetooth/pin-helper;.
В файл /etc/bluetooth/pin впишите желаемый PIN-код. Тот самый, который
мы использовали для авториазции подключения под Windows. Ну вот только
не надо писать там привычного 12345. Его, конечно удобно набирать, но
ещё проще подбирать. Можно надругаться над именем BlueZ-устройства (%d
означает отображение порядкового номера подключённого устройства). У
себя вписал имя компьютера: name "Brat3 (%d)";
Далее настроим файл исходящих подключений --
/etc/bluetooth/rfcomm.conf. Собственно, файл этот нужен для
автоматизации этих подключений и для автоматической настройки
параметров подключения при загрузке ОС.
#
# RFCOMM configuration file.
#
# $Id: rfcomm.conf,v 1.1 2002/10/07 05:58:18 maxk Exp $
#
rfcomm0 {
# Automatically bind the device at startup
bind yes;
# Bluetooth address of the device
device 00:13:70:0C:6C:DC;
# RFCOMM channel for the connection
channel 1;
# Description of the connection
comment "Nokia 6021";
}
rfcomm1 {
bind yes;
device 00:0B:0D:08:D7:EA;
channel 1;
comment "Family";
}
Впрочем, пока можно обойтись и без всяких автоматизаций. Для начала
просканируем окружающие устройства, причём неплохо бы перед этим не
забыть включить Bluetooth на самом мобильном телефоне.
brat3 bluetooth # hcitool scan
Scanning ...
00:13:70:0C:6C:DC Nokia 6021
00:0B:0D:08:D7:EA FAMILY
Вот, который "Nokia 6021" -- это и есть мой телефон.
Ещё неплохо бы проверить телефон на наличие DUN-модема (DUN -- Dial-Up
Network):
brat3 bluetooth # sdptool search DUN
Inquiring ...
Searching for DUN on 00:0B:0D:08:D7:EA ...
Searching for DUN on 00:13:70:0C:6C:DC ...
Service Name: Dial-up networking
Service RecHandle: 0x10010
Service Class ID List:
"Dialup Networking" (0x1103)
"Generic Networking" (0x1201)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel: 1
Language Base Attr List:
code_ISO639: 0x656e
encoding: 0x6a
base_offset: 0x100
Profile Descriptor List:
"Dialup Networking" (0x1103)
Version: 0x0100
Аналогичным образом можно получить информацию о том, какие сервисы
поддерживает телефон с помощью команды sdptool browse. Можно
"потыкаться" в телефон при помощи команды l2ping:
brat3 Documentation # l2ping 00:13:70:0C:6C:DC
Ping: 00:13:70:0C:6C:DC from 00:0B:0D:08:CF:91 (data size 44) ...
0 bytes from 00:13:70:0C:6C:DC id 0 time 45.84ms
0 bytes from 00:13:70:0C:6C:DC id 1 time 9.14ms
0 bytes from 00:13:70:0C:6C:DC id 2 time 10.16ms
0 bytes from 00:13:70:0C:6C:DC id 3 time 9.12ms
4 sent, 4 received, 0% loss
Понятно, что МАК-адрес взят из результатов работы hcitool scan. Теперь
неплохо бы связать полученные устройства с файлами устройств. Если не
установлена devfs, то запускаем такой скриптик (заимствован из
/usr/src/bluez-utils-2.3/scripts/create_dev:
#!/bin/sh
#
I=0
while [ $I -lt 256 ]; do
if [ ! -c /dev/rfcomm$I ]; then
mknod -m 666 /dev/rfcomm$I c 216 $I
fi
I=`expr $I + 1`
done
Проверим, не связаны ли порты с какими-нибудь Bluetooth-устройствами
при помощи команды rfcomm show. Если команда ничего не вывела,
продолжаем работу, если вывела, запустим rfcomm release
00:13:70:0C:6C:DC (00:13:70:0C:6C:DC -- МАК-адрес интересующего меня
устройства, в данном случае, телефона)
Свяжем модем телефона и порт /dev/rfcomm0:
rfcomm bind 0 00:13:70:0C:6C:DC 1
Здесь bind -- команда указывающая связать порт и устройство, 0 --
порядковый номер файла устройства (rfcomm0), 00:13:70:0C:6C:DC --
МАК-адрес устройства, 1 -- номер Bluetooth-канала.
Дальше, если установлена замечательная программа minicom, можем
попробовать подключиться к устройству /dev/rfcomm0 (не забыв его
прописать в настройках) Для того, чтобы запустится в режиме настройки,
дайте ключ "s" -- minicom -s. И не забудьте, что в момент подключения,
на телефоне высветится экран с предложением принять входящее
подключение, а потом надо будет ввести PIN-код, который Вы перед этим
ввели в /etc/bluetooth/pin.
Далее, тривиальный набор AT-команд:
ATZM8M8Ic
OKM8Ic
AT+CGDCONT=1,"IP","internet.beeline.ru"M8M8Ic
OKM8Ic
ATDT*99***#M8M8Ic
CONNECTM8Ic~ }#!}!} } }2}#}$#}!}$}%}"}&} }*} } g}%~~ }#!}!} } }2}#}$║
ATZ -- сбросить все настройки, AT+CGDCONT=1,"IP","internet.beeline.ru"
-- уже поднадоевшая строка инициализации мобильного модема,
ATDT*99***# -- команда "дозвона". Ну и дальше наблюдаем характерный
"PPP-мусор"
Теперь из minicom'а можно выйти (не забудем сбросить подключение)
Осталось настроить pppd. Начнём с чат-скрипта, у меня он находится в
/etc/ppp/chats/nokia-6021:
# Nokia 6021 EDGE, GPRS
# 57600,8,N,1, ctsfl=1, rtsctl=2
REPORT CONNECT
ABORT 'BUSY'
ABORT 'NO CARRIER'
ABORT 'ERROR'
ABORT 'ncorrect'
ABORT "NO ANSWER"
ABORT "NO DIALTONE"
''
'AT&FE0V1&D2&C1S0=0' 'OK'
'AT+CGDCONT=1,"IP","internet.beeline.ru"' 'OK'
'ATS0=0' 'OK'
'ATD\T' 'CONNECT'
Обратите внимание на то, что на 'ATDT*99***#' модем должен ответить не
'OK', а 'CONNECT'. Что до строки 'AT&FE0V1&D2&C1S0=0', то она тупо
заимствована из inf-файла Nokia-модема, установленного под Windows.
Теперь возьмёмся за /etc/ppp/peers/edge-beeline, который, собственно и
заведует всем подключением:
/dev/rfcomm0
user beeline
remotename internet.beeline.ru
debug
silent
noauth
novj
connect 'chat -v -e -t 60 -f /etc/ppp/chats/nokia-6021 -T *99***1#'
ipparam edge-beeline
Последний параметр -- ipparam можно исползовать для специфических
настроек в скриптах запуска и остановки -- /etc/ppp/ip-up и
/etc/ppp/ip-down.
Теперь надругаемся над файлом /etc/ppp/options:
# async character map -- 32-bit hex; each bit is a character
# that needs to be escaped for pppd to receive it. 0x00000001
# represents '\x01', and 0x80000000 represents '\x1f'.
asyncmap 0
# Require the peer to authenticate itself before allowing network
# packets to be sent or received.
# Please do not disable this setting. It is expected to be standard in
# future releases of pppd. Use the call option (see manpage) to disable
# authentication for specific peers.
noauth
# Use hardware flow control (i.e. RTS/CTS) to control the flow of data
# on the serial port.
crtscts
# Specifies that pppd should use a UUCP-style lock on the serial device
# to ensure exclusive access to the device.
lock
# Don't show the passwords when logging the contents of PAP packets.
# This is the default.
hide-password
# Use the modem control lines. On Ultrix, this option implies hardware
# flow control, as for the crtscts option. (This option is not fully
# implemented.)
modem
# Set the interface netmask to , a 32 bit netmask in "decimal dot"
# notation (e.g. 255.255.255.0).
#netmask 255.255.255.0
defaultroute
# Disables the default behaviour when no local IP address is specified,
# which is to determine (if possible) the local IP address from the
# hostname. With this option, the peer will have to supply the local IP
# address during IPCP negotiation (unless it specified explicitly on the
# command line or in an options file).
noipdefault
# Enables the "passive" option in the LCP. With this option, pppd will
# attempt to initiate a connection; if no reply is received from the
# peer, pppd will then just wait passively for a valid LCP packet from
# the peer (instead of exiting, as it does without this option).
passive
# Add an entry to this system's ARP [Address Resolution Protocol]
# table with the IP address of the peer and the Ethernet address of this
# system.
proxyarp
# If this option is given, pppd will send an LCP echo-request frame to the
# peer every n seconds. Normally the peer should respond to the echo-request
# by sending an echo-reply. This option can be used with the
# lcp-echo-failure option to detect that the peer is no longer connected.
lcp-echo-interval 30
# If this option is given, pppd will presume the peer to be dead if n
# LCP echo-requests are sent without receiving a valid LCP echo-reply.
# If this happens, pppd will terminate the connection. Use of this
# option requires a non-zero value for the lcp-echo-interval parameter.
# This option can be used to enable pppd to terminate after the physical
# connection has been broken (e.g., the modem has hung up) in
# situations where no hardware modem control lines are available.
lcp-echo-failure 4
#no compression
novjccomp
nopcomp
noaccomp
novj
nobsdcomp
Ну и в завершении процесса, не забудем файл PAP-авторизации
/etc/ppp/pap-secrets:
# alpha * password
beeline * beeline
Nokia 6021, разрешение на подключение
Nokia 6021, авторизация подключения
Осталось набрать pppd call edge-beeline, где edge-beeline -- название
peer-файла, который мы создали в /etc/ppp/peers/edge-beeline.
Если Вы используете других провайдеров, то несомненно некоторые
параметры в описанных настроечных файлах изменятся. Как минимум,
изменятся пароль, логин, тип авторизации и т.д.
Не забываем авторизовать подключение с телефона и если всё прошло
успешно, то наблюдаем в tail -f /var/log/messages (если Вы не засунули
ppp-лог ещё куда-нибудь) что-то в таком роде:
2005-11-23T23:40:37+0300 brat3 pppd[[ :]] local IP address 212.119.122.220
2005-11-23T23:40:37+0300 brat3 pppd[[ :]] remote IP address 212.119.97.85
2005-11-23T23:40:37+0300 brat3 pppd[[ :]] primary DNS address 212.119.96.33
2005-11-23T23:40:37+0300 brat3 pppd[[ :]] secondary DNS address 212.119.97.5
2005-11-23T23:40:37+0300 brat3 pppd[[ :]] Script /etc/ppp/ip-up started (pid9058)
2005-11-23T23:40:38+0300 brat3 pppd[[ :]] Script /etc/ppp/ip-up finished (pid 9058), status = 0x0
Ну чтож. Осталось запустить ping и наслаждаться моментом:
brat3 bluetooth # ping ya.ru
PING ya.ru (213.180.204.8) 56(84) bytes of data.
64 bytes from ya.ru (213.180.204.8): icmp_seq=1 ttl=50 time=2553 ms
64 bytes from ya.ru (213.180.204.8): icmp_seq=2 ttl=50 time=1696 ms
64 bytes from ya.ru (213.180.204.8): icmp_seq=3 ttl=50 time=820 ms
64 bytes from ya.ru (213.180.204.8): icmp_seq=4 ttl=50 time=789 ms
Вот, пожалуй и всё. Если Вам захочется почитать про настройки таких
пакетов, как gnome-bluetooth или kdebluetooth, обратитесь, например, к
статье "The host-to-host Bluetooth HOWTO"
1 Если Вам захочется поподробнее узнать о командах GPRS и об
этой строке инициализации, в частности, загляните на сайт IETF и
поищите там спецификации AT GSM, ну хотя бы 3GPP TS 07.07 и почитайте
раздел "Command for GPRS"
© Денис Евстигнеев