当前位置:文档之家› Linux蓝牙协议栈OpenBT及其应用程序开发

Linux蓝牙协议栈OpenBT及其应用程序开发

2003.10 电子设计应用 

www.eaw.com.cn引言

Linux蓝牙协议栈主要有三个:OpenBT、BlueDrekar、BlueZ,其中OpenBT被认为在性价比上超过BlueDrekar和BlueZ,可运行于X86、ARM、MIPS、PowerPC等硬件平台,与任何2.x版本的Linux内核兼容,支持JAVA。本文介绍了OpenBT的

体系结构及其对互操作性的影响,并以客户机/服务器(C/S)实例说明如何在OpenBT上开发蓝牙应用程序。

OpenBT的体系结构

使用不同蓝牙协议栈的设备在通信时往往会遇到互操作性问题。开发者需要了解各种协议栈的体系

结构并考虑其差异。通过分析源

码,本文给出了如图1所示的OpenBT的体系结构。OpenBT包括HCI、L2CAP、SDP、SP、Networking、OpenBT Utility、后台

程序、内核接口8个模块,分别解释如下:

* HCI模块由Driver、Transport子模块构成。Driver负责HCI命令、HCI事件和HCI数据接口;Transport提供USB、RS-232、UART的驱动。

* L2CAP模块由State Handle、Security子模块构成。State Handle负责运行L2CAP的状态机和数据的分段组装;Security负责L2CAP级别安全管理。

* SP模块由RFCOMM、串口仿真子模块组成。RFCOMM负责完成蓝牙RFCOMM协议中所描述的内容,核心是一个RFCOMM状态机;串口仿真负责提供接口。

* SDP模块负责完成蓝牙SDP协议中所描述的内容,在功能上分为XML文件管理、SDP查询处理和SDP响应处理三部分。

* Networking模块由PPP、Modem Emulation、TCS子模块构

Linux蓝牙协议栈OpenBT

及其应用程序开发

■ 西安交通大学电信学院 马毅华 冯恩信

摘 要:本文分析了OpenBT软件体系结构,根据客户机/服务器模型的实例,介绍了OpenBT应用程

序的开发,并提出了一种实用的开发模式。

关键词:蓝牙技术;Linux;OpenBT

www.eaw.com.cn 电子设计应用 2003.10

53

成。PPP利用Linux提供的功能来完成PPP驱动;Modem Emulation负责接口;TCS负责完成蓝牙TCS协议中所描述的内容。

* 后台程序作为协议栈的控制机构,集中对协议栈进行控制。

* OpenBT Utility负责各层的内存管理、L2CAP和RFCOMM层次的安全管理和SDP数据库的管理。

内核接口模块对应于

bluetooth.c文件中的内核集成代码。

开发OpenBT蓝牙应用程序

OpenBT本质上是一个LinuxTTY驱动程序。使用OpenBT,首先需要在运行Linux 2.x内核的机器上安装OpenBT。按照下列步骤安装:

* 将下载的openbt_20011021.tar.gz解压缩。

tar xvfz openbt_20011021.tar.gz* 进入openbt目录,初始化设备文件。

cd openbt. init_env

* 通过su命令切换到根用户,安装程序并建立蓝牙设备节点。

make installmake devs

* 把蓝牙内核驱动程序加载到linux内核。

insmod src/bt.o

这时通过cat /proc/devices将看到名字为bt的字符驱动条目及其主设备号和次设备号,通过cat /proc/tty/drivers和cat /proc/tty/ldisc可以看到OpenBT在内核中注册的TTY驱动和链路规程。/dev目录下的ttyBTC控制设备文件用于控制本地蓝牙设备驱动程序的初始化、连接和关闭。同一目录下的ttyBT0到

ttyBT6等7个数据设备文件就是RFCOMM TTY的实例,可以象操纵串口一样打开并进行连接。RFCOMM TTY的从设备号就是HCI链路号,对应的蓝牙主机可以连接的7个从机。

安装完成后,在OpenBT上建立应用有两种方法。

第一种方法是直接使用在apps/bluetooth目录下附带的btd、bluetoothPN、sdp_Server这三个应用程序。第二种方法需要自己编写

代码。从实现蓝牙功能的角度而言,编写OpenBT应用程序可以遵循以下的模式:

* 环境相关部分,对硬件和操作系统进行设置和初始化。

* 协议相关部分,实现蓝牙协议所描述的一系列功能。

* 应用相关部分,决定如何使用协议相关部分所提供的功能。

本文通过一个C/S应用实例说明如何编写这三部分内容,所用的配置如下:OpenBT0.0.8版本,RedHat 9(2.4.20内核),EricssonROK101007(UART连接)。

环境相关部分

需要完成以下三项任务。

* 配置串口驱动int fd;

struct termios t;

fd=open(“/dev/ttys0”,O_RDWR,0); //打开串行口

ioctl(fd,TCGETS,&t);

cfmakeraw(&t); //raw模式设置t.c_cflag &=  ̄CBAUD;//根据ROK101007模块要求设置t.c_cflag |= B57600|CS8t.c_cflag |= CLOCAL;t.c_oflag = t.c_lflag =0;t.c_cflag &=  ̄CRTSCTS;ioctl(fd,TCSETS,&t);* 配置蓝牙驱动

图2(a)显示了用户装载了bt.o后的TTY驱动程序配置。应用程序需要通过ioctl调用把串行驱动程序的链路规程配置成bt_ldisc。通过以下ioctl调用后,TTY驱动程序配置将如图2(b)所示。

int bt_ldisc=N_BT;

//N_BT常量在btcommon.h中定义ioctl(fd,TIOCSETD,& bt_ldisc);//连接串口驱动和蓝牙链路规程* 初始化OpenBT

bt_cfd=open(“/dev/ttyBTC”,O_RDWR,0); //控制蓝牙设备

图2(b) ioctl调用后的TTY

驱动程序配置

图2(a) 装载bt.o后的TTY

驱动程序配置

相关主题