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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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
驱动程序配置
2003.10 电子设计应用 
www.eaw.com.cnioctl(bt_cfd,BTINITSTACK);//初始化协议栈协议相关部分
协议相关部分所实现的功能需要根据应用相关部分的要求确定。

服务器的一般功能有:* 注册自己的服务
OpenBT的SDP数据库是一个XML文件集,可以直接编辑位于/etc/sdp.xml的XML文件来注册服务。

* 寻呼扫描和查询扫描int wrsan=(PAGE_SCAN_ENBLE|INQUIRY_SCAN_ENBLE);
ioctl(bt_cfd,HCIWRITESCANENBLE,&wrscan);
//启动寻呼和查询扫描* 响应服务搜索
if (sdp_req.responseLength==0){printf(“没有响应\n”);}
if (sdp_req.responseResponse[0]==0x01){printf(“错误响应\n”);}
if (!sdp_req.responseResponse[8]==0){printf(“没有匹配的服务\n”);}
server_hdl=sdp_req.responseResponse[9]<<24| sdp_req.responseResponse[10]<<16|
sdp_req.responseResponse[11]<<8|sdp_req.responseResponse[12];//获得服务的连接句柄
* 响应服务连接
ioctl(bt_cfd,HCIWRITESCANENBLE,&autoaccept);
char readbuf[MAX_read],writebuf[MAX_write];
//接收缓存和发送缓存while((n=read(data_fd,readbuf,sizeof(readbuf)))>0) //服务器监听
{ ProcessDate(readbuf,&writebuf);
Write(data_fd,writebuf,n); }客户机的一般功能有:* 查询
typedef struct result{inquiry_results hdr;
//inquiry_results结构在btcommon.h中定义
unsigned char buf[6*RESPONSE_NUMBLE];
}my_inq; //构造查询块my_inq inq;inq.hdr.inq_time=1;//查询持续期
inq.hdr.nbr_of_units=RESPONSE_NUMBLE;
ioctl(bt_cfd,HCIINQUIRY,&inq);* 寻呼
bt_connection con;
//bt_connection结构在btcommon.h中定义
memcpy(con.bd,inq.hdr.bd_addr,6);con.id=CREATE_SDP_ID(SDP_LINE,0);sdp_con_id=ioctl(bt_fd,BTCONNECT,&con); //从SDP层接入
* 搜索服务
bt_sdp_request sdp_req;//bt_sdp_request结构在btcommon.h中定义
memcpy(&sdp_req,0,sizeof(sdp_req));sdp_req.conID=CREATE_SDP_ID(0,0);sdp_req.Command=0x02;sdp_req.pduPayload[]={0x35,0x03,0x19,0x18,0x00,0x00,0x01,0x00};
sdp_req.pduLength=8;
//构造PDU查询有特定UUID属性的服务
ioctl(bt_fd,BT_SDP_REQUEST,&sdp_req);
* 连接服务
fd=open(“/dev/ttyBT0”,
O_RDWR,0);
//打开RFCOMM连接实例bt_connect con;
//bt_connection结构在btcommon.h中定义
memcpy(con.bd,inq.hdr.bd_addr,6);con.id=CREATE_RFCOMM_ID(line,server_channel);
//特定服务的channel
sdp_con_id=ioctl(fd,BTCONNECT,&con);
应用相关部分
通常需要对以下问题做出决策:设备采用什么查询策略;主机如何连接从机,从机如何决定是否接受连接;服务要求者如何查询、连接服务,服务提供者如何决定是否提供服务;是否需要在应用中进行主从切换,数据包类型变换;是否需要实现鉴权加密,低功耗模式和QoS;通信采用点对点还是点对多点方式;实现的蓝牙数据流模型是突发的、周期的、还是连续的;应用模型采用C/S,还是其他模型。

结语
本文在研究了OpenBT软件体系结构的基础上,开发了蓝牙家庭网络系统的网关应用程序。

使用开源OpenBT使开发周期大大缩短,且程序运行稳定。


参考文献
1 David Kammer等著,李静等译.蓝牙应用开发指南.北京:科学出版社,2003
2 Alessandro Rubini著,魏永明译.LINUX设备驱动程序.北京:中国电力出版社,2001。

相关文档
最新文档