APP下载

Java蓝牙无线技术应用程序开发

2009-09-30任继涛,刘丽娜

电脑知识与技术 2009年34期
关键词:蓝牙

任继涛,刘丽娜

摘要:介绍了Java蓝牙无线技术API规范JSR82,并给出了采用JSR82规范开发蓝牙无线应用程序的具体实现方法和部分实例代码。

关键词:蓝牙;Java;JSR82

中图分类号:TP393文献标识码:A 文章编号:1009-3044(2009)34-9855-02

蓝牙是一种低成本、短距离的无线通信技术,主要是为手机、PDA,GPS等移动设备提供相互通信的能力。蓝牙标准是一项开放标准,由蓝牙技术联盟负责管理。蓝牙技术目前的最新版本为2.1,相比Wi-Fi、WiMAX、3G等无线技术,蓝牙芯片在功耗、成本和体积上占有优势。目前蓝牙技术在手机、GPS和车载设备应用上越来越广泛,发展潜力巨大,目前大多数手机已集成蓝牙芯片并支持Java应用,使得采用Java技术开发手机蓝牙无线应用程序极为方便。

1 JSR82规范

2002年,Java开发社区发布了基于Java平台的蓝牙API规范JSR82。JSR82规范对支持JAVA嵌入式设备的JAVA应用编程接口做出了明确规定,提供了一系列的标准API,可以帮助JAVA嵌入式设备无缝集成蓝牙环境。

Java蓝牙无线技术API包含两个包,javax.bluetooth和javax.obex。javax.bluetooth包含了核心的蓝牙API,如蓝牙设备管理,蓝牙设备发现,蓝牙服务查找、L2CAP等类。javax.obex属于高级API,是一个不依赖于蓝牙核心API的数据交换包。

javax.bluetooth包定义了4个接口,6个类和3个异常。其中LocalDevice类、RemoteDevice类和DeviceClass类属于设备管理API;UUID类、DataElement类、Discorylistener接口、DiscoveryAgent类和SeviceRecord接口属于服务发现API;L2CAPconnection接口和L2CAPconnectionNotifier接口属于连接API。

2 蓝牙应用程序模型

每一个蓝牙应用都表现为一个蓝牙服务,提供服务的一方为服务端,消费服务的一方为客户端。蓝牙客户端的行为包括初始化、发现周围服务和设备、消费服务等,蓝牙服务端的行为包括初始化、创建服务、注册服务、等待客户端访问、创建连接提供客户端消费等。

具备蓝牙功能的应用程序必须先要初始化蓝牙堆栈,一个客户端对远端服务进行消费时首先要发现所有附近的设备,然后对每一个发现的设备搜索它感兴趣的服务,而提供服务的服务端在服务发现数据库(SDDB,Service Discovery Database)中对客户端进行注册,对他们进行有效广播,然后等待引入的连接,在他们进入时接受他们并为他们提供服务。最后,当不再需要服务时,应用程序会在服务发现数据库中将他们移除。

2.1 初始化

无论蓝牙客户端还是服务端,都首先要进行初始化,通常为初始化UUID类、获得LocalDevice类等操作。服务端需要设置LocalDevice,让设备处于可发现状态,设置发现模式,而客户端不用设置发现模式。

在javax.bluetooth中,UUID类用来唯一识别一个蓝牙服务,每一个这样的标识符都要在时空上保证唯一。UUID类有16位或32位的简短UUID或128位的完整UUID。一般在创建时要生成自己的UUID,在服务搜索时要同时给出指定的UUID和通信协议的UUID。

设备管理API中的LocalDevice类代表本地蓝牙设备,初始化时首先通过getLocalDevice()方法取得LocalDevice对象实例,然后调用setDiscoverable()方法设置发现模式。有三种发现模式:DiscoveryAgent.GIAC代表无时间限制模式,DiscoveryAgent.LIAC代表在规定的时间内可被搜索,超时就进入不可搜索状态,DiscoveryAgent.NOT_DISCOVERABLE代表不可搜索状态。

示例代码如下:

uuid = new UUID("F0E0D0C0B0A000908070605040302010", false);//设置UUID

ld=LocalDevice.getLocalDevice();//取得本地设备实例

ld.setDiscoverable(DiscoveryAgent.GIAC);//设置可发现模式为无时间限制模式

localBTAddress=ld.getBluetoothAddress(); //取得蓝牙设备地址

localBTName= ld.getFriendlyName(); //取得蓝牙设备名称

RemoteDevice类代表了远端设备,它提供了读取远端设备蓝牙地址和蓝牙名称的方法。

2.2 服务端操作

1)创建服务并注册:利用UUID计算URL,创建L2CAPConnectionNotifier 连接(对应L2CAP)或StreamConnectionNotifier连接(对应SPP)。利用LocaIDevice取得对应此L2CAPConneCtionNotifier 连接的服务ServiceRecord。如有必要,可以使用DataElement 来设置ServiceRecord的属性。

2)等待客户访问:调用ConnectionNotifier 的方法,等待连接。

2.3 客户端操作

1)发现周围设备和服务:在蓝牙网络中,客户端通常不能直接得到服务端的蓝牙地址,要使用服务发现API搜索周围的设备和服务。为消费一项指定的服务,客户端需要经过三个步骤:搜索设备、搜索服务和连接通信。服务发现API包括DataElement类、Discoverylistener接口、DiscoveryAgent类和ServiceRecord接口。

首先通过LocaIDevice取得DiscoveryAgent 对象。利用该对象发起一次设备查询,设备找到后会调用DiscoveryListener接口对应的方法,记录下远端设备RemoteDevice。再次通过DiscoveryAgent 对象,并提供刚刚找到的远端设备,发起一次服务查询来查询感兴趣的远端服务。服务找到后会调用DiscoveryListener接口对应的方法,将ServiceRecord服务记录下来。至此,一次完整的搜索结束,得到了感兴趣的ServiceRecord列表。

示例代码如下:

try {

con=(StreamConnection)Connector.open(url);//打开连接

remoteDevice=RemoteDevice.getRemoteDevice(con);//取得远端设备

remoteBTAddress=remoteDevice.getBluetoothAddress();//取得远端设备蓝牙地址

remoteBTName=remoteDevice.getFriendlyName(false);//取得远端设备名称

}

catch(Exception e){…} ;//异常处理

2)消费服务:通过ServiceRecord的相应方法可以取得远端服务的URL。这样就可根据服务的类型选择创建对应SPP 的StreamConnection 或对应L2CAP 的L2CAPConnection来进行数据通信了。

2.4 蓝牙连接

蓝牙支持RFCOMM和L2CAP两种类型的连接。蓝牙API使用通用连接框架的StreamConnection和 StreamConnectionNotifier支持RFCOMM,连接类型L2CAPConnection和 L2CAPConnectionNotifier用于支持L2CAP。创建连接需要使用Connection.open(String urlName)方法,参数urlName代表了连接的URL,格式如下所示:

sheme://host:port;parameters

其中scheme 代表了连接的类型,对应RFCOOM为btspp,对应L2CAP为btl2cap。

host对应服务端为localhost,对应客户端为远端蓝牙地址。

port对应服务端为UUID,对应客户端为服务端口。

parameters 指定了可选的设置,如服务名称或MTU大小。

使用服务端连接时,首先通过L2CAPConnectionNotifier或StreamConnectionNotifier建立连接,同时创建一个蓝牙服务。

L2CAPConnectionNotifier notifier = (L2CAPConnectionNotifier) Connector.open(url);

然后调用acceptAndOpen()方法,该方法会自动将服务注册到蓝牙发现数据库SDDB中,之后就可以被客户端搜索了。

L2CAPConnection con = notifier.acceptAndOpen();

使用客户端连接时,也是通过Connector.open(url)建立连接,参数url通过serviceRecord.getConnectionURL()取得,例如:

String url = serviceRecord.getConnectionURL(int requiredSecurity,boolean mustBeMaster);

L2CAPConnection con=(L2CAPConnection)Connector.open (url);

3 结束语

蓝牙技术拥有连接简单、互操作性强的特点,在无线办公、电子支付、汽车工业、信息家电、医疗设备等领域中有着广泛的应用。基于Java的JSR82规范开发无线蓝牙应用程序,继承了Java语言优秀的平台无关特性,可以大大增加程序的可移植性。

参考文献:

[1] 詹建飞.J2ME开发精解[M].北京:电子工业出版社,2006.

[2] 詹建飞.JavaME核心技术与最佳实践[M].北京:电子工业出版社,2007.

[3] 马毅华,冯恩信.基于JSR-82规范的J2ME蓝牙应用及其实现[J].工程应用,2004,(8).

猜你喜欢

蓝牙
蓝牙音箱的直线之美
简单、易用,可玩性强Q AcousticsBT3蓝牙音箱
适合自己的才是最好的 德生(TECSUN) BT-50蓝牙耳机放大器
终于等到你 Shure舒尔蓝牙耳机
紧急:蓝牙指尖陀螺自燃!安全隐患频出
多彩的极简设计——OLI蓝牙音响