AC100 Bluetooth Phone

Материал из Toshiba AC100 wiki
Перейти к навигации Перейти к поиску

Предисловие

Эти раскопки больше о том, как работает это все изнутри или как все сделать без иксов. В большинстве дистрибутивов нужно лишь потыкаться в меню :)

Раскопки в интернете

Настоятельно рекомендую прочитать статью "Подключаем Bluetooth телефон к Linux, или Синий зуб на службе cистемного администратора", перед тем, как что-то настраивать. Статья дает хорошее представление о том, что такое bluetooth, какие команды и как можно использовать для настройки и просмотра статусов. Чуть более актуальная (т.к. bluez поменялся, со вермени написания первой статьи) информация по Bluez описана в статье Manually using Bluetooth. Документация bluez находится в дереве исходников в папке doc.

Опционально можно почитать: archlinux: Bluetooth How to setup Bluetooth Bluetooth в Linux Linux и bluetooth телефон Bluetooth, gprs Настройка GPRS соединения может производиться аналогично настройке внутреннего модема, либо, полагаю, с использованием Network Manager'а.

Настройка bluetooth

Основную информацию я почерпнул из двух статей, описанных выше, - "Подключаем Bluetooth телефон к Linux, или Синий зуб на службе cистемного администратора", "using Bluetooth]".

Что нам потребуется bluez (у меня версия 4.91) - предоставляет утилиты hciconfig, sdptool, hcitool, l2ping dbus pthon dbus-python pygobject Пакеты ставить в соответствии со своим дистрибутивом я надеюсь все умеют.

Рассматриваем bluetooth подробнее Раньше bluez состоял из множества демонов, теперь же остался только один - bluetoothd. Если сервис bluetooth не застартован (как стартануть покажу позже), то hciconfig покаже следующую информацию.

% hciconfig -a
hci0:    Type: BR/EDR  Bus: USB
    BD Address: 00:00:00:00:00:00  ACL MTU: 0:0  SCO MTU: 0:0
    DOWN
    RX bytes:0 acl:0 sco:0 events:0 errors:0
    TX bytes:0 acl:0 sco:0 commands:0 errors:0

Сейчас статус DOWN и BD Address (Bluetooth Device Address) нулевой.

Стартуем сервис (конфиги пока не трогаем) и смотрим, что поменялось.

% sudo chmod a+x /etc/rc.d/rc.bluetooth
% sudo /etc/rc.d/rc.bluetooth start
% hciconfig -a
hci0:    Type: BR/EDR  Bus: USB
    BD Address: 6C:62:6D:16:47:52  ACL MTU: 310:10  SCO MTU: 64:8
    UP RUNNING PSCAN
    RX bytes:970 acl:0 sco:0 events:29 errors:0
    TX bytes:606 acl:0 sco:0 commands:29 errors:0
    Features: 0xff 0xff 0x8f 0xfe 0x9b 0xff 0x59 0x83
    Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
    Link policy: RSWITCH HOLD SNIFF PARK
    Link mode: SLAVE ACCEPT
    Name: 'slackware-0'
    Class: 0x480100
    Service Classes: Capturing, Telephony
    Device Class: Computer, Uncategorized
    HCI Version: 2.1 (0x4)  Revision: 0x149c
    LMP Version: 2.1 (0x4)  Subversion: 0x149c
    Manufacturer: Cambridge Silicon Radio (10)

Для поиска устройств можно воспользоваться утилитой hcitool

% hcitool scan
Scanning ...
    00:24:04:2C:C0:5C    Stuw-phone

или же сразу смотреть детальный список доступных сервисов утилитой sdptool (вывод достаточно большой даже для одного устройства).

% sdptool browse
Inquiring ...
Browsing 00:24:04:2C:C0:5C ...
Service Name: Network Access Point Service
Service Description: Personal Ad-hoc Network Service which provides access to a network
Service RecHandle: 0x10000
Service Class ID List:
  "Network Access Point" (0x1116)
Protocol Descriptor List:
  "L2CAP" (0x0100)
    PSM: 15
  "BNEP" (0x000f)
    Version: 0x0100
    SEQ8: dd 6
Language Base Attr List:
  code_ISO639: 0x656e
  encoding:    0x6a
  base_offset: 0x100
Profile Descriptor List:
  "Network Access Point" (0x1116)
    Version: 0x0100
...

Если ей не указать BD Address, то она будет искать все сервисы на всех девайсах. Для поиска сервисов на одном устройстве, нужно указать его.

% sdptool browse 00:24:04:2C:C0:5C
..
Service Name: Dial-up networking
Service RecHandle: 0x10003
Service Class ID List:
  "Dialup Networking" (0x1103)
  "Generic Networking" (0x1201)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 1
Language Base Attr List:
  code_ISO639: 0x656e
  encoding:    0x6a
  base_offset: 0x100
Profile Descriptor List:
  "Dialup Networking" (0x1103)
    Version: 0x0100
...

Сервисов устройство может поддерживать много, но нас пока интересует один - Dial-up networking. Тут важно запомнить/записать значение параметра channel.

Проверить связь с устройством можно командой l2ping

% sudo l2ping 00:24:04:2C:C0:5C
Ping: 00:24:04:2C:C0:5C from 6C:62:6D:16:47:52 (data size 44) ...
0 bytes from 00:24:04:2C:C0:5C id 0 time 7.74ms
0 bytes from 00:24:04:2C:C0:5C id 1 time 24.23ms
0 bytes from 00:24:04:2C:C0:5C id 2 time 23.62ms
0 bytes from 00:24:04:2C:C0:5C id 3 time 30.45ms
0 bytes from 00:24:04:2C:C0:5C id 4 time 22.37ms
5 sent, 5 received, 0% loss

Посмотреть информацию об устройстве поможет hcitool

% sudo hcitool info 00:24:04:2C:C0:5C
Requesting information ...
    BD Address:  00:24:04:2C:C0:5C
    Device Name: Stuw-phone
    LMP Version: 2.0 (0x3) LMP Subversion: 0x2222
    Manufacturer: Broadcom Corporation (15)
    Features: 0xbf 0xee 0x0f 0xce 0x98 0x39 0x00 0x00
        <3-slot packets> <5-slot packets> <encryption> <slot offset>
        <timing accuracy> <role switch> <sniff mode> <RSSI>
        <channel quality> <SCO link> <HV3 packets> <u-law log>
        <A-law log> <CVSD> <paging scheme> <power control>
        <transparent SCO> <EDR ACL 2 Mbps> <EDR ACL 3 Mbps>
        <enhanced iscan> <inquiry with RSSI> <extended SCO>
        <AFH cap. slave> <AFH class. slave> <3-slot EDR ACL>
        <5-slot EDR ACL> <AFH cap. master> <AFH class. master>
        <EDR eSCO 2 Mbps>

Теперь нам нужно (на самом деле я пока не проверял обязательность, но полагаю это позволяет выполнять некоторые команды без доп аргументов. могу и ошибаться :) ) поменять конфиг /etc/bluetooth/rfcomm.conf. У меня получился вот такой конфиг (значение channel мы узнали чуть раньше командой sdptool browse 00:24:04:2C:C0:5C).

#
# RFCOMM configuration file.
#

rfcomm0 {
    # Automatically bind the device at startup
    bind no;

    # Bluetooth address of the device
    device 00:24:04:2C:C0:5C;

    # RFCOMM channel for the connection
    channel    1;

    # Description of the connection
    comment "Nokia 5130 stuw";
}

Также советую поменять значение Name в /etc/bluetooth/main.conf, на что-то более вам понятное (это имя будет отображаться на телефоне, когда тошка будет конектиться к нему).

...
# Default adaper name
# %h - substituted for hostname
# %d - substituted for adapter id
Name = ac100-stuw
...

Пробуем соединиться

% rfcomm connect rfcomm0

Но тут меня ждал облом - код на телефоне я вводил, но соединение обламывалось, т.к. на тошке про код ничего не было известно. Порыскав в инете я нашел информацию о том, что теперь нужно использовать simple-agent (находится в дереве исходников bluez, написан на питоне). Для wget нужно адрес брать в кавычки, иначе будете как я по недосмотру скачивать html с данными о ревизиях или что-то подобное.

% wget "http://git.kernel.org/.....43b7789847d40"
% chmod a+x simple-agent
% sudo ./simple-agent hci0 00:24:04:2c:c0:5c
... тут запросится PIN ...

Я ввел на телефоне тот же самый pin код и разрешил автоподключение. После перезагрузки компа нужно делать bind (если bluetooth на телефоне не был включен и не стояла включенной опция bind в rfcomm.conf). Операция прошла успешно и у меня появился девайс /dev/rfcomm0

% sudo rfcomm bind 0
% rfcomm
rfcomm0: 00:24:04:2C:C0:5C channel 1 clean
% ls -l /dev/rfcomm0
crw-rw---- 1 root dialout 216, 0 Nov 13 16:11 /dev/rfcomm0

При попытке сделать cat из девайса у меня ничего не вывелось, но автоматически установилось соединение с телефоном. При отмене cat по ctrl+c соединение прекратилось. Что и как можно оптимизировать и как настроить GPRS соединение мне еще предстоит выяснить.

Подключаемся к internet Я использовал статью о настройке внутреннего модема с нашей вики для настройки своего соединения. Единственное заменил /dev/ttyACM0 на /dev/rfcomm0 и mts на beeline :) Для подключения я использовал команду pppd call beeline, т.к. pon команды в моем дистре нет, и я не стал искать, в каком пакете она идет.

Возможные проблемы Возможно у Вас этой проблемы не возникнет, но у меня не резолвились адреса - не работал DNS. Т.е. ping ya.ru возвращает ошибку - unknown host, а ping 8.8.8.8 проходит на ура. Решил я это следующим образом (возможно это не правильный способ, но самый быстрый :) ):

sudo mv /etc/resolve.conf /etc/resolve.conf.bak
sudo ln -s /etc/ppp/resolve.conf /etc/resolve.conf