О том, как я это сделал и посвящена эта заметка.
В наличии у меня был телефон 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:
На этом пока все!!!
Комментариев нет:
Отправить комментарий