Sunday 2 September 2007

Настройка GPRS подключения в Linux через bluetooth

Буду писать о граблях, на которые я наступил, настраивая GNU/Linux, начну с настройки bluetooth и gprs:

настройка bluetooth+gprs в GNU/Linux
OS Debian etch 4.0 GNU/Linux kernel 2.6.21
bluetooth dongle Belkin BU-2083
phone Nokia 6021
bluez-utils 3.7-1
Для работы bluetooth в GNU/Linux были использованы драйвера Bluez, поставляемые с ядром.Ставим драйвера apt-get install bluez-utils, также необходимо наличие pppd.
Работоспособность bluetooth можно определить с помощью команды(от рута)
# hciconfig -a
hci0: Type: USB
BD Address: 00:0A:3A:6F:0A:76 ACL MTU: 1017:8 SCO MTU: 64:8
UP RUNNING PSCAN
RX bytes:7844 acl:182 sco:0 events:203 errors:0
TX bytes:3506 acl:161 sco:0 commands:61 errors:0
Features: 0xff 0xff 0x8d 0xfe 0x9b 0xf9 0x00 0x80
Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
Link policy: RSWITCH HOLD SNIFF PARK
Link mode: ACCEPT MASTER
Name: 'malafeev-0'
Class: 0x000100
Service Classes: Unspecified
Device Class: Computer, Uncategorized
HCI Ver: 2.0 (0x3) HCI Rev: 0x2073 LMP Ver: 2.0 (0x3) LMP Subver: 0x4127
Manufacturer: Broadcom Corporation (15)
UP означает, что адаптер работает, если не работает то необходимо исправить файл
/etc/bluetooth/hcid.conf, вот то что у меня(я исправил autoinit,security,class 0x100 это компютер):

#
# HCI daemon configuration file.
#

# 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;

# Default PIN code for incoming connections
passkey "1234";
}

# Default settings for HCI devices
device {
# Local device name
# %d - device id
# %h - host name
name "%h-%d";

# Local device class
class 0x100;

# 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,master;

# 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;
}


Перезапускаем сервисы Bluetooth
# /etc/init.d/bluetooth restart
Restarting bluetooth: hcid sdpd rfcomm.

От обычного пользователя даём команду :
$ hcitool scan
Scanning ...
00:16:BC:D6:92:1D Nokia 6021
записываем mac-адрес телефона.
Связь с телефоном можно проверить так:
# l2ping 00:16:BC:D6:92:1D
Ping: 00:16:BC:D6:92:1D from 00:0A:3A:6F:0A:76 (data size 44) ...
0 bytes from 00:16:BC:D6:92:1D id 0 time 31.91ms
0 bytes from 00:16:BC:D6:92:1D id 1 time 9.62ms
0 bytes from 00:16:BC:D6:92:1D id 2 time 8.39ms

Список поддерживаемых профилей bluetooth можно получить с помощью команды:
$ sdptool browse phone_mac, где phone_mac-mac адрес телефона.

При связывании телефон запросит pin, этот-же pin необходимо ввести в компьютер, в старых версиях bluez использовалась утилита pin_helper, путь к которой прописывался в файле /etc/hcid.conf, в новых версиях используется утилита passkey-agent, идём в /usr/share/doc/bluez-utils/examples, распаковываем и собираем утилиту(от рута, понадобится пакет libdbus-1-dev), далее запускаем её
./passkey-agent --default 1234, она будет висеть и передавать в bluez указанный pin.


Далее начлось самое интересное, необходимо связать телефон с /dev/rfcommX , где X-номер порта, у меня X=0, это можно сделать двумя способами:
1) с помощью правки файла /etc/bluetooth/rfcomm.conf(необходимо внести mac-адрес телефона), что я и сделал, затем, выполнил команду
# echo ATZ > /dev/rfcomm0, телефон запросил pin, я ввёл 1234, телефон сказал подключено затем через несколько секунд отключено.
2)с помощью команды rfcomm connect :
rfcomm connect rfcomm0 00:16:BC:D6:92:1D 1
при первом подключении телефон запросит pin(passkey-agent должен быть запущен)

Далее необходима настройка pppd:
1)В файл /etc/ppp/peers/mts записываем
/dev/rfcomm0 57600
connect '/usr/sbin/chat -v -f /etc/ppp/chat/mts'
noauth
defaultroute
lock
debug
novjccomp
nopcomp
noaccomp
nodeflate
novj
nobsdcomp
default-asyncmap
ipcp-accept-local
ipcp-accept-remote
usepeerdns
user mts
nodetach
2) в /etc/ppp/chat/mts записываем
TIMEOUT 5
ECHO ON
ABORT '\nBUSY\r'
ABORT '\nERROR\r'
ABORT '\nNO ANSWER\r'
ABORT '\nNO CARRIER\r'
ABORT '\nNO DIALTONE\r'
ABORT '\nRINGING\r\n\r\nRINGING\r'
'' \rAT
TIMEOUT 12
OK ATH
OK ATE1
OK AT+CGDCONT=1,"IP","internet.mts.ru"
OK ATD*99***1#
CONNECT
3) в файл /etc/ppp/pap-secrets записываем
mts ppp0 "mts"

подключаемся pppd call mts(от рута)