打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
BT porting 總整理
userphoto

2013.07.29

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

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

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

藍牙移稙 

藍牙術語表 

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

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

使用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以上才不會讓封包有延遲現像. 
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
一种基于ARM的图像采集与蓝牙传输系统设计
Android Framework architecture -- bluez(1)
Linux Bluetooth 檔案傳輸
【转】ARM平台上蓝牙协议栈Bluez的移植使用和配置
防火墙 iptables firewalld CentOS 7:/etc/init.d/iptables: No such file or directory
D-BUS API查找与调用
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服