蓝牙是一种低成本、短距离的无线通信技术。对于那些希望创建个人局域网(PANs)的人们来说,蓝牙技术已经越来越流行了。每个个人局域网都在独立设备的四周被动态地创建,并且为蜂窝式电话和PDA等设备提供了自动连接和即时共享数据的能力。
为了在java平台上开发支持蓝牙技术的软件,JCP定义了JSR82标准--Java蓝牙无线技术APIs(JABWT)。
在这篇文章中,我将介绍一些关于蓝牙技术的背景,概述一下支持蓝牙技术的MIDlet应用程序的典型要素,然后介绍给你核心的Java蓝牙APIs。最后我们展示一些代码来演示如何使用这些APIs。
实际上JSR82定义了两个独立的可选包:核心蓝牙API和对象交换(OBEX)API。这篇文章将对这两个中更为普遍的部分--核心蓝牙包javax.bluetooth进行具体地阐述,而OBEX API(对象交换),我们留到以后去讨论。
蓝牙无线电技术基于在工业、科学以及医学(ISM)上公用的2.45GHz开放频段,这一频段无需授权并全球通用。当蓝牙设备互相连接时,他们将组成一个微微网(piconet),即以一个主设备和最大7个从设备的形式动态创建网络。蓝牙也支持piconet网之间的连接:当一个piconet中的主设备成为另一个piconet的从设备时,piconet与piconet间将形成桥接。
蓝牙协议栈提供了一组的高层协议和API以完成发现服务和模拟串行I/O,还有一个关于包分割和重组的低层协议以及多路技术协议和质量服务。蓝牙互操作性PRofiles--不要与J2ME profiles搞混--它是用来描述跨平台互操作性和一致性需求的。
蓝牙互操作性profiles包括三方面内容:通用访问profile(GAP)定义了设备治理功能性;服务发现应用profiles定义了服务发现方面的内容,串口profiles定义了互操作设备和模拟串口电缆的能力。你可以通过蓝牙规范(Bluetooth specification)学习这些和其它的profiles。蓝牙栈包含一个软件栈来映射一个固件栈(firmware),由图1所示:
图片1:蓝牙协议栈
JSR82揭示了蓝牙软件栈给Java平台的开发者。其中引起我们爱好的是服务发现协议(SDP),用来模拟串口的串口profile RFCOMM,向上层协议提供诸如分割和重组等导向性连接的数据转换操作的逻辑链路控制及适配profile(L2CAP),以及多路技术协议。注重JABWT不支持无连接L2CAP。
JABWT也包括对象交换API。OBEX也是高层API,它用来交换对象数据,诸如电子商业卡和日历标签之间以vCard和vCalendar的格式进行数据传输。在蓝牙上,对象交换通过RFCOMM发生。OBEX在最开始时是由红外(IrDA)引入的,并且它可以在IrDA协议、TCP/ip或者是其他协议的顶层实现。
典型的蓝牙应用程序实例
一个开启蓝牙功能的应用可以作为一个服务端或是一个客户端--一个服务的提供者或是消费者,或者它可以作为一个真正的点对点终端同时表现出服务和客户的行为。图2所示一个蓝牙规范用例:
图2:一个典型的具有蓝牙功能的实际用例
对这些用例的简要介绍:
.初始化--所有具备蓝牙功能的应用程序必须先要初始化蓝牙栈。
.客户端--一个客户对远端服务进行消费。首先它要发现所有四周的设备,然后对于每一个发现的设备搜索它感爱好的服务。
.服务器端--一个为客户端提供服务的服务器。它在服务发现数据库(SDDB)中对客户端进行注册,对他们进行有效广播。然后等待引入的连接,在他们进入时接受他们并为他们提供服务。最后,当不再需要服务时,应用程序会在服务发现数据库(SDDB)中将他们移除。图三:用例中参与活动的图表:
图 3: 蓝牙应用程序活动图
蓝牙应用程序中的元素
图4显示了在MIDlet中一个典型蓝牙功能应用程序中的一些元素:
图4: 具有蓝牙功能的 MIDlet (高端组织)
中间的是核心应用程序My Bluetooth MIDlet,它扩展自javax.microedition.midlet.MIDlet。没有显示出来的还有MIDlet中实现的javax.microedition.lcdui.CommandListener以监服从用户接口中输入的命令。应用程序使用的剩余的类和接口都包含在了蓝牙规范中,像设备发现和服务,连接和服务消费,还有广播和提供服务。