Bluetooth на iPAQ H5550

автор: Урманов Марат




В этой статье я рассмотрю работу bluetooth’а на моем H5550 и подключение к инету через телефон Sony Ericsson T630 (оператор beeline). Начну с того что во первых используется стек BlueZ, а во вторых в ядре дистрибутива familiar есть проблема с драйвером, поэтому придется собирать ядро. Проблема состоит из двух частей. Первая это то, что bluetooth драйвер (natsemi lmx9814) иногда портит данные. Эта проблема пропатчена в ядре hh40 и выше. Поэтому на ней мы останавливаться не будем. Вторая проблема заключается в том что bluetooth uart (btuart) процессора pxa-25x использует software flow control, т.е. использует процессор при обработке последовательных соединений, скорость которых достигает 921kbps. Это приводит к большому числу прерываний процессора. Если при этом еще какое-либо устройство (обычно устройства wlan) вызывает прерывание, то процессор просто ‘засорится’. C точки зрения пользователя это выглядит так, что вы не сможете использовать одновременно bluetooth и к примеру WiFi. Конечно если вы хотите одновременно использовать только bluetooth то он должен работать замечательно. Решение же проблемы предложил Catalin Drula сделавший патч который использует hardware uart (huart) вместо btuart. Итак, качаем патч в директорию с исходниками ядра, патчим (patch –p1 < patch_hwuart), компилим и устанавливаем как обычно не забыв включить опцию CONFIG_PXA_HWUART=y (добавив ручками в .config или при make oldconfig) Для более подробной информации см. раздел Компилирование ядра linux для iPAQ. После успешной установки пропатченного ядра приступаем собственно к настройке соединения. Запускаем службы (если еще не запущены), привязываем последовательный порт к стеку BlueZ через UART HCI, и поднимаем локальный интерфейс:

root@h5550:~# /etc/init.d/bluethooth start
root@h5550:~# hciattach /dev/tts/1 any 921600 noflow (eсли используете непропатченное ядро то команда будет hciattach /dev/tts/1 any 921600)
root@h5550:~# hciconfig hci0 up

Проверяем:

root@h5550:~# hciconfig -a
hci0: Type: UART
BD Address: 08:00:17:1F:B7:BD ACL MTU: 339:4 SCO MTU: 60:9
UP RUNNING PSCAN ISCAN
RX bytes:133 acl:0 sco:0 events:16 errors:0 TX bytes:589 acl:0 sco:0 commands:16 errors:0
Features: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
Packet type: DM1 DH1 HV1
Link policy: RSWITCH HOLD SNIFF PARK
Link mode: SLAVE ACCEPT
Name: 'No name'
Class: 0x120112
Service Classes: Networking
Device Class: Computer, Handheld
HCI Ver: 1.1 (0x1) HCI Rev: 0x180 LMP Ver: 1.1 (0x1) LMP Subver: 0x180
Manufacturer: RTX Telecom A/S (21)

Как видим с локальным интерфейсом у нас все в порядке. Включаем bluetooth в телефоне и сканируем:

root@h5550:/etc/bluetooth# hcitool scan
Scanning ...
00:0F:DE:FD:07:26 T630

Ну чтоже телефон определился. Чтобы удачно установить связь через bluetooth, устройства должны знать пин коды друг друга. Пин код наладонника указываем в /etc/bluetooth/pin (например цифры 123) На наладоннике, программа стека Bluez /usr/bin/bluepin, прописанная в конфигурационном файле /etc/bluetooth/hcid.conf , должна спрашивать пин телефона у пользователя интерактивно... но у меня это не работает. Поэтому лично я обойдусь без интерактивности. Демон hcid ожидает от этой программы ответ в формате PIN:pin, где pin – пин телефона. В моем случае Поэтому я делаю так:

root@h5550:/usr/bin# mv bluepin bluepin.old (если bluepin вообще есть)
root@h5550:/usr/bin# vi bluepin

(содержимое файла bluepin)
#!/bin/sh
echo PIN:T630

root@h5550:/usr/bin# chmod a+x /usr/bin/bluepin

После этого нужно перестартовать bluetooth. Думаю не надо напоминать что на телефоне нужно сменить пин код используемый по умолчанию. Проверяем соеднинение на канальном уровне:

root@h5550:/etc/bluetooth# l2ping 00:0F:DE:FD:07:26
Ping: 00:0F:DE:FD:07:26 from 08:00:17:1F:B7:BD (data size 44) ...
0 bytes from 00:0F:DE:FD:07:26 id 0 time 20.67ms
0 bytes from 00:0F:DE:FD:07:26 id 1 time 22.64ms
0 bytes from 00:0F:DE:FD:07:26 id 2 time 41.42ms
3 sent, 3 received, 0% loss

А теперь просканируем на предмет предоставляемых сервисов:

root@h5550:/etc/bluetooth# sdptool browse 00:0F:DE:FD:07:26
Inquiring ...
Browsing 00:0F:DE:FD:07:26 ...
Service Name: Dial-up Networking
Service RecHandle: 0x10000
Service Class ID List:
"Dialup Networking" (0x1103)
"Generic Networking" (0x1201)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel: 1
Profile Descriptor List:
"Dialup Networking" (0x1103)
Version: 0x0100

Service Name: Voice gateway
Service RecHandle: 0x10002
Service Class ID List:
"Headset Audio Gateway" (0x1112)
"Generic Audio" (0x1203)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel: 3
Profile Descriptor List:
"Headset" (0x1108)
Version: 0x0100

Service Name: Serial Port 1
Service RecHandle: 0x10003
Service Class ID List:
"Serial Port" (0x1101)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel: 4

Service Name: Serial Port 2
Service RecHandle: 0x10004
Service Class ID List:
"Serial Port" (0x1101)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel: 5

Service Name: OBEX Object Push
Service RecHandle: 0x10005
Service Class ID List:
"OBEX Object Push" (0x1105)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel: 10
"OBEX" (0x0008)
Profile Descriptor List:
"OBEX Object Push" (0x1105)
Version: 0x0100

Service Name: IrMC Synchronization
Service RecHandle: 0x10006
Service Class ID List:
"IrMC Sync" (0x1104)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel: 11
"OBEX" (0x0008)
Profile Descriptor List:
"IrMC Sync" (0x1104)
Version: 0x0100

Service Name: HF Voice gateway
Service RecHandle: 0x10007
Service Class ID List:
"Handfree Audio Gateway" (0x111f)
"Generic Audio" (0x1203)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel: 6
Profile Descriptor List:
"Handsfree" (0x111e)
Version: 0x0100

Service Name: OBEX Basic Imaging
Service RecHandle: 0x1000b
Service Class ID List:
"Imaging Responder" (0x111b)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel: 15
"OBEX" (0x0008)
Profile Descriptor List:
"Imaging" (0x111a)
Version: 0x0100

Service Name: OBEX File Transfer
Service RecHandle: 0x1000f
Service Class ID List:
"OBEX File Transfer" (0x1106)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel: 7
"OBEX" (0x0008)
Profile Descriptor List:
"OBEX File Transfer" (0x1106)
Version: 0x0100


Как видим у нас на телефоне есть порты Serial Port 1, Serial Port 2, DialUp и также мы можем использовать протокол OBEX для передачи файлов и картинок (см. ниже). Теперь создаем локальные устройства /dev/rfcomm (по умолчанию в Familiar их нет):

root@h5550:/etc/bluetooth# mknod /dev/rfcomm0 c 216 0

и привязываем его к bluetooth устройству с адресом 00:0F:DE:FD:07:26 по 4-му каналу.

root@h5550:/etc/bluetooth# rfcomm bind 0 00:0F:DE:FD:07:26 4

Посмотреть привязано ли уже что-нибудь можно командой

root@h5550:/etc/bluetooth# rfcomm show
rfcomm0: 00:0F:DE:FD:07:26 channel 4 clean

И чтобы выполнять привязку автоматически при запуске сервисов bluetooth’а прописываем в /etc/bluetooth/rfcomm.conf следующее:

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

# Bluetooth address of the device
device 00:0F:DE:FD:07:26;

# RFCOMM channel for the connection
channel 4;

# Description of the connection
comment "Connection to phone";
}

Вот собственно связь между наладонником и телефоном через эмуляцию последовательного порта установлена.

Можно проверить соединение исользую любую терминальную программу на кпк, к примеру ставим minicom. В конфиге /etc/minirc.dfl настраиваем на работу с портом ‘pr port /dev/rfcomm0’ и запускаем. Теперь мы можем набрать любую AT команду, например вызвать какой-либо номер:

ATDT+89051234567

Теперь приступаем к настройку ppp соединения через GPRS (при этом у вас уже должен быть подключен пакет трех услуг)

Создаем файл /etc/ppp/peers/gprs следующего содержания:

/dev/rfcomm0 57600
connect '/usr/sbin/chat -v -f /etc/ppp/chat/gprs'
noauth
defaultroute
lock
debug
novjccomp
nopcomp
noaccomp
nodeflate
novj
nobsdcomp
default-asyncmap
ipcp-accept-local
ipcp-accept-remote
usepeerdns
user beeline
nodetach


В файл /etc/ppp/chat/gprs записываем команды /usr/sbin/chat:

TIMEOUT 5
ECHO ON
ABORT '\nBUSY\r'
ABORT '\nERROR\r'
ABORT '\nNO ANSWER\r'
ABORT '\nNO CARRIER\r'
ABORT '\nNO DIALTONE\r'
ABORT '\nRINGING\r\n\r\nRINGING\r'
'' \rAT
TIMEOUT 12
OK ATH
OK ATE1
OK AT+CGDCONT=1,"IP","internet.beeline.ru"
OK ATD*99***1#
CONNECT


И в файл /etc/ppp/pap-secrets добавляем строку:

beeline ppp0 "beeline"


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

root@h5550:~# pppd call gprs

Тут нужно отметить что для окружения Opie на момент написания статьи только Opera поддерживает русские страницы(см "Opie на iPAQ H5550")

Через bluetooth можно не только выходить в инет но и скачивать скажем фотографии с телефона на наладонник. Для этого я использую протокол OBEX и пакет openobexftp с сайта Debian’а. Я не использовал этот пакет из Familiar feed потому что на момент написания статьи родной пакет компилировался без поддержки Bluetotha (без опций –B –b, может щас уже исправлено). Качаем:

libgcc1_3.4.3-13_arm.deb
libopenobex-1.0-0_1.0.0-rel-3_arm.deb
obexftp_0.10.7-3_arm.deb

инставлируем используя ipkg install * и далее делаем что нужно. Например, получить листинг корневой директории:

root@h5550:~# obexftp -b 00:0F:DE:FD:07:26 -B 7 -l /

листинг директории Pictures:

root@h5550:~# obexftp -b 00:0F:DE:FD:07:26 -B 7 -l /Pictures.

перейти в директорию Pictures и считать (get) файл pic.jpg

root@h5550:~# obexftp -b00:0F:DE:FD:07:26 -B 7 -c Pictures -g pic.jpg

загрузить (put) файл в телефон:

root@h5550:~# obexftp -b 00:0F:DE:FD:07:26 -B 7 -c Java -p Board.jar

Ну и так далее. Обратим только внимание, что мы используем устройство с mac адресом 00:0F:DE:FD:07:26 и канал 7 (OBEX File Transfer)


Но и это еще не все. Что делать если мы хотим скажем послать смс-ку с наладонника или сделать бэкап адресной книги телефона. В этом нам поможет программка gammu, которая поддерживает различные телефоны. И не пугайтесь если Вашего телефона нет в списке на сайте gammu (моего тоже нет). Главное чтобы он был AT совместимым. Пишем конфиг /home/root/.gammurc:

[gammu]
port = /dev/rfcomm0
model = at
connection = at115200
#synchronizetime = yes
logfile = gammulog
logformat = textall
#use_locking = yes
#gammuloc = locfile
#startinfo = yes
#gammucoding = utf8

Устанавливаем связь между последовательным устройством и bluetooth-сервисом телефона на канале 4 (последовательный порт 1) Если конечно он еще не привязан (в противном случае будет ошибка что порт уже занят)

root@h5550:~# rfcomm bind 0 00:0F:DE:FD:07:26 4

и например, идентифицировать модель:

root@h5550:~# gammu --identify
Manufacturer : Ericsson
Model : unknown (AAB-1021012-BV)
Firmware : R7A011
IMEI : xxxxxxxxxxxxxxx
SIM IMSI : xxxxxxxxxxxxxxx

Посмотреть дату на телефоне:

root@h5550:~# gammu --getdatetime
Phone time is Thu Sep 8 14:34:22 2005

Получить адресную книгу телефона:

root@h5550:~# gammu --getallmemory ME
…………..
Memory DC, Location 16
General number : "89061234567"
Name : "Chuvak"

…………………
Отправить смс-ку:

root@h5550:~# echo 'test_from_ipaq' | gammu --sendsms TEXT +79032219734

И что самое интересное можно сделать экспорт адресной книги телефона в формат vcard 2.1 (про формат vcard читать здесь http://www.imc.org/pdi/):

root@h5550:~# gammu --backup backup.vcf

Далее можно импортировать этот файл в приложение Contacts окружения Opie и GPE. Можно также экспортировать контакты из Contacts в файл формата vcard и потом используя gammu в телефон. Таким образом у нас получилось синхронизировать адресную книгу телефона с контактами на наладоннике. К сожалению приложение Calendar окружений Opie и GPE пока не поддерживает импорт и экспорт, хотя в планах реализация этой возможности присутствует.


Полезные ссылки:

О протоколе
Bluetooth (немного теории).
Сайт Gammu.
Сайт OpenOBEX.
HpIpaqH5400.
Патч Catalin Drula для Bluethooth.

Copyright (C) 2003-2005 Marat Urmanov <my-ipaq@narod.ru>