2024年4月15日发(作者:)
第1 1卷第7期 软什导刊
Software Guide
Vo1.I1 NO 7
Ju1.2012
201 2q 7月
And ro i d平台中蓝牙设备的应用
邹川阳
(四川省托普技术职业学院,四川成都6i0000)
摘 要:Android是Google宣布的基于Linux平台开源的手机操作系统。蓝牙技术作为移动通信手段也被应用到
Android平台上。介绍了蓝牙相关知识,BlueZ开源协议栈体系,并说明BlueZ如何通过D-Bus消息机制与Android
应用程序联系起来,及Android平台上蓝牙的实现。
关键词:Android;Bluetooth;Bluez
中图分类号:TP399 文献标识码:A 文章编号:1672—7800(2O12)007—0l32一O2
使用蓝牙进行通信主要有4个步骤:设置蓝牙、搜索
1 D-Bus的消息传递机制
D-Bus是用于进程间通信或者进程与内核的通信。
有些时候D-Bus是一对一的通信协议,但在很多情况下,
通信一方是消息总线,同时与多个应用通信。协议的设计
短小并且高效,低成本地传送消息。协议是二进制的,不
需要进行序列化的过程产生开销。字节次序在每个消息
中声明,当一个D-Bus消息通过网络传输到远程主机时,
它仍可以被正确识别。
蓝牙服务、连接设备、传输数据。由于以下类提供服务:
BlueTooth Adapter是蓝牙的适配器,它是所有蓝牙操作
的入口点,可以用来搜索蓝牙设备、查询已配对的设备、用
已知的MAC地址来实例化一个蓝牙设备(BlueTooth De—
vice),建立一个蓝牙设备。用它来向服务器建立连接请求
(通过BlueTooth Socket),或者用来查询设备的名称、地
址、配对状态等。
Bluetooth Servers类用来开启Server Socket来监听
连接请求,为了连接两台蓝牙设备,其中一台设备必须用
这个类来创建Server Socket,当远端设备向这个设备发出
连接请求,BlueTooth Server Socket接收请求后会返回一
个已连接的BlueTooth Socket。BlueTooth Socket表示蓝
D-Bus由几个总线构成,它在引导时就会启动,这个
总线由操作系统和后台进程使用,具有可靠的安全性。同
时有一部分回话总线(Session Buses),这些总线属于用户
私有。D-Bus每条消息都有且仅有一个源和一个目的地,
牙套接字,它是应用程序与其他蓝牙设备通过输入输出流
交换数据的连接点。如果需要在Android应用程序中使
用蓝牙特征,首先必须声明两个蓝牙权限:
<uses—permission android:name一”android.permis
这些地址被指定为对象路径,使用D-Bus的应用程序都包
括一组对象,消息发送或者发送到特定对象。
在D—Bus中有4种类型的消息:Method Calls、Meth—
od Return、Signals、Errors。要执行D—Bus对象的方法,您
需要向对象发送一个方法来调用消息,它将处理一些工作
并返回消息或者错误信息。信号的不同之处在于,它既没
有消息返回,也没有任何类型的错误消息返回。
sion.BI UET()OTH”/>
<uses—permission android:name
一
”
android.permission.BI UET()OTH ADMIN”/>
1.2蓝牙通讯系统设计
消息可以有任意参数,参数类型有布尔型、字节、整
型、字符串、数组等。
蓝牙通讯类似于TCP方式,都需要服务器端和客户
端,在本系统中一部Android手机作为蓝牙服务器端,另
外几部Android手机作为蓝牙客户端,客户端分别连接到
服务器,并给服务器发送并接收文本消息,服务器也能给
客户端发送并接收消息。本系统用到的Android系统组
件为Activity和Service。在Android中,每个Activity都
是一个独立的进程,每个Service也是一个独立的进程。
服务是D—Bus的高层次抽象,应用程序可以通过一个
总线来注册一个服务,如果成功,应用程序就获得那个服
务,其它程序可以检查总线上是否已经存在一个特定的服
务,如果没有,可以要求总线启动它。
1.1 Android上的蓝牙模块
Android平台支持BlueZ蓝牙协议栈,允许一台设备
与另外的蓝牙设备交换数据,Android提供了API来支持
蓝牙方面的应用开发。
Activity需要与Service通信,就是跨进程的通信,需要使
用Binder机制,Android对Binder机制进行了抽象,并定
义了IBinder接口。在上层是由AIDL(Android Interface
作者简介:邹川阳(1976一),男,四川成都人,硕士,四川省托普技术职业学院讲师,研究方向为移动互联网。
第7期 邹川阳:Android平台中蓝牙设备的应用 ・133・
Definition I anguage)来完成的。
本文在蓝牙通信服务器端和客户端使用了MVC分层
模式结构,将其分为表示层、控制层、业务和数据交换层。
表示层向用户展示模型的状态,本系统中主要用来输
入显示文本,打开蓝牙,以及开启蓝牙被查找功能和搜索
蓝牙设备等。
控制层负责表示层和业务层的流程控制,一方面将表
示层的调用发到业务层去请求处理;另一方面将业务层的
处理结果反应到表示层进行界面上的显示。
业务和数据交互层,封装了蓝牙传输的核心操作,比
如说如何创建Socket通道、传输数据、处理输入输出流等
等。它可以通过控制层被调用,也可以在收到连接请求或
者文本消息时把结果返回给控制层,进而返回到表示层。
1.3蓝牙设备的发现与匹配
蓝牙设备匹配主要流程为,开启蓝牙控制器——搜索
周边蓝牙设备——搜索列表中选择需要的设备进行匹
配——密钥匹配——匹配成功建立ACI 连接;配对模式
允许两个设备之间建立一条共享的链路钥匙,蓝牙设备会
存储这个链路密码,并在下一次连接的时候用到它。也就
是说两端通信的时候会鉴别是否已经配对,而不需要再次
配对。在Android系统中,蓝牙设备匹配,会在BlueTooth
Device模块中记录耳机状态,并通过SDP服务查询设备
所能提供的服务,并记录下来。当蓝牙设备被注册后,如
果手机应用程序需要建立SCO链路时,即可通过Blue—
Tooth Device模块中的记录得到正确的状态。BlueTooth
Device随蓝牙控制器启动而创建,创建之后会开启Blue—
Tooth Event Loop线程来监听D-Bus上有关耳机端发送
过来的事件。BlueTooth Device主要有两个方面的作用,
一
是监听远端蓝牙设备的消息,另一个作用是通过远程过
程调用HCID中函数。
1.4服务器端的实现
Server端中,有两个listView用来显示从不同客户端
接收到的文本消息,两个输入框,用来输入文本消息发给
客户端。
启动程序以后,可以设置本蓝牙设备“允许被发现”,
该选项表示在其他蓝牙设备处于搜索状态下,能获得服务
器端的存在,及其相关信息。为了隐私保护及安全,蓝牙
设备默认是处于关闭状态,在用户同意的情况下,设置为
“允许被发现”。
服务器进行一系列初始化操作,包括构造On Mes—
sage Received I istener用以监听消息到来事件,启动Con—
nection Service,由它来处理发送和接收文本消息。
在Connection Service里,创建Connection Waiter线
程,在Connection Waiter线程里创建BlueTooth Server
Socket监听连接请求。
在有连接请求的时候,Connection Service里面Con—
nection Waiter线程接收请求,创建Bluetooth Socket,并把
远端请求的地址和这个BlueTooth Socket放到Has Map
里,用来管理Socket,接着启动BtStream Watcher线程,用
来监听这个Socket里的输入输出流,把此线程也放到另
外一个Hash Map里,接着创建新的Connection Waiter线
程,继续监听新的连接请求。这样,创建多个通信线程,放
到Hash Map里面进行管理,以完成蓝牙的一对多通信。
BtStream Watcher用来处理输入输出流,在BT Serv—
er界面上输入的时候,根据目的地址不同,从Hash Map
里取出对应的Socket,由它来向此地址发送消息,接收到
文本消息时,就回调On Message Receivd Listerner来通
知上层,并显示出来。
1.5客户端
在客户端(BT Client)界面上,有一个I ist View和一
个输入框,分别用来显示接收到的服务器端发送的消息和
输入文本消息向服务器端发送,这是程序界面的构成。
启动程序后,客户端的一系列初始化操作包括:构造
On Message Received Listener、On Connection Service
Ready I istener,启动Connection Service。
然后回调On Connection Service Ready Listener,启动
Server List Activity界面,搜索到的蓝牙设备,点击服务
器端所在设备地址,通过Connection调用Connection
Service的Connect()函数,来向服务器发起连接请求。
等服务器接受连接请求后,返回BlueTooth Socket,
把服务器端地址Address和这个Bluetooth Socket放到
HashMap里,用来管理Socket。接着启动BtStream
Watcher线程,用来监听这个Socket里的输入输出流,把
此线程也放到另外一个Hash Map里。
BT Stream Watcher用来处理输入输出流,在BT Cli—
ent界面上进行输入时,根据服务地址,从Hash Map里取
出对应的Socket,由它来向此服务发送消息。接收到文本
消息时,回调On Message Received Listener来通知上层,
在界面上显示。
2 结语
本文首先讨论Android开发蓝牙应用程序的组成,然
后介绍了蓝牙相关协议栈知识及Android平台上蓝牙开
发的实现方法,接着以一个一对多蓝牙通信系统设计与实
现为例,进行了软件开发的详细说明,设计了蓝牙通信的
客户端和服务器端结构,并对各个层次进行了简明的介
绍,实现了其功能模块,程序运行稳定良好。
由于设备的限制,本文只实现了一对二的通信方式,
但也可以扩展为一对三、一对多的方式,在此基础上通过
服务器可以把消息转发给其它客户端,能够实现组群通
信。本系统也只实现了文本消息的传输,后续计划准备实
现一对多的图片、语音、视频的蓝牙传输。
参考文献
[1] 米勒.蓝牙技术起跳EM].北京:电子工业出版社,2002.
[2]杨丰盛.Android技术内幕系统卷[M].北京:机械工业出版社,
2001. (责任编辑:余晓)
发布评论