`

JSR82 API 介绍

阅读更多

蓝牙是一种低成本、短距离的无线通信技术。对于那些希望创建个人局域网(PANs)的人们来说,蓝牙技术已经越来越流行了。每个个人局域网都在独立设备的周围被动态地创建,并且为蜂窝式电话和PDA等设备提供了自动连接和即时共享数据的能力。
    为了在Java平台上开发支持蓝牙技术的软件,JCP定义了JSR82标准--Java蓝牙无线技术APIs(JABWT)。
    在这篇文章中,我将介绍一些关于蓝牙技术的背景,概述一下支持蓝牙技术的MIDlet应用程序的典型要素,然后介绍给你核心的Java蓝牙APIs。最后我们展示一些代码来演示如何使用这些APIs。
    实际上JSR82定义了两个独立的可选包:核心蓝牙API和对象交换(OBEX)API。这篇文章将对这两个中更为普遍的部分--核心蓝牙包javax.bluetooth进行详细地阐述,而OBEX API(对象交换),我们留到以后去讨论。

背景
    篮牙技术由蓝牙兴趣小组发展,其包括:
        .无线电技术
        .协议栈
        .互操作性profiles
    蓝牙无线电技术基于在工业、科学以及医学(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所示一个蓝牙规范用例:

      图2:一个典型的具有蓝牙功能的实际用例
    对这些用例的简要介绍:
        .初始化--所有具备蓝牙功能的应用程序必须先要初始化蓝牙栈。
        .客户端-- 一个客户对远端服务进行消费。首先它要发现所有附近的设备,然后对于每一个发现的设备搜索它感兴趣的服务。
        .服务器端-- 一个为客户端提供服务的服务器。它在服务发现数据库(SDDB)中对客户端进行注册,对他们进行有效广播。然后等待引入的连接,在他们进入时接受他们并为他们提供服务。最后,当不再需要服务时,应用程序会在服务发现数据库(SDDB)中将他们移除。
 
    图三:用例中参与活动的图表:

               图 3: 蓝牙应用程序活动图
蓝牙应用程序中的元素
    图4显示了在MIDlet中一个典型蓝牙功能应用程序中的一些元素:


           图4: 具有蓝牙功能的 MIDlet (高端组织)
    中间的是核心应用程序My Bluetooth MIDlet,它扩展自javax.microedition.midlet.MIDlet。没有显示出来的还有MIDlet中实现的javax.microedition.lcdui.CommandListener以监听从用户接口中输入的命令。应用程序使用的剩余的类和接口都包含在了蓝牙规范中,像设备发现和服务,连接和服务消费,还有广播和提供服务。
    使用诸如MVC等设计模式是很好的实践。MVC把应用程序分解成用户接口(视图),应用程序行为和导航(控制器),以及数据(模型),当然在我们的案例中还要加上蓝牙API的支撑类和接口。像将分离的客户端、服务端行为构建成独立的类以便以后可以重用这些组件,也是很好的设计。
Java蓝牙API核心概述
    JSR82需求的"最小公分母"是 受限连接设备配置(CLDC),可靠连接设备配置(CDC)是CLDC的超集,所以JABWT可以同时在CLDC和CDC上实现,简要地说,你可以在使用任何J2ME profile的上使用JABWT。
在javax.bluetooth中我们可以发现,Java蓝牙API可以被分解为三个部分,在下面我们将讨论到它们:发现、设备管理和通信。
 
蓝牙发现API
    客户端程序使用蓝牙发现API以搜索在其附近的设备和服务。服务代理类(DiscoveryAgent)同时支持设备与服务的发现。当设备和服务被发现时,想得到通知的客户端应用程序必须实现并注册DiscoveryListener接口,这个接口定义了设备发现通知和服务发现通知的回调。
    发现代理(DiscoveryAgent)与蓝牙客户端应用程序之间是典型的一对一的关系:

    图 5: DiscoveryAgent类和DiscoveryListener接口
设备发现API
    你使用DiscoveryAgent类的"设备发现"方法来开始和取消设备发现:
        .retrieveDevices()重新获得已经发现或者附近的已知设备
        .startInquiry() 启动发现附近设备,也叫inquiry
        .cancelInquiry()取消当前进行的任何请求
    蓝牙发现代理在请求阶段的不同时候会分别调用DiscoveryListener(发现监听器)不同的回调方法:
        .deviceDiscovered() 指出是否有设备被发现。
        .inquiryCompleted() 指出是否请求已经成功、触发一个错误或已被取消。
    在图6中的状态图表阐明了设备发现的状态改变结束于相应的回调方法的返回。

                         图 6: 设备发现状态表
设备发现以调用startInquiry()函数开始。在请求进行时,蓝牙发现代理会在适当的时候调用回调方法DeviceDiscovered()和inquiryCompleted()。
服务发现API
    你可以使用发现代理的服务发现方法来开始或取消服务发现:
        . selectService()启动服务发现搜索。(原文有误,根据API手册应为尝试定位一个服务)
        . searchServices()启动服务发现搜索。
        . cancelServiceSearch()取消在正在进行中的任何的服务发现搜索操作。
    蓝牙发现代理在服务发现阶段的不同时候会分别调用DiscoveryListener的服务发现回调方法:
        . servicesDiscovered() 表示是否服务已被发现。
        . serviceSearchCompleted()表示服务发现是否已经完成。
    图7阐明了服务发现的状态改变结束于DiscoveryListener的回调方法的返回。

                 图 7: 服务发现状态图表
服务发现开始于对searchServices()的调用。当服务搜索进行时,蓝牙发现代理会在适当的时候回调servicesDiscovered()和 serviceSearchCompleted()方法。
    除了DiscoveryAgent和 DiscoveryListener了,你在服务发现过程中还要使用到的类有UUID,ServiceRecord以及DataElement等。
UUID类
    在蓝牙中,每个服务和服务属性都唯一地由"全球唯一标识符" (UUID)来校验。正如它的名字所暗示的,每一个这样的标识符都要在时空上保证唯一。UUID类可表现为短整形(16或32位)和长整形(128位)UUID。他提供了分别利用String和16位或32位数值来创建类的构造函数,提供了一个可以比较两个UUID(如果两个都是128位)的方法,还有一个可以转换一个UUID为一个字符串的方法。UUID实例是不可改变的(immutable),只有被UUID标示的服务可以被发现。
    在Linux下你用一个命令uuidgen -t可以生成一个UUID值;在Windows下则执行命令uuidgen 。UUID看起来就像如下的这个形式:2d266186-01fb-47c2-8d9f-10b8ec891363。当使用生成的UUID去创建一个UUID对象,你可以去掉连字符。
SDDB和ServiceRecord接口
    在服务发现的中心是服务发现数据库(SDDB)和服务发现协议(SDP)。SDDB由蓝牙实现负责维护的数据库。它包含了服务记录(service records),后者代表了对客户端有效的服务。SDP对于基于JABWT应用程序来说是透明的;可以这么说,SDP是用于服务发现的。为重新获取服务纪录,一个本地设备SDP客户端会向一个远端设备上SDP服务器发出请求。


                      图 8: SDDB
每一笔服务记录都会由一个ServiceRecord的实例来表现。这个记录包含了描述服务细节的属性。这个类提供了几种有用的方法:
    .getAttributeIDs() 和 getAttributeValue()方法返回服务记录的属性。
    .getConnectionURL()方法获取链接的URL地址给服务器主机来收集服务记录。
    .getHostDevice() 方法获取提供服务的远端设备。
    .populateRecord() 和 setAttributeValue()方法用来设置设备记录的属性。
    .setDeviceServiceClasses()方法设置服务的类。
图9显示了蓝牙本地设备和远端设备,以及SDDB还有服务记录之间的关系:


       图 9: 使用远端设备,SDDB和服务记录进行服务发现
    为使服务端可以被客户端来使用,服务应用程序要通过如下方法建立一个服务记录,首先要创建一个连接通知器(connection notifier),然后由调用连接通知器的acceptAndWait()方法来向SDDB中插入记录。服务端程序能够在适当的时候获得记录和更新。客户端应用程序向远端SDDB请求可以使用的服务,会发现服务记录。(待续)

 

转载: http://www.ldci.com.cn/bbs/read.php?tid=2900

分享到:
评论

相关推荐

    蓝牙技术Java API与规范(JSR82)

    Java API规范JSR82,全称为"Java Community Process (JCP) Specification Request 82",是Java为蓝牙应用提供的一套接口和类库,它定义了如何在Java环境中访问和控制蓝牙硬件。 JSR82规范的目标是为Java开发者提供...

    jsr311-api-1.1.1-API文档-中文版.zip

    赠送jar包:jsr311-api-1.1.1.jar; 赠送原API文档:jsr311-api-1.1.1-javadoc.jar; 赠送源代码:jsr311-api-1.1.1-sources.jar; 赠送Maven依赖信息文件:jsr311-api-1.1.1.pom; 包含翻译后的API文档:jsr311-api...

    jsr311-api-1.1.1-API文档-中英对照版.zip

    赠送jar包:jsr311-api-1.1.1.jar; 赠送原API文档:jsr311-api-1.1.1-javadoc.jar; 赠送源代码:jsr311-api-1.1.1-sources.jar; 赠送Maven依赖信息文件:jsr311-api-1.1.1.pom; 包含翻译后的API文档:jsr311-api...

    jsr173_api

    **JSR 173 API**,全称为Java Specification Request 173,是Java社区进程(Java Community Process)发布的一个标准,旨在为Java平台引入标准化的可扩展性框架,以便处理XML流数据。该API的主要目标是为Java开发者...

    开发j2me必备api 【jsr系列api】

    3. **JSR 82: Java API for Bluetooth** - 这个API允许J2ME应用程序通过蓝牙进行无线通信,包括设备发现、连接、数据传输等功能。 4. **JSR 180: Web Services for J2ME** - 提供了在J2ME平台上开发和消费Web服务...

    jsr173_api-1.0.jar

    jsr173_api-1.0.jar jsr173_api-1.0.jar

    jsr250-api-1.0源码

    **JSR 250 API 1.0 源码详解** JSR 250,全称为Java Specification Request 250,是Java EE 5和6规范的一部分,它定义了一组用于企业级应用的注解。这些注解主要用于简化应用程序的生命周期管理,例如初始化、销毁...

    jsr311-api.jar

    **JSR 311 API** 是Java Specification Request (JSR) 311的实现,它是Java平台上的一个标准接口,主要用于构建RESTful(Representational State Transfer)Web服务。REST是一种轻量级的架构风格,它以HTTP协议为...

    JSR-94的API,最终版的

    **JSR-94 API详解** JSR-94(Java Specification Request 94)是Java平台企业版(Java EE)中的一个规范,它定义了一个标准接口,使得开发者能够将规则引擎集成到Java应用程序中。这个API允许应用程序与规则引擎...

    JSR286 API (chm版)

    JSR286 API (chm版)自己做的 需要的下载

    JSR168规范与API手册

    5. **API接口**:JSR168提供了一系列的API接口,供portlet开发者使用。例如,`Portlet`接口提供了portlet的基本功能,`PortletConfig`接口提供了portlet配置信息,`PortletRequest`和`PortletResponse`接口则分别...

    JSR256 API

    **JSR256 API** 是Java Community Process (JCP) 定义的一个规范,全称为Java Specification Request 256。这个API专注于在Java 2 Micro Edition (J2ME) 平台上提供传感器接口,使得移动设备和嵌入式系统能够有效地...

    jsr75 API J2ME手机程序文件系统

    **JSR75 API**,全称为Java Specification Request 75,是Java ME(J2ME)平台上的一项标准,主要用于在移动设备上提供文件系统访问的能力。这项API为开发者提供了在资源有限的移动设备上创建、读取、修改和删除文件...

    jsr173_1.0_api.jar

    【标题】"jsr173_1.0_api.jar"是Java标准版的一个扩展,全称为Java Specification Request 173(JSR 173),它定义了Java编程语言对XML Streaming API(StAX - Streaming API for XML)的支持。这个API允许开发者以...

    xfire-jsr181-api-1.0-M1.jar,xfire-jsr181-api-1.0-M1.jar

    webservice中用到的jar,xfire-jsr181-api-1.0-M1.jar,xfire-jsr181-api-1.0-M1.jar

    maven创建-jsr250-api

    jsr是Java Specification Requests的缩写,意思是Java 规范提案。

    j2me jsr184 api

    **JSR 184 API** 是Java ME(J2ME)平台中的一项规范,全称为"Mobile 3D Graphics API",它为移动设备提供了3D图形编程接口,使得开发者能够在小型设备上创建和展示复杂的三维图形。这项技术极大地扩展了J2ME应用...

    jaxb-impl.jar jaxb-api.jar jsr173_1.0_api.jar

    在给定的压缩包文件中,包含了一些核心的JAXB组件以及相关的依赖库,如`jaxb-impl.jar`、`jaxb-api.jar`和`jsr173_1.0_api.jar`,这些都是解决在Maven项目中这些特定jar包缺失问题的关键。 首先,`jaxb-impl.jar`是...

    JSR286规范与API手册

    JSR286,全称为Java Specification Request 286,是Java Community Process(JCP)发布的一个标准,专门用于定义portlet 2.0 API。这个标准是portlet开发的重要里程碑,它扩展了JSR168(portlet 1.0)的特性,为构建...

    jsr311-api-1.0.jar

    jsr311-api-1.0.jar的jar包,与以前的版本不同,且使用广泛点

Global site tag (gtag.js) - Google Analytics