воскресенье, 31 января 2010 г.

Настройка раздачи интернета через bluetooth и не только.

Захотелось мне использовать свой телефон SE k750i в качестве пульта управления. Чтобы можно было слушать радио на роутере и рулить этим процессом не включая ББ. Ну это пока в будущем, а на данный момент я настроил доступ к роутеру и в инет с телефона с помощью bluetooth.
О том, как я это сделал и посвящена эта заметка.

В наличии у меня был телефон SE k750i и два брелка (Gembird BTD-002 и Defender (модель не знаю)).

Оба брелка, до этого работали в ББ и прекрасно справлялись со своей работой. Лично мне было интересно, заработают ли они в моем роутере (Asus wl-500gP). Сразу скажу, что оба брелка заработали.

При настройке я пользовался Gembird'ом, а потом поставил Defender. Gembird же вернулся на свое место в ББ. Прежде, чем перейти к подробному описанию всего процесса, ещё несколько фотографий брелка:

Ну а теперь к делу.
Но прежде, не большое, но важное замечание. Судя по сообщениям с форума wl500g.info роутер не любит работать с USB 1.1 устройствами через USB-HUB 2.0. Поэтому рекомендуется USB 1.1 брелки подключать непосредственно в роутер, либо через USB-HUB 1.1. Ну или можно поискать USB 2.0 брелок, вполне возможно, что он заработает через USB-HUB 2.0, но гарантировать это я не буду, потому как не проверял.
Лично у меня таких проблем не возникло, потому как мой роутер проапгрейжен по полной программе: ОЗУ: 128 Мб плюс 2+2 USB-порта и ещё COM-порт в запасе. Кроме того, роутер прошит прошивкой от энтузиастов на данный момент времени 1.9.2.7-d-r740 хотя есть свежие прошивки.

1. Для работы будет использоваться комплект утилит bluez. Но как выяснилось  не все версии bluez одинаково полезны. Нужно ставить именно те, что указываю я:
bluez-hcidump_1.40-1_mipsel.ipk
bluez-libs_3.17-1_mipsel.ipk
bluez-utils_3.17-1_mipsel.ipk
dbus_1.1.1-3_mipsel.ipk

Их можно найти на форуме  wl500g.info
Находим указанные версии утилит и скачиваем их например в /opt/temp
Если другие версии этих утилит ещё не ставились, то ставим их так:
ipkg install /opt/temp/dbus_1.1.1-3_mipsel.ipk
ipkg install /opt/temp/bluez-libs_3.17-1_mipsel.ipk
ipkg install /opt/temp/bluez-utils_3.17-1_mipsel.ipk
ipkg install /opt/temp/bluez-hcidump_1.40-1_mipsel.ipk

 Если же, Вы уже пытались ставить другие(свежие) версии, то указываем ключ для установки более старых версий программ:
ipkg install -force-downgrade /opt/temp/dbus_1.1.1-3_mipsel.ipk
ipkg install -force-downgrade /opt/temp/bluez-libs_3.17-1_mipsel.ipk
ipkg install -force-downgrade /opt/temp/bluez-utils_3.17-1_mipsel.ipk
ipkg install -force-downgrade /opt/temp/bluez-hcidump_1.40-1_mipsel.ipk


2. Исправляем конфигурационные файлы, в качестве пользователя для запуска указываем admin:
/opt/etc/dbus-1/system.conf 
<!-- Run as special user -->
<user>admin</user>

 

/opt/etc/dbus-1/system.d/bluetooth.conf 
  <policy user="admin"> 

/opt/etc/bluetooth/hcid.conf  приводим к следующему виду:
## 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 "456789";

}

# Default settings for HCI devices
device {

  # Local device name
  # %d - device id
  # %h - host name
  name "BlueZ (%h)";

  # Local device class
  class 0x000100;

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

 т.е. меняется:
   security auto; - чтобы можно подключаться при помощи ПИНа.
   passkey "456789"; - указываем сам ПИН.
   name "BlueZ (%h)"; - указываем имя, под которым будет виден наш роутер в bluetooth сети. Можно указать своё имя.
 class 0x000100; - Я не менял, но мне попадалась рекомендация установить значение 0x020100 - «Класс службы: Сеть» и «Класс устройства: Компьютер, без категории». Но у меня и со значением по умолчанию всё работает.
  lm accept,master; - добавляем ",master" если не было.

3. Скачиваем дополнительные модули. Модули нужно брать для своей прошивки. Лично я взял со странички с прошивкой от энтузиастов версию для своей прошивки modules-1.9.2.7-d-r740.tgz
Распаковываем все или только нужные модули.
Лично я распаковал все модули в каталог: /opt/lib/modules в результате у меня появился каталог 2.4.37.6 содержаший все доступные модули для моей прошивки.
Если нет желания/возможности распаковать все модули, то можно взять только нужные, а именно:
bluez.o
bnep.o
crc32.o
hci_usb.o
l2cap.o
rfcomm.o
sco.o

 

Создаем скрипт-загрузчик модулей /opt/etc/bluetooth/loadmodules следующего содержания:
#!/bin/sh

modprobe crc32
modprobe bluez
modprobe hci_usb
modprobe l2cap
#modprobe rfcomm  этот модуль мне не нужен
modprobe bnep
#modprobe sco модуль для передачи звука через bluetooth мне тоже пока не нужен

 
Модули, которые мне не нужны я закомментарил. Если Вы распаковали модули в место отличное от /opt/lib/modules, то нужно указать полные пути к загружаемым модулям.

Вызов скрипта-загрузчика вставляем в post-mount:
. . . 
# грузим модули для работы с bluetooth
/opt/etc/bluetooth/loadmodules
. . .

После изменения post-mount, не забываем сделать
flashfs save && flashfs commit && flashfs enable
Чтобы изменения в post-mount не потерялись после перегрузки. 

4. Приводим в порядок файл запуска DBus - /opt/etc/init.d/S20dbus
Во-первых он должен быть исполняемым. Во-вторых убираем (или комментируем) из него проверку существования пользователя messagebus. И в-третьих меняем пользователя, под которым будет работать демон DBus. Вот содержимое моего скрипта запуска DBus:
#!/bin/sh
#OPTWARE_TARGET=ddwrt
# -*- coding: utf-8 -*-
# Debian init.d script for D-BUS
# Copyright Вc 2003 Colin Walters <walters@debian.org>

PATH=/sbin:/bin:/usr/bin:/usr/sbin:/opt/bin:/opt/sbin

set -e

DAEMON=/opt/bin/dbus-daemon
NAME=dbus
DAEMONUSER=admin
PIDDIR=/opt/var/run/dbus
PIDFILE=$PIDDIR/pid
DESC="system message bus"

test -x $DAEMON || exit 0

# Source defaults file; edit that file to configure this script.
ENABLED=1
PARAMS=""
if [ -e /opt/etc/default/dbus ]; then
   . /opt/etc/default/dbus
fi

test "$ENABLED" != "0" || exit 0

start_it_up()
{
   if [ ! -d $PIDDIR ]; then
     mkdir -p $PIDDIR
     chown $DAEMONUSER $PIDDIR
     chgrp $DAEMONUSER $PIDDIR
   fi
   if [ -e $PIDFILE ]; then
     echo "$DESC already started; not starting."
   else
     echo -n "Starting $DESC: "
     ${DAEMON} --system $PARAMS
     echo "$NAME."
   fi
}

shut_it_down()
{
   echo -n "Stopping $DESC: "
   if [ -e $PIDFILE ]; then
     kill `cat $PIDFILE`
   else
     killall ${DAEMON}
   fi
   echo "$NAME."
   rm -f $PIDFILE
}

case "$1" in
   start)
     start_it_up
     ;;
   stop)
     shut_it_down
     ;;
   restart|force-reload)
     shut_it_down
     sleep 1
     start_it_up
     ;;
   *)
     echo "Usage: /opt/etc/init.d/$NAME {start|stop|restart|force-reload}" >&2
     exit 1
     ;;
esac

exit 0

Файл конфигурации DBus, лежащий по пути /opt/etc/default/dbus я не менял. 

5. Приводим в порядок файл запуска демона hci /opt/etc/init.d/bluetooth
Во-первых переименовываем его в S40bluetooth и делаем исполняемым. Во-вторых добавляем в переменную PATH пути для /opt/bin и /opt/sbin. А в-третьих можно добавить вариант работы скрипта для режима restart. После этих доработок, мой скрипт выглядит так:
#!/bin/sh

#
# Start/stop the Bluetooth daemons
#

set -e

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/opt/sbin:/opt/bin
NAME=bluetooth
DESC="Bluetooth subsystem"

DAEMON_NAME=hcid
HID2HCI_NAME=hid2hci

DAEMON_EXEC="`which $DAEMON_NAME || true`"
HID2HCI_EXEC="`which $HID2HCI_NAME || true`"

DAEMON_ENABLE=true
HID2HCI_ENABLE=false

DAEMON_CONFIG="/opt/etc/bluetooth/hcid.conf"

[ -e /etc/default/bluetooth ] && . /etc/default/bluetooth

case "$1" in
   start)
     echo -n "Starting $DESC:"
     if $DAEMON_ENABLE && [ -x "$DAEMON_EXEC" ] && [ -f "$DAEMON_CONFIG" ] ; then
        $DAEMON_EXEC -s -f $DAEMON_CONFIG
        echo -n " $DAEMON_NAME"
     fi
     if $HID2HCI_ENABLE && [ -x "$HID2HCI_EXEC" ] ; then
        $HID2HCI_EXEC --tohci > /dev/null 2>&1 || true
        echo -n " $HID2HCI_NAME"
     fi
     echo "."
     ;;
   stop)
     echo -n "Stopping $DESC:"
     killall $DAEMON_NAME > /dev/null 2>&1 || true
     echo -n " $DAEMON_NAME"
     echo "."
     ;;
   restart)
     echo -n "Stopping $DESC:"
     killall $DAEMON_NAME > /dev/null 2>&1 || true
     echo -n " $DAEMON_NAME"
     echo "."

     echo -n "Starting $DESC:"
     if $DAEMON_ENABLE && [ -x "$DAEMON_EXEC" ] && [ -f "$DAEMON_CONFIG" ] ; then
       $DAEMON_EXEC -s -f $DAEMON_CONFIG
       echo -n " $DAEMON_NAME"
     fi
     if $HID2HCI_ENABLE && [ -x "$HID2HCI_EXEC" ] ; then
       $HID2HCI_EXEC --tohci > /dev/null 2>&1 || true
       echo -n " $HID2HCI_NAME"
     fi
     echo "."
     ;;
   *)
     N=/etc/init.d/$NAME
     echo "Usage: $N {start|stop|restart}" >&2
     exit 1
     ;;
esac

exit 0



Чтобы работал этот скрипт нужно поставить утилиту which. Для этого делаем:
ipkg install which 
  

Можно отредактировать файл конфигурации hci, который лежит в /opt/etc/default/bluetooth. Что не запускалась служба HID можно изменить значение HID2HCI_ENABLE=false
 
6. Создаем скрипт для запуска службы pand, которая будет принимать запросы от bluetooth устройств и поднимать связь с ними. Скрипт я назвал /opt/etc/init.d/S85mybt 
#!/bin/sh

NAME="MyBluetooth"

start() {
   echo "Starting $NAME... "
   /opt/bin/pand --listen --master --role NAP --devup /opt/etc/bluetooth/dev-up --devdown /opt/etc/bluetooth/dev-down
}

stop() {
   echo "Shutting down $NAME... "
   killall pand
}

case "$1" in
   start)
     start
     ;;
   stop)
     stop
     ;;
   restart)
     stop
     sleep 1
     start
     ;;
   *)
     echo "Usage: $0 (start|stop|restart)"
     exit 1
     ;;
esac
exit
0


Не забываем сделать его исполняемым.
Создаем скрипт который будет отрабатываться при поднятии соединения с bluetooth устройством /opt/etc/bluetooth/dev-up
#!/bin/sh

# $1 = имени интерфеса и равен bnep0 или точнее bnepx
# $2 = MAC подключающегося устройства
/usr/bin/logger -t $(basename $0) "started [$@]"

# файл, с разрешенными MAC
FILTER_MAC=/opt/etc/bluetooth/filter_mac
TESTS_MAC=$2

# проверяем наличие файла с разрешенными MAC
if [ -e $FILTER_MAC ]
then
   REZ="`cat $FILTER_MAC | grep -i $TESTS_MAC`"
   if [ -n "$REZ" ]
   then
   # разрешенный MAC, пускаем его в нашу сеть
   # /usr/bin/logger -t $(basename $0) "Good MAC [$@]"
     ifconfig $1 0.0.0.0
     brctl addif br0 $1
   else
     /usr/bin/logger -t $(basename $0) "The attention, forbidden MAC [$@]"
   fi
else
   # /usr/bin/logger -t $(basename $0) "Don't test MAC [$@]"
   ifconfig $1 0.0.0.0
   brctl addif br0 $1
fi

Делаем его исполняемым.

Создаем скрипт, который будет выполняться после разрыва соединения /opt/etc/bluetooth/dev-down 
#!/bin/sh
# $1 = имени интерфеса и равен bnep0 или точнее bnepx

/usr/bin/logger -t $(basename $0) "stoped [$@]"

Делаем его исполняемым. 

В принципе этот скрипт не особо нужен, поскольку ни чего полезного он не делает.
 

Можно ограничить доступ в вашу локальную сеть по MAC'у устройства с которого пытаются подключиться. Для этого нужно создать файл /opt/etc/bluetooth/filter_mac и заполнить его значениями MAC ваших устройств. Например так:
00:1B:59:53:4A:2C 
00:1B:59:53:7A:1C
Подсмотреть MAC, подключающегося устройства можно в System Log.
Там будут появляться строки примерно такого вида

19:04:17 31-01-2010 (notice|user|dev-up) dev-up: started [bnep0 00:1B:59:53:4A:2C]

Если же, ограничивать доступ по MAC Вы не собираетесь, то файл filter_mac создавать не нужно, а если уже создали, то удалите его.

7. В принципе, после этого можно вставить USB-Bluetooth брелок в роутер и перегрузиться. После загрузки можно пытаться подключаться.

8. Не обязательно, но лучше сделать. Была замечена неприятная особенность. При подключении/отключении происходит временное подвисание локальной сети за роутером. Связано это с перенастройкой бриджа(br0) при включении/исключении интерфейса bnep0,bnep1,... в/из бридж(а), при котором происходит изменение MAC br0 на MAC bnep0. Поскольку изменить MAC bnep0 на MAC br0, перед включением в бридж неполучалось, то осталось сделать наоборот, т.е. при загрузке роутера менять MAC br0 на MAC bluetooth брелка. Изменить MAC br0 можно как минимум двумя способами:
 1 - Менять MAC при загрузке роутера, например в скрипте post-boot или pre-boot;
 2 - Поменять MAC для интерфейса vlan0 в nvram.
Я выбрал первый вариант.
Для этого в скрипт post-boot я добавил следующие строки:

ifconfig vlan0 down
ifconfig vlan0 hw ether 00:11:67:5В:A9:75 <- MAC брелка (поменять на свой)
ifconfig vlan0 up

И сделал
flashfs save && flashfs commit && flashfs enable 
чтобы сохранить изменения. 

Для реализации второго варианта по идее нужно выполнить такую команду:
nvram set et0macaddr=00:11:67:5В:A9:75  <- MAC брелка (поменять на свой)
Но этот вариант я не проверял.
 

Узнать MAC брелка, можно вызвав ifconfig после установления связи:
ifconfig
bnep0 Link encap:Ethernet HWaddr 00:11:67:5В:A9:75
<- это MAC брелка
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:110 errors:0 dropped:0 overruns:0 frame:0
TX packets:352 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:7393 (7.2 KiB) TX bytes:263934 (257.7 KiB)

. . . 
 

Из замеченых минусов первого варианта. На мой взгляд, роутер стал грузиться дольше. Но я считаю, что это не существенный минус, поскольку я перегружаю роутер очень редко. До настройки bluetooth он у меня работал без перегрузки месяца два, а то и больше.

Собственно, по настройке роутера - это всё.

Что касается телефона. То там всё просто, хотя может и не очевидно.

Напоминаю, что у меня телефон SE k750i.

После того, как телефон спарился и соединился с роутером, в 

Меню->Параметры->Связь->Передача данных->Уч.записи данных  
появилась запись "BlueZ (IG...)"
 


 Потом идем в Меню->Параметры->Связь->Парам. Интернет->Параметры Java
и создаем профиль BT
 В качестве записи данных (подключ. через) в этом профиле задаем "BlueZ (IG...)"


 После этого можно использовать инет например в Opere:
 На этом пока все!!!

Комментариев нет:

Отправить комментарий