8/08/2009

BT porting 總整理

星期四終於完成最後的步驟:成功的可以用藍牙耳機聽音樂 用手機藍牙傳輸檔案...

為了怕日後忘記,先在這做個統一整理

別浪費颱風假...嗄嗄嗄....

藍牙移稙

藍牙術語表

在實作過程中,參考了這篇文章.

---------------------------------------------------

使用TI的platform,搭配自家開發的無線模組來測試BT是否能正常運作.

利用TI所提供的kernel(2.6.14) toolchain(arm-none-gunereal-linux) bluez(藍牙協議棧)等等來架構應用環境完成BT功能.

首先利用TI提供的toolchain,先對bluez做交叉編譯之後放進BSP裡.

而bluez所提供的庫,工具名稱版本,相關依賴的軟體套件分別為 :

bluez-lib-3.36 //bluez的library
bluez-util-3.36 //bluez的工具
dbus-1.2.1 //用於進程間的通信或進程與內核的通信 DBUS簡介及實例
expat-2.0.1 //一個解析XML的工具(不瞭解為啥要這個...只知道DBUS會用到)
openobex-1.3 //OBEX profile,定義了FTP等等傳輸檔案協定
obexftp-0.22 //OBEX profile的FTP工具
alsa-lib-1.2 //A2DP profile要用到alsa的library

還有TI自行定義的HCILL,所要對kernel及blue-util的patch,編譯過程的錯誤之前的文章己寫過.

由於是利用UART做為interface,所以在對kernel做configure設置時,除了USB外,通通butil-in或做成modules.


這些設置好了之後,進入kernel -> filesystem,把相關bluetooth模組一一載入:

#insmod bluetooth.ko
#insmod hci_uart.ko
#insmod l2cap.ko
#insmod rfcomm.ko
#insmod sco.ko
#insmod hidp.ko

接著調用bluez工具,首先會使用到"hciattach"這個tool,它可以初始化藍牙設備,並且通知核心為該裝置載入藍牙驅動,它的格式如下:

hciattach [-n] [-p] [-b] [-t timeout] [-s initial_speed] [speed] [flow|noflow] [bdaddr]

其中type指的是藍牙裝置類型,ID是指藍牙裝直的名稱,speed即是該裝置的baudrate,所以我要利用TI的UART去鏈結藍牙裝置類型:

#hciattach /dev/ttyS1 texas 115200

由於TI會額外做初始化相關動作,所以baudrate的設置要注意是否準確.

鏈結好了之後,緊接著就可以把藍牙裝置喚醒:

#hciconfig hci0 up

然後查閱藍牙的BDADDR及設備資訊:

#hciconfig -a

若查閱到了,就表示己經完成移稙bluetooth的最重要一步,為了進一步使用它的功能,啟動dbus的服務及hcid的服務:

#dbus-daemon --system
#hcid

都準備好了之後,為了要正常使用一個藍牙設備,必須先對該設備做配對操作,由於3.x版的bluez是利用D-BUS這個API來實現配對機制,所以需要向D-BUS註冊一個agent:

#passkey-agent --default 0000 [bdaddr] &

藍牙設置在做連接時,需要一組配對key,而其中"0000"是PIN Code,那"&"是把這指令丟到背景程式讓它持續執行,後面若不打[bdaddr],表示你所有要連接的藍牙裝置的PIN Code都是這個.

你可以輸入ps來查看所有的process有哪些,其中可以清楚看到dbus的daemon及hcid daemon passkey-agent都在後台執行著.

配對好了之後,就可以開始傳輸檔案了,在此之前,要先查看手機的OBEX serivce是位於哪個channel:

#sdptool browse [bdaddr]

SDP是service discover procotl,它會尋找該裝置所有支持procotol,因為要用OBEX serivce,所以請找OBEX serivce的字樣,如下:

Browsing 00:08:C6:77:A0:6C ...
Service Name: OBEX service route
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

因為我沒有截圖...所以我是用網路上的資訊copy過來,只要注意紅色部份就可以對OBEX profile下達command:

#obexftp -b [BDADDR] -p [file] -B [channel]

file就是你要傳輸的檔案,channel就是上面那個紅色數字,輸入完之後,若成功的話你手機會馬上顯示"是否要接收[ID]的傳案",並要你輸入配對的key,輸入好了之後,另一方會把這password拿來做比對,確認相同就可以達成通訊協議開始傳輸檔案了.

為了要使用藍牙耳機(headset),要利用dbus直接發送命令來建立device及bond藍牙裝置,相關操作請參閱:

Howto Audio DBUS

接著是一系列用dbus命令來bond藍牙裝置:

start audio service or discover the audio service bus "id" :
#dbus-send --system --type=method_call --print-reply --dest=org.bluez /org/bluez org.bluez.Manager.ActivateService string:audio


create headset:
#dbus-send --system --type=method_call --print-reply --dest=org.bluez /org/bluez/audio org.bluez.audio.Manager.CreateHeadset string:[BDADDR]

bond bt device:
#dbus-send --system --type=method_call --print-reply --dest=org.bluez /org/bluez/hci0 org.bluez.Adapter.CreateBonding string:[BDADDR]


然後用"aplay"來測試wav檔的音樂(想聽mp3 format,請編譯"mpg123"工具)

#aply -D bluetooth test.wav

輸入完之後,就可以聆聽令人震奮的音樂呀呀呀呀!!!!!!

目前聽音樂的聲音會斷斷續續的...主是要現在的baudrate不足於支撐A2DP profile的傳輸...據說至少要920k bps以上才不會讓封包有延遲現像.


No comments:

Post a Comment