四川大学软件学院 侯新琦 李 佳
基于Android蓝牙通讯的研究
四川大学软件学院 侯新琦 李 佳
本文主要就基于Linux系统开发的Android手机操作系统中的蓝牙驱动部分做深入浅出的分析,详细阐述了从Linux内核到Android设备驱动的蓝牙相关知识,为爱好Android系统开发者提供较为详细的参考资料。
Linux内核;Android系统;蓝牙驱动;通讯;设备;网络驱动
在Android手机越来越普及的今天,对于很多用户来说,不仅仅是手机应用的使用,越来越多的手机爱好者走进了应用开发的领域。作为当今网络时代文件传输运用最普遍的蓝牙技术,我们有必要将一些列的蓝牙基于android的蓝牙开发知识做一个详细的概述,笔者将从Linux内核概述入手,再分析蓝牙协议最后通过实例来更为深入地对Android蓝牙开发进行说明。
Android系统是Google历经数年花费众多时间以及金钱开发出来的应用于智能手机上的操作系统,其最大的特点就是系统开放性。任何公司、个人开发者、爱好者都可以参与到系统中。同时,Android不仅是一个智能手机的系统,也可以作为学习嵌入式Linux系统较为完整的软件平台。
要研究Android系统就不能忽略其Linux内核与驱动程序。Android使用标准的Linux2.6内核作为其操作系统,随着Android系统的普及,不同SDK版本中使用的Linux内核版本也不同,不过整体的变化并不大。
蓝牙(Bluetooth)提供了移动设备之间快速,方便的无线通信连接。近几年来已经广发运用于手机、立体声耳机、以及无线打印机等设备中。其开发技术的核心,是根据蓝牙标准所实现的蓝牙协议栈,据悉,从第一个版本开发至今已经有1.1/1.2/2.0/2.1/3.0等版本。Android蓝牙协议与全球蓝牙协议通用,协议栈使用BlueZ,并支持GAP,SDP以及RFCOMM规范,是一个SIG认证的蓝牙协议栈。它的底层协议层包括了众多协议,如逻辑链路控制和适配协议(L2CAP)、服务发现协议(SDP)、串口模拟协议(RFCOMM)等。
在蓝牙栈底层包含了L2CAP,RFCOMM,GAP,SDP等协议,下面就来简单的介绍一下这些协议:
L2CAP:Logical Link Control and Adaptation Protocol
逻辑链路控制与适配协议,L2CAP协议是蓝牙系统中的核心协议,它是基带的高层协议,可以认为它与LMP并行工作。
RFCOMM:Radio Frequency Communication(s)
串行线性仿真协议,是为了兼容传统的串口应用,同时取代有线的通信方式,蓝牙协议栈需要提供与有线串口一致的通信接口而开发出的协议。RFCOMM协议提供对基于L2CAP协议的串口仿真,基于ETSI07.10。可支持在两个BT设备之间同时保持高达60路的通信连接。
RFCOMM模仿RS-232串口,这种仿真协议包含无数据连接状态的传输。它可以支持两个设备之间的多串口仿真传输。
SDP:Service Discovery Protocol
服务发现协议,是一个基于C/S结构的协议,作为蓝牙协议体系中的核心协议,它是蓝牙系统的重要组成部分,是所有用户模式得以实现的基础。在蓝牙系统中,用户需要依靠SDP来获取设备信息,服务信息及服务特征,并在此基础上建立蓝牙连接。
蓝牙协议栈作为基于Android的蓝牙通讯的核心,是整个蓝牙通讯实现的关键,底层使用L2CAP,RFCOMM,SDP等协议支持整个基于Android的蓝牙通讯是目前大多数Android蓝牙通讯采用的方法。
图1
即使蓝牙技术在通讯领域已经有了广泛的运用,但在Android上的运用还并非完美,很多的特性还在开发阶段。
在进行蓝牙开发前,我们必须了解A-ndroid支持的蓝牙系统包括的具体内容:
Linux内核的蓝牙驱动程序:Linux内核的蓝牙协议层;
bluez(蓝牙在用户空间的库);bluez适配层;
Android.bluetooth包中的各个类(蓝牙在框架层的内容);
蓝牙相关的应用程序。
Android的蓝牙部分的结构如下图1。
Android SDK从2.0版本开始支持蓝牙功能,众所周知,Android蓝牙仍旧受10米短距离限制,并且会被周围信号所干扰,但就数据传输已经为用户带来了很多方便。不利的是,开发模拟器并不支持蓝牙,开发调试只能在真机上进行测试,并且至少有两部手机,也制约了很多技术人员的开发。
下面笔者将就在Eclipse3.5,SDK版本2.2上的Android开发进行说明。
首先,要进行蓝牙的开发,必须在AndroidManifest.xml文件中加入如下权限:
首先用getDefaultAdapter方法取得默认的蓝牙适配器,并且创建一个用来存储搜索到的蓝牙设备BluetllthDevice的List。然后在程序开始时注册了搜索已完成(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)和发现设备(BluetoothDevice.ACTION_FOUND)两个接收器BroadcastReceiver。然后通过一个线程来控制蓝牙设备的搜索(starDiscovery),当搜索中有触发上面接收器的事件,就直接传递给接收器进行保存。最后将保存在List中的BluetoothDevice显示在一个ListView中。
接下来就是蓝牙的最主要功能“传送文件”的实现方法,我们将通过实现Socket连接来完成服务器和客户端的建立以及数据的传送。在Android的蓝牙API中可以找到BluetoothServerSocket和BluetoothSocket类,在建立Socket连接时需要用到。首先介绍如何来实现一个蓝牙Socket服务器。
蓝牙的服务器端通过线程来注册一个具有名称和唯一识别的UUID号的BluetoothServerSocket,然后一直监听客户端(BluetoothSocket)的请求,并对这些请求作出相应的处理,代码实现如下:
在实际开发中,需要首先判断本地蓝牙是否处于启动状态,因为在连接时首先要确保本地蓝牙已经启动,然后取得要连接的蓝牙服务器,进而通过Bluetoothdevice的createRfcommSocketT oServiceRecord方法传入唯一的标识UUID创建了一个BluetoothSocket对象,最后通过connet方法与服务器进行了连接。
目前Android系统正以前所未有的速度发展,但蓝牙的开发目前并没有得到太多的关注,本文通过对Android蓝牙开发的介绍为开发爱好者提供参考。本文以Linux2.6的内核介绍开始,说明蓝牙协议栈,以及内核空间库,最后再以详细的开发代码完整了对Android蓝牙开发的全过程。蓝牙技术在很多领域已经成熟,在国内也正在如火如荼地发展,相信在短时间内,蓝牙开发一定会在Android应用开发方面占领一席之地。
[1]杨丰盛.Android应用开发揭秘[M].北京:机械工业出版社,2010.
[2]韩超,梁泉.Android系统原理及开发要点详解[M].北京:电子工业出版社,2010.
[3]靳岩,姚尚郎.Google Android开发入门与实战[M].北京:人民邮电出版社,2009.
侯新琦(1992—),女,四川达州人,现就读于四川大学软件学院,研究方向:软件工程。
李佳(1991—),女,辽宁海城人,现就读于四川大学软件学院,研究方向:软件工程。