Проверяем, присутствует ли Bluetooth устройство в нашем компьютере:
# dmesg | grep Blue
Ожидаемый вывод:
Bluetooth: Core ver 2.11
Bluetooth: HCI device and connection manager initialized
Bluetooth: HCI socket layer initialized
Bluetooth: L2CAP ver 2.9
Bluetooth: L2CAP socket layer initialized
Bluetooth: RFCOMM socket layer initialized
Bluetooth: RFCOMM TTY layer initialized
Bluetooth: RFCOMM ver 1.8
Bluetooth: HCI USB driver ver 2.9
Bluetooth: HCI device and connection manager initialized
Bluetooth: HCI socket layer initialized
Bluetooth: L2CAP ver 2.9
Bluetooth: L2CAP socket layer initialized
Bluetooth: RFCOMM socket layer initialized
Bluetooth: RFCOMM TTY layer initialized
Bluetooth: RFCOMM ver 1.8
Bluetooth: HCI USB driver ver 2.9
Инсталлируем необходимые нам пакеты:
# aptitude install bluetooth bluez-utils
Как минимум, для работы будет нужен ещё пакет obex-data-server, он подтянется как зависимость.
После инсталляции пакетов смотрим, что же за Bluetooth устройство у нас в компьютере:
# hciconfig
Если вывод напоминает нижеследующее, то устройство мы обнаружили, в противном случае имеет смысл попробовать включить устройство или озаботится иными способами его инициализации:
hci0:
Type: USB
BD Address: mac.address ACL MTU: 1017:8 SCO MTU: 64:8
UP RUNNING PSCAN ISCAN
RX bytes:957 acl:0 sco:0 events:25 errors:0
TX bytes:348 acl:0 sco:0 commands:25 errors:0
....
Type: USB
BD Address: mac.address ACL MTU: 1017:8 SCO MTU: 64:8
UP RUNNING PSCAN ISCAN
RX bytes:957 acl:0 sco:0 events:25 errors:0
TX bytes:348 acl:0 sco:0 commands:25 errors:0
....
Устройство можно включать программным образом или выключать, в дальнейшем нам это пригодится:
# hciconfig hci0 up
# hciconfig hci0 down
# hciconfig hci0 down
Более детальные данные о устройстве можно получить той же командой с соответствующим ключем:
# hciconfig -a
Сведения об определённых параметрах устройства можно получить с помощью ещё одной команды, например, сейчас мы узнаем MAC адреса всех Bluetooth устройств системы:
# hcitool dev
Займёмся изучением доступного нам Bluetooth окружения (перед сканированием на предмет обнаружения Bluetooth устройств временно включаем на искомом устройстве режим полной видимости):
# hcitool scan
Получаем вывод:
Scanning ...
mac.address remote.bluetooth.device.name
....
mac.address remote.bluetooth.device.name
....
После сканирования и обнаружения Bluetooth устройства включаем на нем режим невидимости, в дальнейшем доступ к устройству будем получать по MAC адресу.
Сканируем обнаруженное устройство на предмет поддерживаемых им сервисов:
# sdptool browse mac.address
Вывод, если он есть, обычно очень большой и детальный. Чем устройство дороже и современнее, тем больше технологий и протоколов оно поддерживает.
Проверяем, доступно ли нам Bluetooth устройство:
# l2ping mac.address
Вывод на подобии следующего говорит о доступности, в противном случае пакеты не найдут устройство:
Ping: mac.address from mac.address (data size 44) ...
0 bytes from mac.address id 0 time 6.99ms
0 bytes from mac.address id 1 time 7.41ms
0 bytes from mac.address id 2 time 14.94ms
....
0 bytes from mac.address id 0 time 6.99ms
0 bytes from mac.address id 1 time 7.41ms
0 bytes from mac.address id 2 time 14.94ms
....
Наша текущая задача - создать конфигурацию для подключения GPRS через мобильный телефон с интерфейсом Bluetooth. Условия для Bluetooth подключения мы создали, теперь создадим и зафиксируем за нашим сервисом виртуальный порт, который в дальнейшем будем использовать не задумываясь о его настройках.
Редактируем файл /etc/bluetooth/hcid.conf, корректируя данные (ранее мы их получили из вывода команды hcitool scan):
....
device {
....
name "remote.bluetooth.device.name";
....
passkey "superstrong.passkey";
}
....
device {
....
name "remote.bluetooth.device.name";
....
passkey "superstrong.passkey";
}
....
В конфигурации выше ключ "passkey" не используется, но для спокойствия установим его в какое нибудь не слишком очевидное значение, для того, чтобы его нельзя было с ходу подобрать.
Редактируем файл /etc/bluetooth/rfcomm.conf внося туда "мак-адрес" телефона и определяя параметры создаваемого виртуального порта:
rfcomm0 {
bind yes;
device mac.address;
channel 1;
comment "Dial-up networking gateway";
}
bind yes;
device mac.address;
channel 1;
comment "Dial-up networking gateway";
}
Перезапускаем службу Bluetooth для принятия изменений:
# /etc/init.d/bluetooth restart
После перезапуска службы можно походить по файлам журналирования событий и посмотреть, что из этого вышло. Так же, если все прошло удачно, можно убедится в том, что виртуальный порт для связи с нашим Bluetooth устройством создан и готов к работе:
# ls /dev/rfcomm0
Как известно, для "спаривания" большей части Bluetooth устройств, в целях безопасности, необходимо передать между ними ключ, иначе говоря "пинкод". Лично я в Debian Lenny делал это двумя способами, далее опишу вначале красивый способ, а потом простой.
В новых версиях Bluez из конфигурации (/etc/bluetooth/hcid.conf) исчезла опция "pin_helper", которая указывала на программу принимающую ПИН-код от пользователя и передающую его удалённому bluetooth-устройству. Теперь эти операции осуществляются через вызовы D-Bus, поэтому, для нормального функционирования, нужно использовать некое приложение, отрабатывающее в D-Bus, например passkey-agent из набора примеров.
Для сборки passkey-agent делаем следующее:
# aptitude install libdbus-1-dev
# cp -R /usr/share/doc/bluez-utils/examples/ /usr/src/
# cd /usr/src/examples/
# gzip -d ./passkey-agent.c.gz
# make
# cp ./passkey-agent /etc/bluetooth
# cp -R /usr/share/doc/bluez-utils/examples/ /usr/src/
# cd /usr/src/examples/
# gzip -d ./passkey-agent.c.gz
# make
# cp ./passkey-agent /etc/bluetooth
Запускаем passkey-agent с ключевым кодом применяемым для "сопряжения" Bluetooth устройств:
# /etc/bluetooth/passkey-agent --default secret.pincode &
Пробуем провести первое "сопряжение" Bluetooth устройств:
# echo ATZ > /dev/rfcomm0
В процессе "сопряжения" необходимо ввести пароль (указанный нами в качестве опции passkey-agent) на телефоне. После этого на телефоне в списке сопряжённых устройства для устройства-компьютера установить опцию "Авто-подключение без подтверждения", тогда телефон больше не будет спрашивать пароля при каждом соединении.
Это был красивый вариант, в соответствии, так сказать, с духом автоматизации и "скриптизации" всего сущего. Но есть и другой способ, ручной. Вносим сочетание идентификатора удалённого устройства, в роли которого выступает MAC адрес и "пин-кода" в один из файлов описания нашего Bluetooth устройства производим "спарку" устройств и не морочим себе голову:
# echo "remote.device.mac.address secret.pincode" >> /var/lib/bluetooth/local.device.mac.address>/pincodes
# echo ATZ > /dev/rfcomm0
# echo ATZ > /dev/rfcomm0
Сочиним скрипт, связывающий нас с удалённым устройством-модемом если этого не было сделано заранее:
# mkdir -p /etc/custom/bluetooth
# touch /etc/custom/bluetooth/pair.mobile0.sh
# chmod ug+x /etc/custom/bluetooth/pair.mobile0.sh
# touch /etc/custom/bluetooth/pair.mobile0.sh
# chmod ug+x /etc/custom/bluetooth/pair.mobile0.sh
#!/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
check_rfcomm=`ls /dev | grep rfcomm0`;
if [ $check_rfcomm ]
then
echo "Device rfcomm0 already exist"
else
/usr/sbin/hciconfig hci0 up
sleep 2
/usr/bin/rfcomm bind 0 mac.address 1
fi
exit 1
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
check_rfcomm=`ls /dev | grep rfcomm0`;
if [ $check_rfcomm ]
then
echo "Device rfcomm0 already exist"
else
/usr/sbin/hciconfig hci0 up
sleep 2
/usr/bin/rfcomm bind 0 mac.address 1
fi
exit 1
Выше в скрипте:
bind - команда указывающая связать порт и устройство,
0 - порядковый номер файла устройства (rfcomm0),
1 - номер Bluetooth-канала.
0 - порядковый номер файла устройства (rfcomm0),
1 - номер Bluetooth-канала.