分享

蓝牙协议栈BlueZ的移植与开发

 joy_chen 2013-07-27

摘要:蓝牙技术是当前国内外科技界和产业界研究开发的热点技术,其应用范围包括手机、PDA、信息家电设备等领域,蓝牙技术在嵌入式系统上必将得到广泛的应用。而要在嵌入式系统上提供蓝牙开发支持,蓝牙协议栈的移植是关键。本文分析了蓝牙协议栈BlueZ体系结构,详细介绍了在S3C2410开发板上移植BlueZ的步骤,建立了嵌入式蓝牙应用开发平台,并提出了用BlueZ开发蓝牙应用程序的思路。

关键字:蓝牙技术;蓝牙协议栈BlueZ;移植;S3C2410;Linux 中图分类号:TP368.1 文献标识码:A

BlueZ Porting and Programming

Ou Yangxin,Yu Hongyan,Lv Yang

(College of Information Engineering and Automation,Kunming University of Science

and Technology,Kunming 650051,China)

Abstract: Bluetooth technology is the focused on by the domestic and overseas research institutes. This technology is widely used in mobile phone, PDA, and Information Appliance devices. In the future,bluetooth technology will be widely used in embedded system. Built some bluetooth applications on embedded system,the key technology is porting bluetooth protocol suites to platform. In this paper,we study the BlueZ architecture,describe the steps of Porting BlueZ to S3C2410 Platform in detail,and build the embedded bluetooth application programming platform. In the end, we also give the idea of bluetooth programming.

Keywords: bluetooth technology,bluetooth protocol suites BlueZ,porting, S3C2410, Linux

1引言

蓝牙技术是一项低价格、低功耗的射频技术,它能使蓝牙设备实现近距离无线通信。由于蓝牙技术有广泛的应用前景,它已成为当前国内外科技界和产业界研究开发的热点技术。Linux操作系统的开放的蓝牙协议栈主要包括IBM公司的BlueDrekar,Nokia公司的Affix, Axis公司的OpenBT和官方协议栈BlueZ[1]。BlueZ是公布在Internet上的免费蓝牙协议栈,由于它结构简单,应用方便,具有灵活、高效和模块化的特点且具有较强的兼容性,因此BlueZ已经成为Linux操作系统下的官方的蓝牙协议栈。

S3C2410x是三星公司推出的一款高性价比32位的RISC处理器,内含一个由ARM公司设计的ARM920T核,具有低功耗高性能的特点,适用于对价格及功耗敏感的场合。本文使用的S3C2410开发板主要包含以下部件:S3C2410x芯片,32MB Nor Flash,64MB SDRAM,IIC存储器接口,LCD控制器,UART接口,一个USB(Host)接口。

利用S3C2410开发板上的USB接口,可以外扩蓝牙适配器,但S3C2410开发板上没有实现蓝牙设备驱动。本文对蓝牙协议栈BlueZ进行分析,移植BlueZ到开发板上实现蓝牙设备驱动,提出了使用BlueZ开发蓝牙应用程序的基本思路。 *

基金项目:云南省自然科学基金项目(2004F0024M)。

2 BlueZ的体系结构

使用不同蓝牙协议栈的设备在通信时会遇到互操作性的问题。开发者需要了解各种协议栈的体系结构并考虑其差异。通过分析源码,给出了如图1所示的BlueZ的体系结构[2]。

图1 BlueZ蓝牙协议栈。

蓝牙协议栈BlueZ分为两个部分:内核代码和用户态程序及工具集。其中内核代码由BlueZ核心协议和驱动程序等模块组成;用户态程序及工具集包括应用程序接口和BlueZ工具集。

在内核代码中,BlueZ协议的bluez-kernel和bluez-libs软件包实现了主机控制接口(HCI)和套接字接口的全部功能。内核源代码采用模块化设计,由设备驱动程序模块和蓝牙核心协议模块组成,分别位于Linux内核代码的drivers子目录和net子目录下。drivers子目录下的代码包括Linux内核对各种接口的蓝牙设备的驱动。net子目录下代码包括蓝牙核心协议和一部分扩展协议的内核代码,如L2CAP、RFCOMM、SCO、SDP、BNEP等协议。。

对于用户态程序,BlueZ提供函数库及应用程序接口,便于程序员开发蓝牙应用程序。BlueZ utils是蓝牙设备配置和应用的主工具集,实现对蓝牙设备的初始化和控制。

3 BlueZ在S3C2410开发板上的移植

蓝牙模块除了需要Linux内核的支持外,还需要相关工具集来帮助管理蓝牙设备。本文涉及的S3C2410开发板[3]操作系统内核版本是Linux 2.4.18,为了在开发板上实现对蓝牙设备的驱动,必须在PC机上交叉编译Linux 2.4.18内核,移植BlueZ协议栈,然后烧写到开发板上。

3.1创建交叉编译环境

为进行Linux操作系统下的嵌入式开发,完成编译内核、驱动程序和应用程序等工作,首先要做的工作就是建立交叉编译环境,在Linux上可以使用GNU提供的arm工具链。创建交叉编译环境和编译Linux内核不是本文研究的重点,这方面具体可以参考相应的文献。

3.2 配置、编译开发板上Linux内核

创建了交叉编译环境,其后配置内核使之支持蓝牙协议栈BlueZ和蓝牙设备。配置、编译Linux内核的具体步骤:

(1) 下载patch-2.4.18-mh15.gz,为开发板的Linux2.4.18的内核打补丁。通过给Linux内核

打补丁,BlueZ kernel被安装到Linux操作系统上。具体执行命令如下: # gzip -dc ../patch-2.4.18-mh15.gz | patch -p1

(2) 配置Linux内核使支持蓝牙协议栈BlueZ,BlueZ协议配置选项说明如表1。

表1 BlueZ协议配置选项。

(3) 配置Linux内核使支持BlueZ硬件,在BlueZ硬件支持设置选项中,设置关于USB接

口蓝牙设备支持,具体方法:CONFIG_BLUEZ_HCIUSB=y; (4) 用make zImage编译修改后的Linux内核。

3.3 安装BlueZ软件包

BlueZ软件包主要由bluez-kernel,bluez-libs,bluez-utils和bluez-pin等组成。软件包的具体构成和主要程序包的功能见表2。

表2 BlueZ软件包。

由于BlueZ协议栈核心代码已经通过打补丁的形式安装到Linux操作系统上,因此只需安装bluez-libs、bluez-utils和bluez-pin三个程序包。

(1) 下载BlueZ的基础库bluez-libs-2.20.tar.gz 。解压后,源代码在bluz-libs-2.20/src/下,

编译动态库:#/usr/local/arm/2.95.3/bin/arm-linux-gcc -shared -o libbluetooth.so.1.0.17 bluetooth.o hci.o sdp.o,然后建立动态连接,执行以下命令: # ln -s libbluetooth.so.1.0.17 libbluetooth.so # ln -s libbluetooth.so.1.0.17 libbluetooth.so.1

库交叉编译完毕后,BlueZ的基础库被安装到S3C2410/application/bluezport/libs/lib目录下。 (2) 下载、安装Bluez的工具集bluez-utils-2.20.tar.gz。安装成功后,BlueZ的工具集被安装

至S3C2410/applications/ bluezport/utils目录下。 (3) 安装bluez-pin,编写 pin_helper程序;

由于BlueZ协议栈所携带的pin_helper是用python写的代码,在S3C2410开发板上不能使用,所以须重新编写pin_helper的程序,用C语言实现:

#include <stdio.h>

int main(int argc, char* argv[]){ printf("PIN:123"); }

用arm-linux-gcc交叉编译工具,将pin_helper程序编译成my_pin_helper,放至开发板内核的/usr/bin下,然后修改hcid.conf:pin_helper /usr/bin/my_pin_helper

3.4 向S3C2410开发板的移植

(1) 烧写Linux内核到开发板

编译后的Linux内核映像zImage放至在S3C2410/kernel/arch/arm/boot下。用Flash Programmer工具将zImage烧写到Flash的6-17扇区。

(2) 烧写文件系统和BlueZ软件包到开发板

将cramfs文件系统和其目录下的BlueZ库、BlueZ工具集和bluez-pin,使用mkcramfs在Linux下编译生成文件系统映像root.cramfs,烧写到Flash的18-35扇区。

给S3C2410开发板加电,系统自动加载内核和文件系统。出现Linux操作系统shell提示符。然后插上USB接口的蓝牙适配器,手动加载蓝牙协议栈各模块到开发板的Linux内核上,加载模块的命令如下:# modprobe bluez

# modprobe hci_usb # modprobe rfcomm # modprobe l2cap

接着启动hci设备和hci精灵进程,执行命令:# hciconfig hci0 up # hcid -f /etc/bluetooth/hcid.conf

用命令# hciconfig –a查看蓝牙适配器的配置情况。运行结果显示蓝牙适配器工作正常,验证USB蓝牙适配器驱动已经安装成功。

4 用BlueZ开发应用程序

移植蓝牙协议栈BlueZ后,一个嵌入式蓝牙应用开发平台就已经搭建好了。用户可以充分利用协议栈提供的蓝牙函数库,进行蓝牙应用程序的开发。蓝牙系统开发结构如图2所示。

图2 蓝牙系统开发结构。

从图2中可以看出,蓝牙协议栈是蓝牙系统开发结构的核心。在操作系统的用户模式下,蓝牙协议栈主要功能包括:负责和硬件打交道,处理蓝牙的数据包;处理服务浏览程序发来的服务发现和设备管理请求;和虚拟串口ttyBx交互。

在蓝牙协议栈启动的时候,通过读入一个配置文件来判断HCI传输层使用的硬件类型和硬件的配置状况。HCI可以通过USB传输层来实现,USB传输层模块以动态链接库(.so)方式体现。

在Linux操作系统下,蓝牙系统向用户提供若干个虚拟串口ttyBx,ttyBx和实际串口的操作是一样的。可以通过对虚拟串口的读写来与其它蓝牙设备进行数据通信。

开发板上应用程序是用户进行访问服务或是提供服务的程序[4],如局域网访问服务,或以服务器运行等。对于局域网访问的应用,可使用开发板上的ftp等;开发板作为服务器,可以用

[5]

开发板上的httpd提供web服务,也可使用自行编写的TCP的Server端程序。

5 结束语

本文在对蓝牙协议栈BlueZ分析的基础上,将BlueZ成功移植到S3C2410开发板上,建立了嵌入式蓝牙应用开发平台,并提出了用BlueZ开发蓝牙应用程序的基本思路。BlueZ的移植在蓝牙系统开发中具有重要的作用。文中介绍的方法已成功应用于嵌入式信息家电蓝牙网关系统中。实践证明,以上方法切实可行,具有实际意义。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多