10 октября 2007

Кпк + Bluetooth + Linux box

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

Итак, вводные данные. Bluetooth адаптер, КПК под одной из разновидностей Windows mobile и стационарная рабочая станция с Linux на борту. В моём случае это USB Bluetooth брелок, HP iPAQ под управлением Win Mobile 2003 и Gentoo 2006.1.

Понадобятся пакеты bluez-libs, bluez-utils, iptables, ppp. Устанавливаем. Если ядро собрано самостоятельно - включаем в нём Networking -- Bluetooth subsystem support и всё нижележащее, также не забываем включить iptables и поддержку цели MASQUERADE в нём (Networking -- Networking options--Network packet filtering (replaces ipchains) -- IP: Netfilter Configuration -- MASQUERADE target support). Записываем в /etc/bluetooth/pin какое-нибудь число (будет применяться для подтверждения соединения, нам не важно). Редактируем /etc/bluetooth/rfcomm.conf, дабы он принял примерно такой вид:

rfcomm0
{
# автоматически биндить устройство при запуске
bind yes;
# MAC должен быть закомментирован
#
# device 11:22:33:44:55:66;
#
# RFCOMM канал для соединения
channel 2;
#Метка
comment "Bluetooth Access Point";
}


Если у вас запущены какие-то Bluetooth-сервисы, то правильно выберите канал, он должен быть уникальным. Для удобства можно зайти в /etc/bluetooth/hcid.conf и изменить name на что-то более понятное, например так:

name "BlueZ Access Point at %h";

чтобы не путать соединения с разными машинами, к которым вы будете подключаться.

Теперь /etc/ppp/options. У меня он был почти пуст. Добавляем (или меняем соотв. значения):

noauth
ms-dns 216.148.227.62
ms-dns 204.127.202.2

где IP - IP вашего DNS сервера (можно скопировать из /etc/resolv.conf)

На этом единовременные подготовления Большого Брата закончены. Теперь действия, которые должны быть выполнены при загрузке системы. Я оформил это в виде rc скрипта для своей системы, если же у вас sys V init (стиль скриптов загрузки, используемый в большинстве образованных от Redhat дистрибувов), замените его на аналогичный sh скрипт, убрав из него функцию depend и вызовы ebegin и eend.

#!/sbin/runscript

depend() {
use net
use iptables
after sshd
after bluetooth
after logger }

start() {
#modprobe rfcomm
#modprobe hci_usb
ebegin "Starting btlan"
[ -a /dev/rfcomm0 ]|| mknod /dev/rfcomm0 c 216 0
[ -a /dev/rfcomm1 ]|| mknod /dev/rfcomm1 c 216 1
[ -a /dev/rfcomm2 ]|| mknod /dev/rfcomm2 c 216 2
[ -a /dev/rfcomm3 ]|| mknod /dev/rfcomm3 c 216 3

hciconfig hci0 up
hcid
sdptool add SP
sdpd
rfcomm bind all
dund --listen --msdun --channel 2 10.20.4.89:10.0.0.111
echo '1' > /proc/sys/net/ipv4/ip_forward
# use a different ppp0 name if your server's incoming
#internet connection is coming from a different device
#(e.g. might be sit0 or ppp1, depending how your Linux is connected to the outside world).
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
iptables -A FORWARD -i ppp1 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
eend 0
}

stop() {
ebegin "Stopping btlan"
killall dund
rfcomm release all
killall sdpd
sdptool del SP
killall hcid
hciconfig hci0 down
[ -a /dev/rfcomm0 ]&& rm -f /dev/rfcomm0
[ -a /dev/rfcomm1 ]&& rm -f /dev/rfcomm1
[ -a /dev/rfcomm2 ]&& rm -f /dev/rfcomm2
[ -a /dev/rfcomm3 ]&& rm -f /dev/rfcomm3

eend 0 }

Несколько комментариев. У меня всё, касающееся Bluetooth было вкомпилировано в ядро, поэтому запуск modprobe для загрузки нужных модулей мне был не нужен. Возможно, вам потребуется загрузить и другие модули. В вызове dund первый IP - мой внутренний IP сети провайдера, получаемый по DHCP. Второй - будущий IP КПК. В первом вызове iptables интерфейс ppp0 заменяется на тот, с которого ваш Linux box получает интернет. Во втором вызове - ppp1 заменяется на первый незанятый ppp интерфейс.

Обратите внимание на функцию depend. Её запись означает, что данный скрипт требует работающей сети, iptables, sshd (как одно из возможных применений - в качестве пульта дистанционного управления ББ, вам, возможно, не понадобится) и после запуска служб bluetooth и журналирования. Исходя из этого, определите место для данного скрипта в вашей системе инициализации. Теперь при загрузки система будет предоставлять Bluetooth соединение. Если же вы носите Bluetooth брелок с собой, то можно настроить и автоматическое подключение устройства и создание Bluetooth сети, за это будет отвечать udev. Например у меня в директории /etc/udev/rules.d было установлено правило 70-bluetooth.rules, которое ссылалось на выполняемый при под- и отключении Bluetooth устройств скрипт:

KERNEL=="hci[0-9]*", RUN+="/lib/udev/bluetooth.sh"

который проверяет, подключили или отключили устройство и инициализирует его (добавленные мною строки заканчиваются пустым комментарием):

#!/bin/sh
#
# bluetooth.sh: udev external RUN script
#
# Copyright 2005-2006 Henrik Brix Andersen
# Distributed under the terms of the GNU General Public License v2

script=/etc/init.d/bluetooth
btlan=/etc/init.d/btlan #

# Find out where sysfs is mounted. Exit if not available
sysfs=`grep -F sysfs /proc/mounts | awk '{print $2}'`
if [ "$sysfs" = "" ]; then
echo "sysfs is required"
exit 1
fi

if [ ! -d $sysfs/class/bluetooth/hci[0-9]* ]; then
if $script --quiet status; then
$btlan stop #
$script stop
fi
else
if ! $script --quiet status; then
$script start
$btlan start #
fi
fi

Настройка клиента проста. Включаем Bluetooth, запускаем Bluetooth менеджер, создаём новое соединение, выбираем Explore bluetooth device, там выбираем свою точку доступа, среди предоставляемых ей сервисов выбираем LAN Acces Point. В Bluetooth менеджере создаётся ярлык. Запускаем. Предлагается ввести логин и пароль, оставляем пустыми все поля. Вы в сети.
Когда я покупал Bluetooth брелок, на коробочке с ним было гордо написано: "Built for Mac OS X" и "Designed for Microsoft Windows XP". И знаете что? Я её выкинул. Потому что поставляемым с брелоком ПО, достаточно неплохим, должен отметить, я аналогичного функционала добиться не смог.

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