Итак, мы настроили устройство Bluetooth-адаптера. Что дальше? Ну, для начала, если Ваш телефон умеет GPRS и у Вас есть подписка, можно настроить удалённый доступ через GPRS-модем, в роли которого будет выступать Ваш телефон, оснащённый Bluetooth. В принципе, всё, о чём пойдёт речь ниже - вполне применимо и к настройке доступа с помощью GPRS + IrDA. Разве что во втором случае в качестве модема будет использоваться устройство ircomm, а не знакомый нам уже rfcomm.
Самый простой способ ИМХО, это настроить соединение в какой-нибудь звонилке, а ля kppp. Хотя, можно сделать это и с помощью скриптов ppp. Описание второго способа попадалось мне довольно часто, поэтому я думаю, у желающих и без меня будет масса возможностей настроить доступ с помощью скриптов. Я приведу пример, но подробно останавливаться на деталях не буду. С kppp и того проще. Моя цель лишь указать на некоторые вещи, которые мешают установить работоспособное соединение и которые не всегда очевидны для начинающих пользователей.
Будем исходить их того, что Bluetooth у Вас уже настроен, как рассказывалось ранее и есть конфиг для устройства, эмулирующего последовательную линию - rfcomm (для IrDA это будет устройство ircomm). На настройках телефона останавливаться не будем. Они в любом случае не универсальны и будут зависеть от Вашего оператора, которого и надо будет терроризировать на предмет информации по этому поводу :)
Первое, что мы сделаем, это убедимся, что телефон предоставляет услугу удалённого доступа (для Bluetooth это профиль DUN, для IrDA всё немного проще, ибо у IrDA устройств нет профилей, как это имеет место с Bluetooth). При включенном Bluetooth-адаптере запускаем:
root@devel0:/home/f0x# hcitool scan Scanning ... 00:0E:07:DC:F8:3E Red Quick Fox root@devel0:/home/f0x# hcitool inq Inquiring ... 00:0E:07:DC:F8:3E clock offset: 0x71ce class: 0x520204 root@devel0:/home/f0x# sdptool browse Inquiring ... Browsing 00:0E:07:DC:F8:3E ... Service Name: Dial-up Networking Service RecHandle: 0x10000 Service Class ID List: "Dialup Networking" (0x1103) "Generic Networking" (0x1201) Protocol Descriptor List: "L2CAP" (0x0100) "RFCOMM" (0x0003) Channel: 1 Profile Descriptor List: "Dialup Networking" (0x1103) Version: 0x0100 Service Name: Voice gateway Service RecHandle: 0x10002 Service Class ID List: "Headset Audio Gateway" (0x1112) "Generic Audio" (0x1203) Protocol Descriptor List: "L2CAP" (0x0100) "RFCOMM" (0x0003) Channel: 3 Profile Descriptor List: "Headset" (0x1108) Version: 0x0100 Service Name: Serial Port 1 Service RecHandle: 0x10003 Service Class ID List: "Serial Port" (0x1101) Protocol Descriptor List: "L2CAP" (0x0100) "RFCOMM" (0x0003) Channel: 4 Service Name: Serial Port 2 Service RecHandle: 0x10004 Service Class ID List: "Serial Port" (0x1101) Protocol Descriptor List: "L2CAP" (0x0100) "RFCOMM" (0x0003) Channel: 5 Service Name: OBEX Object Push Service RecHandle: 0x10005 Service Class ID List: "OBEX Object Push" (0x1105) Protocol Descriptor List: "L2CAP" (0x0100) "RFCOMM" (0x0003) Channel: 10 "OBEX" (0x0008) Profile Descriptor List: "OBEX Object Push" (0x1105) Version: 0x0100 Service Name: IrMC Synchronization Service RecHandle: 0x10006 Service Class ID List: "IrMC Sync" (0x1104) Protocol Descriptor List: "L2CAP" (0x0100) "RFCOMM" (0x0003) Channel: 11 "OBEX" (0x0008) Profile Descriptor List: "IrMC Sync" (0x1104) Version: 0x0100 Service Name: HF Voice gateway Service RecHandle: 0x10007 Service Class ID List: "Handfree Audio Gateway" (0x111f) "Generic Audio" (0x1203) Protocol Descriptor List: "L2CAP" (0x0100) "RFCOMM" (0x0003) Channel: 6 Profile Descriptor List: "Handsfree" (0x111e) Version: 0x0100 Service Name: OBEX Basic Imaging Service RecHandle: 0x1000b Service Class ID List: "Imaging Responder" (0x111b) Protocol Descriptor List: "L2CAP" (0x0100) "RFCOMM" (0x0003) Channel: 15 "OBEX" (0x0008) Profile Descriptor List: "Imaging" (0x111a) Version: 0x0100 Service Name: OBEX File Transfer Service RecHandle: 0x1000f Service Class ID List: "OBEX File Transfer" (0x1106) Protocol Descriptor List: "L2CAP" (0x0100) "RFCOMM" (0x0003) Channel: 7 "OBEX" (0x0008) Profile Descriptor List: "OBEX File Transfer" (0x1106) Version: 0x0100
Первой командой мы просто сканируем эфир в поисках другого Bluetooth-устройства и находим его. Второй командной смотрим, что это за устройство - класс. Хотя второе - это скорее чисто эстетический манёвр для маньяков :) И наконец с помощью третьей команды мы узнаём, какие сервисы нам предоставляет удалённое устройство. Первый блок информации и есть то, что нам нужно:
Service Name: Dial-up Networking Service RecHandle: 0x10000 Service Class ID List: "Dialup Networking" (0x1103) "Generic Networking" (0x1201) Protocol Descriptor List: "L2CAP" (0x0100) "RFCOMM" (0x0003) Channel: 1 Profile Descriptor List: "Dialup Networking" (0x1103) Version: 0x0100Это наш профиль DUN (Dial-Up Networking).
Чобы создать соединение РРР, в /etc/ppp/peers создайте файл с именем новой точки. В этот файл мы свалим параметры для нового соединения. Скорее всего (во всяком случае, так обстоит дело с моим оператором), нам придётся отключить всякое сжатие. Должно получиться что-то вроде этого:
/dev/rfcomm0 # [ устройство, эмулирующее последовательною линию RS-232 по Bluetooth ] 115200 connect "/usr/sbin/chat /etc/chatscripts/gprs" noauth defaultroute lock debug # [ вставляем на всякий случай, пока всё не будет обкатано ] novjccomp nopcomp noaccomp nodeflate novj noccp nobsdcomp default-asyncmap ipcp-accept-local ipcp-accept-remote lcp-echo-failure 100 lcp-echo-interval 30 usepeerdns user <user_name>Здесь user_name - имя пользователя, под которым Вы будете стучаться на РРР-сервер Вашего оператора. Как показывает практика, у некототорых операторов есть определённые ограничения на работу с PPP при доступе по GPRS. Это касается прежде всего поддержки сжатия (специально наматывают траф? :( ). Отключаем, всё что можно:
- novjccomp, novj - отключить сжатие TCP/IP по Ван Якобсону.
- nobsdcomp - отключить сжатие пакетов по схеме BSD.
- nodeflate - отключить сжатие Deflation.
- noaccomp - отключить сжатие адресов/управляющих пакетов.
- nopcomp - отключить согласование сжатия между удалённой точкой и нашей машиной.
- noccp - отключить протокол управления сжатием.
Работа LCP в частности управляется параметрами lcp-echo-failure и lcp-echo-interval (на самом деле, параметров LCP, конечно, немного больше). Первый (lcp-echo-failure) задаёт максимальное количество попыток, по истечении которого считается, что произошёл сбой линии. Второй параметр (lcp-echo-interval) определяет временной интервал между посылками LCP-запросов, на которые удалённый сервер должен прислать своё эхо. Время устанавливается в секундах. В нашем случае параметры имеют значения 100 и 30 соответственно, т.е. если ни на один из посланных 100 запросов не был получен отклик, при том, что запросы отправляются с периодичностью в 30 с, то линия считается мёртвой и демон разрывает соединение. При этом в лог сыплется что-то вроде этого (при включении debug):
Nov 3 23:55:57 devel0 pppd[19993]: pppd 2.4.4 started by f0x, uid 1000 Nov 3 23:55:57 devel0 pppd[19993]: Using interface ppp0 Nov 3 23:55:57 devel0 pppd[19993]: Connect: ppp0 <--> /dev/rfcomm0 Nov 3 23:55:57 devel0 pppd[19993]: LCP: Rcvd Code-Reject for code 9, id 0 Nov 3 23:55:57 devel0 pppd[19993]: PAP authentication succeeded Nov 3 23:55:58 devel0 pppd[19993]: local IP address 10.20.85.219 Nov 3 23:55:58 devel0 pppd[19993]: remote IP address 212.98.170.50 Nov 3 23:55:58 devel0 pppd[19993]: primary DNS address 77.74.32.66 Nov 3 23:55:58 devel0 pppd[19993]: secondary DNS address 77.74.32.11 Nov 3 23:56:27 devel0 pppd[19993]: LCP: Rcvd Code-Reject for code 9, id 1 Nov 3 23:56:57 devel0 pppd[19993]: LCP: Rcvd Code-Reject for code 9, id 2 Nov 3 23:57:27 devel0 pppd[19993]: LCP: Rcvd Code-Reject for code 9, id 3 ... Nov 4 00:43:29 devel0 pppd[19993]: LCP: Rcvd Code-Reject for code 9, id 95 Nov 4 00:43:59 devel0 pppd[19993]: LCP: Rcvd Code-Reject for code 9, id 96 Nov 4 00:44:29 devel0 pppd[19993]: LCP: Rcvd Code-Reject for code 9, id 97 Nov 4 00:44:59 devel0 pppd[19993]: LCP: Rcvd Code-Reject for code 9, id 98 Nov 4 00:45:59 devel0 pppd[19993]: No response to 100 echo-requests
lock - традиционный параметр, предписывающий pppd создавать файл блокировки и т.о. обеспечивает исключительный доступ к соединению. defaultroute - установить новый маршрут к PPP-шлюзу, полученный при установке соединения, маршрутом по умолчанию. usepeerdns - использовать DNS удалённой точки, позволяет не заботиться о поиске собственного DNS :) noauth - не требовать от удалённой точки авторизации. ipcp-accept-local и ipcp-accept-remote - параметры, определяющие, будут ли приняты адреса удалённой точки и нашей машины по инициативе удалённого сервера, даже если локально адреса уже были заданы. Так в общих чертах обстоит дело с конфигурированием соединения с удалённой точкой - РРР-сервером.
Далее, в случае с настройкой соединения с помощью скриптов идёт скрипт чата, определяющий реакцию на состояния линии ("занято", "звонок", "удалённый модем положил трубку" и т.п.). Здесь же прописывается номер, который набирает модем. В общих чертах скрипт чата выглядит так:
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-address" OK ATD*99*1# TIMEOUT 22 CONNECTКладём этот файл в /etc/chatscripts/ под именем, ну, хотя бы gprs (за более подробными сведениями обращайтесь к man-страницам). Далее, в файле /etc/ppp/pap-secrets прописываем имя пользователя и пароль:
user_name * passwordгде user_name и password - соответственно имя пользователя и пароль, под которыми Вы ходите на сервер оператора. В общих чертах, всё. Теперь можно устанавливать соединение командой pppd call peer-name, где peer-name - имя точки доступа в /etc/ppp/peers.
Настройка доступа с помощью kppp отличается лишь тем, что параметры конфигурации для pppd и прочее нужно прописывать не в файлах ppp, а в диалогах kppp. В качестве устройства модема при конфигурировании устройства в kppp указывайте /dev/ircomm0 (или другое число вместо нуля в зависимости от того, как у вас настроена подсистема ircomm).
No comments:
Post a Comment