UMGUM.COM (лучше) 

Linux + Bluetooth ( Linux + Bluetooth. )

31 марта 2010  (обновлено 27 мая 2017)

Эта публикация отнесена в архив. Она неактуальна.

OS: Debian Lenny.

Проверяем, присутствует ли 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

Инсталлируем необходимые нам пакеты:

# 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
....

Устройство можно включать программным образом или выключать, в дальнейшем нам это пригодится:

# hciconfig hci0 up
# hciconfig hci0 down

Более детальные данные о устройстве можно получить той же командой с соответствующим ключем:

# hciconfig -a

Сведения об определённых параметрах устройства можно получить с помощью ещё одной команды, например, сейчас мы узнаем MAC адреса всех Bluetooth устройств системы:

# hcitool dev

Займёмся изучением доступного нам Bluetooth окружения (перед сканированием на предмет обнаружения Bluetooth устройств временно включаем на искомом устройстве режим полной видимости):

# hcitool scan

Получаем вывод:

Scanning ...
  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
....

Наша текущая задача - создать конфигурацию для подключения GPRS через мобильный телефон с интерфейсом Bluetooth. Условия для Bluetooth подключения мы создали, теперь создадим и зафиксируем за нашим сервисом виртуальный порт, который в дальнейшем будем использовать не задумываясь о его настройках.

Редактируем файл /etc/bluetooth/hcid.conf, корректируя данные (ранее мы их получили из вывода команды hcitool scan):

....
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";
}

Перезапускаем службу 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

Запускаем 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

Сочиним скрипт, связывающий нас с удалённым устройством-модемом если этого не было сделано заранее:

# mkdir -p /etc/custom/bluetooth
# 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

Выше в скрипте:

bind - команда указывающая связать порт и устройство,
0 - порядковый номер файла устройства (rfcomm0),
1 - номер Bluetooth-канала.


Заметки и комментарии к публикации:


Оставьте свой комментарий ( выразите мнение относительно публикации, поделитесь дополнительными сведениями или укажите на ошибку )