嵌入式linux蓝牙通讯,ARM平台上蓝牙协议栈Bluez的移植使用和配置(2)

ARM平台上蓝牙协议栈Bluez的移植使用和配置(2)

来源:csdn

作者:刘旭晖

时间:2008-12-10

Tag:点击:

&01fe = 9C40 // 相当于40M的晶振

// PSKEY_UART_BAUD_RATE

&01be = 0EBF // 921600的波特率

// PSKEY_UART_SEQ_WINSIZE

&0407 = 0006

// BDADDR

&0001 = 1122 3344 5566 7788

。。。

这里有个问题,你会发现,通过bccmd -t bcsp psset 命令理论上应该是可以单步设置每一个PSKEY的,但是从我实践看来,单步的操作在两次对bccmd的调用过程中,上一次对PSKEY的修改,都会在下一次调用之前被复位,从代码上看估计和BCSP协议的同步过程有关。

3.2.1 关于PSKEY的获取

如何获得正确的完整的PSKEY参数,大概会有几个途径:

 通过CSR的网站下载boot_strap包,这是CSR自己的BCHS协议栈所使用的初始化代码,在里面找到你所需要的pskey值。

 下载CSR的bluesuite工具,里面包含了一个叫pstool的工具,可以用它来读写CSR的Casira开发板或其它BT设备的PSKEY设置,试验并找出你能用的参数。

 找CSR或模组厂商支持 8 )

不过,基本上来说,如果只是要让芯片通过串口能够和Bluez协议栈正常通讯上,只需要设置PSKEY_ANA_FREQ 和 PSKEY_UART_BAUD_RATE 这两个PSKEY就可以了。

3.3 Daemon进程的启动

早先的版本里,Bluez的Daemon很多,但是最近的版本,很多daemon都转为service的形式来做了,3.22 里面包括了以下这几个Service,其它profile貌似还保留着daemon的形式。

bluetoothd-service-serial

bluetoothd-service-network

bluetoothd-service-audio

bluetoothd-service-input

这几个Service的启动依赖于hcid的启动以及相关的配置文件

主要配置文件位于:/etc/bluetooth/

此外,通常还需要启动SDP来提供服务查询,另外,Bluez本身还依赖于Dbus daemon的运行。

所以,整体上来说,我的手动启动Bluez的全过程如下:(其中内核代码是以模块形式编译的)

insmod bluetooth.ko

insmod hci_uart.ko

insmod l2cap.ko

insmod rfcomm.ko

insmod sco.ko

insmod hidp.ko

/etc/rc2.d/S20dbus start

bccmd -t bcsp -d /dev/ttyS1 psload -r csr.psr

hciattach -s 921600 /dev/ttyS1 bcsp 921600

hciconfig hci0 up

sdpd

hcid –d

4 Paring配对

4.1 Passkey_agent

在正常使用一个蓝牙设备前,通常都需要对该设备进行配对绑定的操作。

Bluez的配对机制貌似也修改了几次,2.x版本中通过pin_helper来处理pin code的应答,3.22版本里使用的配对机制,其API是基于Dbus来实现的,需要向dbus注册一个agent,PC的发行版通常都会有一些基于各种图形库的passkey_agent,对于嵌入式系统,这部分代码可以想象,应该是要按照相应的API自己实现一个,为了测试,我直接使用了bluez-utils/daemon 目录下的passkey-agent

这是一个命令行下的可以使用预先设定的pin code进行配对的程序

为了使用它,我的文件系统里 /etc/Bluetooth/hcid.conf 中 option一节类似如下 :

# HCId options

options {

# Automatically initialize new devices

autoinit yes;

# Security Manager mode

# none - Security manager disabled

# auto - Use local PIN for incoming connections

# user - Always ask user for a PIN

#

security user;

# Pairing mode

pairing multi;

# Do the same as "hciconfig hci0 down" when SetMode("off")

# is called.

offmode devdown;

# Default PIN code for incoming connections

passkey "1234";

}

4.2 关于自动配对和请求的发起

配对的发起,这里主要是从请求的发起者是谁的角度来说。

通常可能不需要关心配对请求是由本地还是由远端发起的,使用passkey_agent都能够正确处理。

不过如果在hcid.conf中将 Security Manager mode 设置为 auto,则Bluez会将passkey后面的字符串作为默认的Pin code,自动答复远端发起的配对请求。这是在没有使用passkey_agent的情况下的一种配对方式。

在这种情况下,Bluez可以处理远端的配对请求,但是对于本地发起的配对请求,将无法正确处理,我没有仔细的分析原因,或许是代码特意设计成这种工作方式。所以在无法明确知道谁将会主动先发起配对请求的情况下,使用Atuo模式,可能就会出现有些时候设备能绑定有些时候不能绑定的现象。

通常如果是由本地设备搜索发现的新设备,配对绑定的操作应该也是由本地发起。

另外可以观察到,对远端一个非PC类的蓝牙设备,如蓝牙耳机,如果上次绑定过,在耳机启动时会主动发起连接请求,如果本地的link key丢失了,也就会再走一次绑定的流程,这种情况下配对请求就是由远端设备发起的。

5 A2DP

A2DP蓝牙立体声应该是蓝牙最常见的Profile之一。

2.x版本的Bluez,对A2DP的支持是通过BTSCO来实现的,3.22的版本通过bluetoothd-service-audio来支持。

对Bluez A2DP profile的支持,还依赖于Alsa或Gstreamer。

5.1 配置

测试A2DP的时候,我使用的是aplay,同时在相关的配置文件里面写死了蓝牙耳机的地址

主要的配置文件包括:

/etc/asound.conf :

pcm.bluetooth{

type bluetooth

device 00:02:5B:00:C1:A0

profile "hifi"

}

/etc/bluetooth/audio.conf :

[General]

# disable=Sink

SCORouting=PCM

[Headset]

DisableHFP=true

[A2DP]

SourceCount=2

配置好这些以后,使用 aplay -D bluetooth sample.wav 进行测试。

值得注意的是,使用Aplay打开蓝牙设备进行播放,需要有如下两个Alsa的plugin:

/usr/lib/alsa-lib/libasound_module_pcm_bluetooth.so

/usr/lib/alsa-lib/libasound_module_ctl_bluetooth.so

[收藏]

[推荐]

[评论]

[打印]

[关闭]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值