




已阅读5页,还剩25页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于 j2me+蓝牙技术的休闲娱乐平台设计与实现 摘 要 随着手机的日益普及、java 功能在移动设备上的实现,java 应用程序产生的手机增值服务逐 渐体现出其影响力,对丰富人们的生活内容、提供快捷的资讯起着不可忽视的作用。特别是手机性 能的逐渐增强,手机作为一个娱乐平台越来越成熟了。本课题着眼于 j2me 技术的应用,利用 jsr082 蓝牙 java api 的软件包,使这些移动设备交换任意的基于文本的消息,以及简单的游戏对 战,开发出一款可用的手机蓝牙娱乐平台。全文介绍了 j2me 的相关技术及本程序的结构分析和具 体功能的实现。 关键词:j2me;手机;蓝牙;娱乐平台 j2me + bluetooth based platform entertainment design and implementation abstract when mobile phone is getting ever more popular nowadays, with the implementation of java technology on mobile equipment, increment of capital on communication service exhibits its force on peoples everyday life, providing them ever fast information just in hand. mobile phone whose capability is greater is more and more mature for game. this dissertation focuses on implementation of j2me technology,used jsr082 bluetooth java api to drive these investments exchange test messages,simpily multiply games by using client useful java api,to developed a bluetooth entertainment platform run on mobile phones.this dissertation introduces j2me and its relative technology as well as this programs structure and analysis of implementation in details. keywords: j2me; mobile phone;bluetooth; platform entertainment i 目 录 1 1 引言引言- 1 - 1.1 技术背景.- 1 - 1.2 开发意义.- 1 - 1.3 开发环境.- 1 - 2 2 j2mej2me 理论及相关技术理论及相关技术- 2 - 2.1 概述.- 2 - 2.2 j2me 蓝牙应用开发及其实现.- 2 - 2.2.1 j2me 软件架构- 2 - 2.2.2 蓝牙技术- 3 - 2.2.3 java蓝牙应用模型.- 3 - 2.2.4 java蓝牙 api 概述.- 3 - 2.2.5 蓝牙应用的实现.- 4 - 3 3 系统分析与实现系统分析与实现.- 6 - 3.1 系统功能设计- 6 - 3.2 系统构架.- 6 - 3.3 系统实现.- 8 - 3.3.1 midlet 主类- 8 - 3.3.2 蓝牙搜索与服务.- 9 - 3.3.3 聊天室实现.- 16 - 3.3.4 蓝牙五子棋实现.- 17 - 3.4 系统测试.- 19 - 4 4 结束语结束语.- 22 - 致致 谢谢.- 23 - 参考文献参考文献- 24 - 引言 - 1 - 1 1 引言引言 1.1 技术背景 随着无线技术的飞速发展以及移动信息技术的进一步成熟,出现了很多有关无线应 用开发的技术。从最简单的电视遥控器,到今天已经普及的手机。人们已经越来越习 惯于无线传输技术带来的种种方便。手机上网,似乎已经不是什么新概念了,传统的 方式就是用数据线或者计算机的红外线接口将手机和笔记本电脑或其它的电脑设备相 连。但这两种方式都有很多的不便数据线太麻烦,红外线接口距离短不说,还要保 证连接时没有障碍物阻隔。本课题实现了另一短距离无线通信协议”蓝牙” ,蓝牙技术 具有无需通信费用、数据传输范围更大、安全性更好等特点,将成为各种便携式设备 进行无线连接的新标准。 1.2 开发意义 目前来看,移动电话是蓝牙技术的最大应用领域,也是已经有实际应用的领域。通 过在移动电话中植入蓝牙技术,可以实现无线耳机、车载电话等功能,还能实现与便 携式计算机和其他手持设备的无电缆连接,组成一个方便灵活的pan,使人们能够随 时随地实现个人区域内语音和数据的交换与传输。随着技术的发展和完善,蓝牙必将 对人们的生活和工作产生重大影响。 本课题是对蓝牙技术的一些实践,设计实现一个基于蓝牙的手机娱乐应用程序。程 序主要应用j2me技术及其蓝牙规范。由于遵循移动信息设备配置(midp),所以该程序 可以被下载到拥有java虚拟机的手机上运行,或直接在电脑上运行,实现手机间的蓝牙 聊天游戏功能。 蓝牙充当一个短距离的无线连接接口,该聊天应用程序在其形成的蓝牙无线个人局 域网(pan)内,聊天信息的传输与一般聊天软件相比具有速度更快,成本和功耗更低并 且无费用的优点。 1.3 开发环境 软件环境: windows7 build 7100rc 32位版 sun jdk 1.6 eclipse 3.5 pulsar for mobile java sun wireless tool kit 2.5.2 硬件环境: 基于amd处理器64位pc 基于 j2me+蓝牙技术的休闲娱乐平台 - 2 - 2 2 j2mej2me 理论及相关技术理论及相关技术 2.1 概述 j2me即java 2 micro edition,它是java 2的组成部分,与j2se、j2ee并称。j2me 是一种高度优化的java运行环境,应用于大量的消费类电子设备,如cellular phones(蜂 窝电话)、screen phones(可视电话)、digital set-top boxes(数字机顶盒)、car navigation systems(汽车导向系统)等,同时也广泛被移动通信设备所采用,如移动电话、双向寻 呼机、智能卡、个人电脑记事本(personal organizer)和掌上电脑(palmtop)等。j2me技术 将java语言的与平台无关的特性移植到小型电子设备上,允许移动无线设备之间共享应 用程序。j2me 使用配置和简表定制 java 运行时环境 (jre)。作为一个完整的 jre,j2me 由配置和简表组成,配置决定了使用的 jvm,而简表通过添加特定于域 的类来定义应用程序。 与以前 sun 公司推出的j2ee (java 2 enterprise edition,java 2企业版)、j2se (java 2 standard edition,java 2标准版)规范相比,j2me 不是一个单独的技术规范,而是一 系列技术规范总称。这些规范定义了 java 技术在资源限制的设备中的表现形式。 j2me 主要适用于小型嵌入式设备,这些设备与pc或是服务器设备相比没有统一的硬 件标准、外观与操作方式,其功用也是千差万别。但是j2me 在适用于这些设备的同 时也保留了 java 的传统特性,即任何时间和任何地点的代码具有可移植性、部署灵活 性、安全的网络传输性,以及代码稳定性。正是因为如此,开发人员才可以借助j2me 力量让编写的程序能够运行在其他型号或厂商的设备上。 2.2 j2me 蓝牙应用开发及其实现 .1 j2mej2me 软件架构软件架构 j2me平台由多种配置(configuration)简表(profile)和可选包(optional package)f 组成。表2-1为j2me平台的体系结构。操作系统位于j2me运行环境的最底层,操作系 统可以是linux,symbian或者palmos这充分体现了java语言的跨平台性。配置由 java虚拟机和一系列的api集合组成,为某一范围内的嵌入式设备提供基本的功能,这 些设备通常在硬件和软件上具有类似的特性。目前,j2me平台主要包含两个配置:连 接设备配置(connecteddeviceconfigurationcdc)和连接受限设备配置 (conneetedlimiteddevice configuration。cldc)。简表位于配置之上,为运行环境提供 高层的api,例如,应用程序模型和图形用户界面等。1cldc上采用最广泛的简表是 移动信息设备简表(mobile lnformationdeviceprofile,midp)。基于cldc与midp的 j2me平台主要面对的目标设备是移动电话。j2me平台可以通过添加可选包 (optionalpackage)进行扩展。可选包是针对特殊技术的实现。因此它定位的是特定范围 j2me 理论及相关技术 - 3 - 的设备,而不适合作为一项固有功能定义在midp中。随着移动终端设备内存和处理器 能力的提高,越来越多的可选包被添加到具体的j2me平台上。 optional package profile configuration java virtual machine host operating system 表2-1 j2me平台的体系结构 .2 蓝牙技术蓝牙技术 所谓蓝牙(bluetooth)技术,实际上是一种短距离无线电技术,利用“蓝牙”技术,能 够有效地简化掌上电脑、笔记本电脑和移动电话手机等移动通信终端设备之间的通信, 也能够成功地简化以上这些设备与因特网internet之间的通信,从而使这些现代通信设 备与因特网之间的数据传输变得更加迅速高效,为无线通信拓宽道路。蓝牙采用分散 式网络结构以及快跳频和短包技术,支持点对点及点对多点通信,工作在全球通用的 2.4ghz ism(即工业、科学、医学)频段。其数据速率为1mbps。采用时分双工传输 方案实现全双工传输。 .3 javajava 蓝牙应用模型蓝牙应用模型 2002年4月5日。java开发社区(jcp)发布了基于j2me平台的蓝牙api规范 jsr82,这是第一个针对蓝牙开发环境的标准。蓝牙标准是一项开放的标准,由蓝牙技 术联盟(sig,specialinterest group)负责管理。蓝牙技术的最新版本是2.0,但市场上的 蓝牙设备大都停留在1.1版本。开发基于蓝牙通信的应用程序通常采用客户端一服务器 的应用程序模型。服务(service)是通信的核心所在,一个蓝牙服务就是一个作为服务器 运行的应用程序。这个服务向客户端提供某种功能性的服务。例如,客户端可以连接 打印机,使用它提供的打印服务。开发者一旦创建了一个服务之后需要首先把这个服 务注册到服务查找数据库(service discovery database.sddb)中,然后等待客户端连接。 客户端必须首先通过服务发现协议(sdp)查找到服务所在的设备,然后在设备上查询服 务。一旦获得了服务,也就获得了连接服务器的url。借助通用连接框架的方法即可 获得相关的connection权限,客户端就可以真正地使用服务器提供的服务了。 .4 javajava 蓝牙蓝牙 apiapi 概述概述 java蓝牙无线技术api定义在javax.bluetooth和javax.obex内。javax.bluetooth:包含 了核心的api。包括发现服务,设备管理,l2cap等类。javax.obex:一个不依赖于蓝 牙核心api的数据交换包,属于高级api。这个包并不是必需的。由于很少有主流移动 设备支持obex,本文主要讨论iavax.bluetooth包的实现。在javax.bluetooth中我们发现, 基于 j2me+蓝牙技术的休闲娱乐平台 - 4 - java蓝牙api可以被分解为三个部分:设备管理,服务发现和连接。 .5 蓝牙应用的实现蓝牙应用的实现 无论服务端还是客户端。蓝牙程序的第一步是进行初始化。该阶段主要是和 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.getbluetoothaddess();/记录蓝牙地址 localbtname=localdevice.getfriendlyname();/记录蓝牙名称 agent=localdevice.getdicoveryagent();/取得蓝牙代理 catch(exception e) system.err.println(“初始化蓝牙设备失败:”+e); 一个远端设备类remotedevice的实例代表了一个远端蓝牙设备。在一个蓝牙客户端 应用程序可以进行服务消费之前它必须发送一个设备请求来发现远端设备。典型 的蓝牙应用程序和远端设备之间的关系是一对多。 string remotebtaddress;/远端蓝牙地址 string remotebtname;/远端蓝牙名称 remotedevice remotedevice;/远端设备 streamconnection con;/连接 try con=(streamconnection)connector.open(url);/打开连接 j2me 理论及相关技术 - 5 - remotedevice=remotedevicegetremotedevice(con);/获取远端设备 remotebtaddrem=remotedevicegetbluetoothaddress();/取得远端设备蓝牙地址 remotebtname=rvmotemcegetfriendlyname(false);/取得远端设备名称 catch(exception e) /处理异常 在蓝牙无线网络中。客户端通常不能直接得到服务端的蓝牙地址,而需使用服务发 现api帮助客户端搜索周围提供的设备和服务。为了消费一项服务客户端通常需要经 过三个步骤:搜索设备搜索服务和连接通信。服务代理类(discoveryagent)同时支持 设备与服务的发现。当设备和服务被发现时,想得到通知的客户端应用程序必须实现 并注册discoverylistener接口这个接口定义了设备发现通知和服务发现通知的回调。 服务器和客户端的连接:在连接的url中主机名称告诉连接工厂是否它应该创建一 个客户端异或服务器端。如果使用单词localhost作为主机名将定义一个服务器连接。客 户端想要连接到一个指定的的服务可以通过调用servicerecord.getconnectionurl()来找 到该服务连接的url。蓝牙可以支持两种类型的连接: (1)使用服务端连接:首先通过l2capconnectionnotifier或streamconnectionnotifier 建立一个连接,同时创建一个蓝牙服务。l2capconnectionnotifier notifier=(l2capconnectionnotifier)connectoropen(url);然后调用acceptandopen()方 法,该方法会自动将服务注册到蓝牙发现数据库中(sddb)之后该服务就可以被客户 端搜索了。该方法同时返回一个用于通信的连接。l2capconnection con=notifier.acceptandopen(); (2)使用客户端连接:虽然客户端也是通过connector.open(url)建立连接参数url通 常不是直接给出的,而是通过servicerecord.getconnectionurl()得例如:string url=secvicerecordgetconnectionurl(int requiredsecurity,boolean mustbemaster); l2capconnection con=(l2capconneetion)connector.open(url); 基于 j2me+蓝牙技术的休闲娱乐平台 - 6 - 3 3 系统分析与实现系统分析与实现 3.1 系统功能设计 根据软件的开发目的,主要实现以下功能:用户登录,双人聊天室,多人聊天室, 双人五子棋对战,平台帮助。组织结构如图3-1: 图 3-1 用户登录模块:实现平台的蓝牙用户登录,区别不同的用户以及服务端。 聊天模块:实现平台的双人或者多人聊天功能。 游戏模块:实现平台的双人蓝牙对战五子棋功能。 帮助模块:平台的版本信息及游戏规则说明。 3.2 系统构架 平台设计所用技术与方法: (1)jsr82 蓝牙编程 api; (2)多线程编程模式; (3)客户端/服务器编程模式。 平台工程全部类结构图 3-2: 系统分析与实现 - 7 - 图 3-2 基于 j2me+蓝牙技术的休闲娱乐平台 - 8 - 3.3 系统实现 .1 midletmidlet 主类主类 flat 包中的 flatmainmdlet.java 文件中的 flatmainmidlet 类是整个程序的主类,功能 是控制整个程序的流程与个人子程序界面的显示。代码如下: package flat; import javax.microedition.lcdui.display; import javax.microedition.midlet.midlet; import javax.microedition.midlet.midletstatechangeexception; /* */* * flatmainmidlet 游戏娱乐平台的主类 * 责负整个平台的运作 */ public class flatmainmidlet extends midlet /*/*登录窗口*/ protected loginwindow loginwindow = null; /*/*游戏娱乐平台的菜单*/ protected mainmenu flatmenu = null ; private boolean isfirst = true; public display display = null; /* */* * 休闲娱乐平台的初使化 flatmainmidlet 的构造函数 * 进行游戏的初始化 */ public flatmainmidlet() display = display.getdisplay(this); /* */*程序结束*/ protected void destroyapp(boolean uncondition) throws midletstatechangeexception notifydestroyed(); /* */*程序暂停*/ protected void pauseapp() . 系统分析与实现 - 9 - /* */*程序开始*/ protected void startapp() throws midletstatechangeexception if(isfirst) loginwindow = new loginwindow(this); display.setcurrent(loginwindow); isfirst = false; /* */*显示主菜单*/ public void showflatmenu() if(flatmenu!=null) display.setcurrent(flatmenu); /* */*退出休闲平台*/ public void exitflat() . try . destroyapp(true); catch (midletstatechangeexception e) . /*/*flatmainmidlet.java 文件结束*/ .2 蓝牙搜索与服务蓝牙搜索与服务 common 包中两个类对于整个系统来说是非常重要的,同时它们涉及到 jsr82api 的应用,所以这个包中的两个类的功能实现是一个技术点。先介绍 servicesearcher 类, servicesearcher 类实现两个接口,第一个接口是 runnable,这样做的目的是使其成为一 个线程类,其它类调用它的时候就是会在后台产生一个任务线程。第二个接口就是 discoverylistener,目的是要利用 jsr82 中的 api,有关与蓝牙搜索设备与服务的模式 与方法是不难理解的,具体的实现如代码所示,代码里边利用到了线程同步的机制, 还有如何获取用户服务记录属性的值方法。代码如下: package common; import java.util.vector; import javax.bluetooth.bluetoothstateexception; import javax.bluetooth.deviceclass; 基于 j2me+蓝牙技术的休闲娱乐平台 - 10 - import javax.bluetooth.discoveryagent; import javax.bluetooth.discoverylistener; import javax.bluetooth.localdevice; import javax.bluetooth.remotedevice; import javax.bluetooth.servicerecord; import javax.bluetooth.uuid; * servicesearcher 类 * 用于搜索两种服务 * uuid-11111111111111111111111111111111 * 两个聊天室 * uuid-22222222222222222222222222222222 * 多个聊天室 public class servicesearcher implements runnable, discoverylistener . /*/*服务类型名*/ private string servicename = null; /*/*聊天室列表类*/ private roomlist chatroomlist = null; /*/*本地设备*/ private localdevice localdevice = null; /*/*服务代理*/ private discoveryagent agent = null; /*/*发现的设备*/ private vector devicefound = null; /*/*发现的服务*/ private vector servicefound = null; public servicesearcher(string servicename,roomlist roomlist) . this.servicename = servicename; this.chatroomlist = roomlist; /*/*开始搜索线程*/ new thread(this).start(); /* */* * 开始搜索 */ public void run() . dosearchdevices(); /* */* * 服务记录搜索的方法 系统分析与实现 - 11 - */ public void dosearchdevices(). try . localdevice = localdevice.getlocaldevice(); catch (bluetoothstateexception e) . e.printstacktrace(); agent = localdevice.getdiscoveryagent(); devicefound = new vector(); servicefound = new vector(); try . if(!agent.startinquiry(discoveryagent.giac, this) . return; catch (bluetoothstateexception e) . /* */* * 服务搜索的方法 * param remotedevice * return void */ public void doservicesearch(remotedevice remotedevice). /*/*服务记录属性值的 id,用户自定义的属性值*/ int attributes = .0x1234,0x1235; /*/*服务记录的 uuid*/ uuid uuids = new uuid2; uuids0 = new uuid(servicename, false); uuids1 = new uuid(0x1101); try . agent.searchservices(attributes, uuids, remotedevice, this); catch (bluetoothstateexception e) . /*/*服务搜索失败的处理*/ return; /* */* * 服务器设备发现的处理 基于 j2me+蓝牙技术的休闲娱乐平台 - 12 - * param remotedevice, deviceclasss * return void */ public void devicediscovered(remotedevice remotedevice, deviceclass deviceclass) . /*/*加入搜索到的服务器设备*/ devicefound.addelement(remotedevice); /* */* * 服务器设备搜索到服务设备的处理 * param distype * return void */ public void inquirycompleted(int distype) . switch(distype) . /*/*成功完成搜索的处理*/ case discoverylistener.inquiry_completed: for(int i= 0; idevicefound.size(); i+). doservicesearch(remotedevice)devicefound.elementat(i); /*/*实现一次搜一个服务器设备的服务记录的同步*/ synchronized(this). try . this.wait(); catch (interruptedexception e) . e.printstacktrace(); addroommessage(); break; case discoverylistener.inquiry_terminated: break; case discoverylistener.inquiry_error: break; /*/*不利用服务搜索完成方法*/ public void servicesearchcompleted(int transid, int respcode) . 系统分析与实现 - 13 - /* */* * 搜索到服务的处理 * param tarnsid, servicerecord * return void */ public void servicesdiscovered(int transid, servicerecord servicerecord) . /*/*加入搜索到的服务记录*/ servicefound.addelement(servicerecord0); /*/*实现一次搜一个服务器设备的服务记录的同步*/ synchronized(this). this.notifyall(); /* */* * 增加搜到的聊天室列表 * param 无 * return 无 */ private void addroommessage() . servicerecord temprecord= null; chatroomlist.roomurllist = new stringservicefound.size(); chatroomlist.roomnamelist = new stringservicefound.size(); /*/*删除原先的 string*/ chatroomlist.deleteall(); for(int i=0; iservicefound.size(); i+) . /*/*获得服务器端的服务记录*/ temprecord = (servicerecord)servicefound.elementat(i); /*/*获得服务器端的服务记录的链接字符串并加入到聊天室的链接列表*/ chatroomlist.roomurllisti= temprecord.getconnectionurl( servicerecord.noauthenticate_noencrypt, false); /*/*获得服务记录的用户自定义的服务属性并加入到聊天室名的列表*/ string str =(string)(temprecord.getattributevalue(0x1234).getvalue(); chatroomlist.append(str, null); chatroomlist.roomnamelisti = str; /servicesercher.java 结束 基于 j2me+蓝牙技术的休闲娱乐平台 - 14 - package common; import javax.microedition.lcdui.command; import javax.microedition.lcdui.commandlistener; import javax.microedition.lcdui.displayable; import javax.microedition.lcdui.list; import chat.multichatroomclient; import chat.pairchatroomclient; import flat.flatmainmidlet; import game.gameclient; /* */* * roomlist 类 * 显示蓝牙网络中开放的如娱乐房间的列表。 * 提供给用户选择进入感趣兴的娱乐房间。 */ public class roomlist extends list implements commandlistener . /*/*聊天室类型*/ private int roomstyle ; /*/*用户名*/ private string username = null; /*/*娱乐平始的主类*/ private flatmainmidlet flatmainmidlet = null; /*/*聊天室链接列表*/ public string roomurllist = null; /*/*聊天室名称列表,创建聊天室的用户妮称*/ public string roomnamelist = null; private static final command cmdback = new command(“返出“,command.back,1); private static final command cmdok = new command(“进入“, command.ok,1); /* */* * 构造方法 * 完成聊天室窗口的初使化 * param title * param flatmainmidlet * param username */ public roomlist(string title, flatmainmidlet flatmainmidlet, string username ,string uuidstring, int roomstyle). super(title, list.exclusive); this.flatmainmidlet = flatmainmidlet; this.username = username; this.roomstyle = roomstyle; 系统分析与实现 - 15 - append(“搜索房间中.“,null); addcommand(cmdback); addcommand(cmdok); setcommandlistener(this); new servicesearcher(uuidstring,this); private void showroomclinet(int index) . switch(roomstyle) . case 1: /*/*双人个聊天室*/ flatmainmidlet.display.setcurrent( new pairchatroomclient(roomurllistindex, flatmainmidlet,username,roomnamelistindex); break; case 2: /*/*多人聊天室*/ flatmainmidlet.display.setcurrent( new multichatroomclient(roomurllistindex, flatmainmidlet,username,roomnamelistindex); break; case 3: /*/*游戏聊天室*/ flatmainmidlet.display.setcurrent( new gameclient(roomurllistindex, flatmainmidlet); break; public void commandaction(command command, displayable displayable) . /*/*进入聊天室*/ if(command=cmdok) . if(roomurllist!=null) . /*/*选择的聊天室的序号*/ int index = getselectedindex(); showroomclinet( index); 基于 j2me+蓝牙技术的休闲娱乐平台 - 16 - /*/*返回主菜单*/ else if(command=cmdback) . flatmainmidlet.showflatmenu(); /roomlist.java 文件结束 roomlist 类是 servicesearcher 类的使用者。roomlist 类主要是利用 servcesearcher 类来搜索某种服务,并将结果显示出来。 .3 聊天室实现聊天室实现 从 chat 包中类的命名中,可以看出每个类的功能。这个包中的类都是采用多线程 的技术,b/s 模式的编程思想,与网络平台的 b/s 模式一样的,不过利用了 jsr82 的 api,蓝牙的服务模式、服务 search 模式与设备发现模式这类的知识。每台有 bluetooth 功能的手机(蓝牙设备)都可以是服务器或客户端,或者同时两种身份同时存在。每 个蓝牙设备都有一个 sddb-服务记录数据库,里面存放着服务记录表,一张表是一些 服务记录属性的集合,而服务记录的的属性是一对值,由服务记录 id 与服务记录值 (dataelement 类类型)组成。服务记录表的服务记录属性值可分为两种,一种是默认 的服务记录属性,一种是用户自定义的服务记录属性能。每张服务记录表对应着蓝牙 设备所提供的服务,每张有一个 id(uuid) 。蓝牙设备提供一个服务的时候,服务记 录数据库中会有服务记录表。如下这段代码: /*开启服务*/ server=(streamconnectionnotifier)connector.open(“btspp:/localhost:2222222222222222222222 2222222222“); 当蓝牙设备执行这段代码时,它会同时在自己的服务记录数据库中增加一个服务记 录表,表中的 id(uuid=22.),表中的那些默认的服务记录属性就是自动填写了, 如果想增加一些用户自定义的服务记录属性,可以参考如下代码: /*服务器服务记录*/ servicerecord record = local.getrecord(server); /*自定义服务记录属性*/ dataelement elm = null; elm = new dataelement(dataelement.string, username); /请注意这上面的 username 这里不能为中文的,所以上面登录的时候不能有中文的, 这可能是中文编码的问题/ record.setattributevalue(0x1234, elm); elm = null; elm = new dataelement(dataelement.string, “scholar_ii“); 系统分析与实现 - 17 - record.setattributevalue(0x1235, elm); /*更新服务记录属性*/ local.updaterecord(record); 接着是蓝牙设备的客户端,从客户端而言即得到服务。jsr82api 所提供的机制很 符合面向对象,也类似于人的思维方式。需要某种服务,向周围的人咨询是否有提供 这种服务,如果有就与对方交互,接着就得到服务。蓝牙设备想要得到某种服务,首 先所做的工作就是搜索附近的设备,接着就询问所搜索的设备提供哪些服务(查找对 方的服务记录数据库) ,是否提供自己想要的服务(通过 uuid 来判断) 。蓝牙设备服 务器设置用户自义服务属性后,客户端获得那些属性的方法,参考如下代码: /*获得服务器端的服务记录*/ temprecord = (servicerecord)servicefound.elementat(i); /*获得服务器端的服务记录的链接字符串并加入到聊天室的链接列表*/ chatroomlist.roomurllisti= temprecord.getconnectionurl( servicerecord.noauthenticate_noencrypt, false); /*获得服务记录的用户自定义的服务属性并加入到聊天室名的列表*/ string str =(string)(temprecord.getattributevalue(0x1234).getvalue(); chatroomlist.append(str, null); chatroomlist.roomnamelisti = str; 客户端与服务器的连接,在有线网络的 tcp/udp 链接。如果想连接某服务,知道 ip 与 port 就可以(服务器必须为运行状态) ,对应于蓝牙无线通讯来说,就得需要一 个连接字符串,蓝牙设备客户端的设备发现与服务记录的查代的最终结果与目的就是 用得到这个与服务器放的连接字符串。得到连接字符串之后,与服务器的连接一句代 码就可以完成。 /*连接服务器*/ client = (streamconnection)connector.open(connecturl); 服务器端与客户端连接后,就同有线网络的 tcp/udp 通讯方式一样了,得到数据 输入输出流,接着就可以传输数据了。 总之,蓝牙设备提供的服务是发生在服务记录数据库中的,为了方便蓝牙设备客户 端的咨询,使蓝牙设备客户端能得到连接字符串,之后就可以传输数据,进行通讯了。 .4 蓝牙五子棋实现蓝牙五子棋实现 蓝牙五子棋类结构图如图 3-3: 基于 j2me+蓝牙技术的休闲娱乐平台 - 18 - 图 3-3 waitcanvas :调用 paint()画出等待客户端或者搜索设备提示信息; gamecanvas :调用 gamecanvas.keypressed()方法处理键盘输入并实例化和绘制 gamecanvas; resultcanvas :显示游戏胜负判定结果; chess :抽象了棋盘上是否为服务器下子; btengine :抽象了游戏的棋盘和棋子以及通过调用 connectcontroller 类来收发信息; connectcontroller :主要在 btengine 类和 connectcontroller 类之间传递坐标值和服 务器判断值; engineobserver :根据服务器判断值类启动服务器和客户端并把其棋子坐标传递给 connectcontroller 类; server :主要是创建蓝牙服务和连接并等候服务,并负责服务器的信息收发; client :主要负责搜索设备和服务,并负责客户端的信息收发。 首先从 mainmenu,进入画布 gamecanvas 类,再根据启动服务器客户端的选择按 钮再逐次启动 gamecanvas 类、btengine 类、connectioncontroller 类和其选择模式的线 程,来完成蓝牙通信的初始化。再由客户端先下子,发送信息出去,建立连接。由于 游戏的主循环在
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 专题02 故事类材料作文审题技巧(教案)-2024-2025学年高考语文一轮复习之高考作文宝鉴
- 人教版九年级上册第二十一章 一元二次方程21.2 解一元二次方程21.2.1 配方法第2课时教学设计
- 九年级道德与法治上册 第1单元 感受时代脉动 第1课 认识社会巨变 第1站 我们生活的变迁教学设计 北师大版
- 纺织销售礼仪培训课件
- 七年级数学上册 第1章 有理数1.2 数轴、相反数与绝对值1.2.1 数轴教学设计 (新版)湘教版
- 2024中煤蒙陕能源销售有限公司招聘笔试参考题库附带答案详解
- 葆婴大学培训大纲
- 九年级语文上册 第四单元 17 孤独之旅教学设计 新人教版
- 2024中国铁塔股份有限公司社招+校招开启笔试参考题库附带答案详解
- 人教部编版一年级上册(道德与法治)12 早睡早起教学设计
- 幼儿园绘本故事:《再见电视机》 课件
- 光伏发电工程施工组织设计新编样本
- 山东省济南市2022年中考英语情景运用拔高练习(Word版含答案)
- 三.国际法习题之经典案例分析
- 中国传媒大学-舆论学原理、方法与应用-课件-第一章 舆论传播的源与流
- 妊娠滋养细胞疾病的护理课件
- 水下混凝土浇筑导管水密试验
- 市政工程监理规划范本(完整版)
- 污水处理站运行维护管理方案
- 小学生气象科普知识ppt课件
- 年产吨右旋糖酐的车间工艺设计
评论
0/150
提交评论