基于蓝牙的手机文件传输软件
1 蓝牙通信的关键技术
蓝牙无线电技术基于在工业、科学以及医学(ISM)上公用的2.45GHz 开放频段,这一频段无需授权并全球通用。当蓝牙设备互相连接时,他们将组成一个微微网(piconet),即以一个主设备和最大7 个从设备的形式动态创建网络。其私有化和个性化特征表现得尤为突出。
1.1 蓝牙协议栈
蓝牙协议栈提供了一组的高层协议和API 以完成发现服务和模拟串行I/O,还有一个关于包分割和重组的低层协议以及多路技术协议和质量服务。蓝牙协议栈分为硬件和软件两部分,蓝牙硬件协议栈由设备硬件提供,蓝牙软件协议栈则由软件实现。
蓝牙软件协议栈是程序开发中的关键部分,其层次从下至上依次是: 宿主控制器接口(HostController Interface,HCI) 是蓝牙软件协议栈的最底层,直接和宿主控制器接口固件(Host ControllerInterface FIRmware)交互。逻辑链路控制和适配协议(Logical Link Control and Adaptation Protocol,L2CAP) 该层负责处理包分割重组,为上层协议提供了有保证的服务。服务发现协议(ServiceDiscovery Protocol,SDP)包含用于发现服务是否有效等操作。RFCOMM 位于L2CAP 之上,提供了模拟标准串口通信的能力。对象交换协议(Object Exchange Protocol,OBEX)用于实际程序中的对象数据交换。
图1 蓝牙协议栈
1.2 J2ME 对蓝牙的支持
早在JSR82 规范中就定义了javax.bluetooth 和javax.obex 两个包,其中javax.bluetooth 定义了与蓝牙通信相关的API , 而javax.obex(Object ExchangeProtocol)是建立在串口通信之上,实现以对象为单位的通信。在javax.bluetooth 中,Java 蓝牙API 可以被分解为三个部分:发现服务、设备管理和蓝牙通信,其主要类及接口有:本地蓝牙管理器LocalDevice、远程蓝牙设备RemoteDevice、搜索代理DiscoveryAgent、搜索侦听DiscoveryListener、描述蓝牙服务的特征属性ServiceRecord 及蓝牙服务属性的类型DataElement.
1.3 J2ME 平台下蓝牙通信流程
图2 蓝牙通信流程图
蓝牙通信也是基于通用连接框架,与常见的C/S架构类似,只是客户端不知服务端的存在,需要通过无线搜索去发现。搜索到远程设备后,还需要进行服务搜索去发现对方提供了哪些服务。
其中,蓝牙通信是基于通用连接框架,对不同客户端而言,需要通过搜索来获得与服务端的连接信息。
蓝牙服务端使用连接通知者对象,用于等待远程设备的连接,类似于阻塞式socket 服务端,它将一直等待直到接收到客户端的连接请求。对于蓝牙客户端的搜索服务分为设备搜索和服务搜索,后者需要基于指定的远程设备才能进行。客户端和服务器端在获得蓝牙协议连接后,通过连接创建输入/输出流来进行通信。
2 手机文件传输软件的实现
2.1 蓝牙服务端的实现
2.1.1 获得本地设备管理器
获得本地设备管理器会导致系统提示是否需要启动蓝牙服务,该步骤是蓝牙设备通信最基本的初始化。
通过LocalDevice 类的getLocalDevice 方法即可获取本地设备管理器。
try {
localDevice = LocalDevice.getLocalDevice();
} catch (BluetoothStateException init) {
init.printStackTrace();
}