手机蓝牙技术的研究与应用

要:随着无线通信技术的迅猛发展和手机的日益普及,人们对于手机近距离的数据交换(如手机名片信息交换)和联网游戏的需求越来越大,而蓝牙技术的产生则正好满足了用户的这种需要。本文首先介绍了J2ME和蓝牙技术的基本概念,然后分析了J2ME对蓝牙应用程序开发的支持包,最后通过一个实例说明了手机蓝牙程序的开发步骤。

关键词:J2ME;蓝牙技术

一、         J2ME概述

J2MEJAVA 2 Micro Edition,它是Java 2的组成部分,与J2SEJ2EE并称。J2ME是一种高度优化的Java运行环境,应用于大量的消费类电子设备,如Cellular Phones(蜂窝电话)Screen Phones(可视电话)Digital Set-top Boxes(数字机顶盒)Car Navigation Systems(汽车导向系统)等,同时也广泛被移动通信设备所采用,如移动电话、双向寻呼机、智能卡、个人电脑记事本(Personal Organizer)和掌上电脑(Palmtop)等。J2ME技术将Java语言的与平台无关的特性移植到小型电子设备上,允许移动无线设备之间共享应用程序。

为了满足消费者和嵌入式市场弹性和定制的需求,J2ME采用模块化、可扩展的设计。J2ME体系的这种模块化和可伸缩性是通过一个分层软件模型来实现的,这个分层软件模型是构建于设备本地操作系统之上的。图1-2J2ME的软件分层体系结构。

图1-2:J2ME软件分层体系结构

 

1)配置(Configuration

配置是为一组“水平”设备的分类所定义的最精简的公共平台,这些设备有着相近的处理器能力和内存容量。一个配置由一个虚拟机和最小的类库集组成,该类库的设计为具有相似特性而又不同的设备提供的基本功能。J2ME规范中有两种通用的配置:连接设备配置(CDC)和限连接配置(CLDC)。CDC设计用于具有更多内存、更快的处理器和更高的网络带宽的设备;CLDC用于具有间歇网络连接、小处理器和有限内存的设备。手机上使用的就是CLDC

2)简表(Profiles

简表是位于配置之上的一层,用来定义一个特定的“垂直”细分市场的特殊要求。实际上,它定义了某一设备家族上的API的最小集合,以保证设备之间的协同工作能力。简表与配置的区别在于:配置必须满足所有设备在内存、处理能力、连接性方面的最小要求;而简表是针对用户界面、输入机制和数据持久性等高度的设备具体性来进行定义的。目前在CDC上定义的简表主要有三个:基础简表、个人简表和个人基础简表;在CLDC上定义了移动信息设备简表MIDP

3)移动信息设备简表MIDP

MIDPCLDC的一个补充,MIDPCLDC相结合为移动信息设备(如手机、PDA、掌上电脑等嵌入式设备)提供更加集中的平台。MIDP提供纵向的整合,来指示CLDC所提供的基本环境,使这些设备能采用java运行环境。

4)可选包(Optional Packages

可选包是位于简表之上并用来扩展简表的一套API。可选包涵盖的功能特性是独立于任何特定“垂直”细分市场或家族的。设计可选包的主要目的是让这些API可以灵活地在各种各样简表之上被加载,以满足更多新的应用需要。

二、         蓝牙技术

随着通信网络的发达,各种通信电缆五花八门,不但办公室中电缆无处不在,家用设备的发展也使居室成了电缆的世界。人们在觉得它们必不可少的同时,又伤透了脑筋,如电缆使用不便,连线频出故障,各种电缆之间无法通用。为了取消连线,以较低成本实现各设备间的无线通信,诞生了蓝牙(Bluetooth)技术。爱立信、IBMIntelNokia和东芝五家公司于19985月联合成立了蓝牙特别利益集团(Bluetooth Special Interest Group-BSIG),并制订了近距离无线通信技术标准——蓝牙技术。它的命名借用了一千多年前一位丹麦皇帝Harald Bluetooth的名字。所谓蓝牙(Bluetooth)技术,实际上是一种短距离无线电技术,利用“蓝牙”技术,能够有效地简化掌上电脑、笔记本电脑和移动电话等移动通信终端设备之间的通信,也能够成功地简化以上这些设备与因特网之间的通信,从而使这些现代通信设备与因特网之间的数据传输变得更加迅速高效,为无线通信拓宽了道路。它具有无线性、开放性、低功耗等特点。因此,蓝牙技术一出现就引起了全球通信业界和广大用户的密切关注。目前蓝牙功能已成为手机的基本功能,蓝牙技术也成为手机间短距离传送数据和联网游戏的基本技术。

三、         J2ME对手机蓝牙应用的支持

200245, Java 开发社区( JCP) 发布了基于J2ME 平台的蓝牙API 规范—JSR82, 这是第一个针对蓝牙开发环境的标准。蓝牙标准是一项开放的标准, 由蓝牙技术联盟(SIG)负责管理。蓝牙技术的最新版本是2.0, 但市场上的蓝牙设备大都停留在1.1 版本。

开发基于蓝牙通信的应用程序通常采用客户端-服务器的应用程序模型。服务(Service)是通信的核心所在, 一个蓝牙服务就是一个作为服务器运行的应用程序, 这个服务向客户端提供了某种功能性的服务。例如, 客户端可以连接打印机, 使用它提供的打印服务。开发者一旦创建了一个服务之后需要首先把这个服务注册到服务查找数据库(Service Discovery DataBase,SDDB) , 然后等待客户端连接。客户端必须首先通过服务发现协议( SDP) 查找到服务所在的设备, 然后在设备上查询服务。一旦获得了服务, 也就获得了连接服务器的URL。借助通用连接框架的方法即可获得相关的ConConnection实例, 客户端就可以真正地使用服务器提供的服务了。

Java 蓝牙无线技术API 定义在javax.bluetooth javax.obex内。

javax.bluetooth: 包含了核心的API, 包括发现服务, 设备管理,L2CAP等类。

javax.obex: 一个不依赖于蓝牙核心API的数据交换包, 属于高级API。这个包并不是必需的。

由于很少有主流移动设备支持OBEX, 本文主要讨论javax.bluetooth 包的实现。

四、         蓝牙应用实现

无论服务端还是客户端, 蓝牙程序的第一步是进行初始化。该阶段主要是和LocalDevice 类打交道。首先通过getLocalDevice()方法取得LocalDevice 实例对象, 如果是服务端, 还需调用setDiscoverable()方法设置好模式。

private LocalDevice localDevice; //本地设备实例

String localBTAddress; //本地蓝牙地址

String localBTName; //蓝牙名称

DiscoveryAgent agent; //发现代理

try

{localDevice = LocalDevice.getLocalDevice();

//取得本地设备实例

if(! localDevice.setDiscoverable(DiscoveryAgent.GIAC)){

//设置服务器可发现

return false; }

localBTAddress = localDevice.getBluetoothAddress();//记录蓝牙地址

localBTName = localDevice.getFriendlyName(); //记录蓝牙名称

agent = localDevice.getDiscoveryAgent(); //取得蓝牙代理

} catch(Exception e){

System.err.println(“初始化蓝牙设备失败: +e); }

一个远端设备类RemoteDevice 的实例代表了一个远端蓝牙设备。在一个蓝牙客户端应用程序可以进行服务, 消费之前, 它必须发送一个设备请求来发现远端设备。典型的蓝牙应用程序和远端设备之间的关系是一对多。

String remoteBTAddress; //远端蓝牙地址

String remoteBTName; //远端蓝牙名称

RemoteDevice remoteDevice; //远端设备

StreamConnection con; //连接

try

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

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

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

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

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

在蓝牙无线网络中, 客户端通常不能直接得到服务端的蓝牙地址, 而需使用服务发现API 帮助客户端搜索周围提供的设备和服务。为了消费一项服务, 客户端通常需要经过三个步骤: 搜索设备, 搜索服务和连接通信。服务代理类(DiscoveryAgent) 同时支持设备与服务的发现。当设备和服务被发现时, 想得到通知的客户端应用程序必须实现并注册DiscoveryListener 接口, 这个接口定义了设备发现通知和服务发现通知的回调。

服务器和客户端的连接: 在连接的URL , 主机名称告诉连接工厂(javax.microedition.io.Connector)是否它应该创建一个客户端或服务器端。如果使用单词localhost 作为主机名将定义一个服务器连接。客户端想要连接到一个指定的的服务可以通过调用ServiceRecord.getConnectionURL() 来找到该服务连接的URL

蓝牙可以支持两种类型的连接:RFCOMML2CAP。创建一个连接均使用Connector.open(String urlName)方法, 参数urlName 代表了连接的url

使用服务端连接: 首先通过L2CAPConnectionNotifier StreamConnectionNotifier 建立一个连接, 同时创建一个蓝牙服务。L2CAPConnectionNotifier notifier = (L2CAPConnectionNotifier) Connector.open(url);

这个URL是自己定义的

格式:btspp://localhost:F0E0D0C0B0A000908070605040302010;name=Picture Server;authorize=false

然后调用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);

五、         结论

遵循蓝牙协议的各种应用都保证简单易用的安装和操作、高效的安全机制和完全的互操作性, 从而实现随时随地的通信。蓝牙技术将在多种领域迅速发展, 其典型应用环境包括无线办公环境(Wireless Office)、汽车工业、信息家电、医疗设备等等, 其他应用环境如学校教育、工厂自动控制等。当前蓝牙技术的开发遇到的最主要问题是设备间的互通性,由于蓝牙是一项新技术, 其协议并没有经过充分的验证与测试,而且不同厂商对协议的理解也会有偏差, 因而开发出来的芯片或者协议栈可能无法互通。这就需要开发者们之间继续相互合作,采用先进的协议开发技术, 进行完善的验证与测试。目前, 在国内外一些著名大公司的全力支持下, 已经有蓝牙的初期产品问世, 一些大的芯片厂商已经开始着手改进具有蓝牙功能的芯片。与此同时, 一些颇具实力的软件公司则推出了各自的协议栈软件, 与芯片厂商合作推出蓝牙技术实现的具体方案,并且不断开发蓝牙技术的典型应用。随着技术和应用的不断发展, 蓝牙将在人们的日常生活和工作中扮演重要角色, 更迅猛地改变人们的生活与工作方式, 提高人们的生活质量。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章