- Stringurl=servRecord.getConnectionURL(ServiceRecord.NOAUTHENTICATE_NOENCRYPT,false);
- StreamConnectionconn=(StreamConnection)Connector.open(url);
- DataOutputStreamdos=conn.openDataOutputStream();
- dos.writeUTF("XXXXXXXXXXXXX");
String url = servRecord.getConnectionURL(ServiceRecord.NOAUTHENTICATE_NOENCRYPT,false);
StreamConnection conn = (StreamConnection)Connector.open(url);
DataOutputStream dos = conn.openDataOutputStream();
dos.writeUTF("XXXXXXXXXXXXX");
手机这边的Connetor.open()里面应该怎样写才可以跟其通讯?
J2ME里面,如果是客户端使用蓝牙,是通过一个预定义的接口DiscoveryListener实现的,要经过很多步骤才到Connector.open(url)这一步。这一步连接的实际是选定设备的选定服务。先说说接口。
这个接口涉及到4个函数需要实现。
第一个
deviceDiscovered(RemoteDevice btDevice, DeviceClass cod)
在每次发现了一个设备的时候会自动调用
第二个
inquiryCompleted(int discType)
在设备搜索已经结束的时候会自动调用
第三个
servicesDiscovered(int transID, ServiceRecord[] servRecord)
当选定好设备之后,想要搜索该设备提供的服务时,每寻找到一个服务,该方法就会自动调用
第四个
serviceSearchCompleted(int transID, int respCode)
当对该设备的服务搜寻完毕时会自动调用
除了DiscoveryListener接口之外,客户端连接还有几个类比较重要,第一是连接代理DiscoveryAgent,命令设备开始搜索周围设备的startInquiry(),命令开始搜索选定设备服务的searchService()都是通过它。第二是本地设备也就是这个客户端自己LocalDevice,连接代理就是通过它获得的。第三是RemoteDevice,就是具有蓝牙功能的周边设备。第四是SeviceRecord,就是设备所提供的服务,最后要连接的就是它。
当接口的那些方法都实现了之后,就可以通过ServiceRecord的getConnectionURL()获取连接,再通过(StreamConnection)Connector.open(url)打开连接,进行通话。
这里要提三个类,关于设备管理的,这3个类用来支持设备管理:
设备类: DeviceClass
一个DeviceClass对象代表一个设备的设备类(CoD),例如一个打印机或者一部电话。CoD包括一个主类,一个辅的类,和服务类型或服务类
本地设备类: LocalDevice
LocalDevice类标识了本地蓝牙设备。蓝牙应用程序和LocalDevice之间的关系是典型的一对一关系
远端设备类: RemoteDevice
一个RemoteDevice的实例代表了一个远端蓝牙设备。在一个蓝牙客户端应用程序可以进行服务,消费之前,它必须发送一个设备请求来发现远端设备。典型的蓝牙应用程序和远端设备之间的关系是一对多
关于UUID
先看下面的问题
打印机,还是其他什么设备。
..........
private UUID[] uuidSet;
private static final UUID ECHO_SERVER_UUID = new UUID(
"F0E0D0C0B0A000908070605040302010", false);
uuidSet = new UUID[2];
//标志我们的响应服务的UUID集合
uuidSet[0] = new UUID(0x1101);
uuidSet[1] = ECHO_SERVER_UUID;
..............
transIDs[i] = discoveryAgent.searchServices(null, uuidSet,
rd, this);
那个UUID数组什么意义。
UUID~就解释下他先
UUID是用户唯一ID标示,根据用户的唯一标示创建链接.
在蓝牙中,每个服务和服务属性都唯一地由"全球唯一标识符" (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对象,你可以去掉连字符。
关于如何识别一蓝牙设备是打印机,还是其他什么设备.可以参考相应API,设备管理的类里提供了相应的方法.至于更详细的部分,以及服务器怎样提供蓝牙服务等等,最好还是仔细看看J2ME提供的例程,这些例程在WTK安装目录下的apps里可以找到。
以下附上J2ME蓝牙开发的一点资料 J2ME开发无线蓝牙(Bluetooth)应用 (这个文章的原文地址我没找到)
防止那个网页丢失我转载下
应用于无线蓝牙技术标准的java APIs(JABWT),由JSR 82 规范定义,支持快速开发便捷、安全及用途广泛的蓝牙应用。无线设备生产商已对JABWT规范做出反应,他们宣布移动手机和其它产品将支持JABWT应用。
本文我们首先介绍在移动设备上进行java开发的基本原理,然后描述如何为蓝牙通讯编写java应用。
Java 蓝牙 API
Java蓝牙 API依赖java通用连接框架,一直一来这成为java 蓝牙API应用的一个局限。但是,人们建议将GCF加入到J2SE中。Java蓝牙API使得访问更多的系统成为可能。
Java蓝牙API定义了两个包:一个是Java蓝牙API的核心javax.bluetooth,另一个是用于对象交换协议的javax.obex(OBEX)。
根据JSR 82 规范,所有潜在蓝牙系统都必须支持蓝牙控制中心(BCC),该控制中心是一个控制面板,它的作用类似于可以让用户或OEM给堆栈中的某些配置参数定义具体值得应用程序,特别是,它将应用于堆栈初始化中。
任何蓝牙应用都有以下这些组件:堆栈初始化组件,设备管理组件,设备发现组件,服务发现组件和通讯组件。
堆栈初始化
在开始无线通讯之前,你需要以销售商预订的方式初始化蓝牙设备。(具体的堆栈初始化步骤超出了蓝牙API规范的范围。)
在一篇关于java与蓝牙技术起步的java.net文章中,Bruce Hopkins(java与蓝牙技术的作者)向我们介绍了在Atinav java蓝牙开发平台上是如何通过一系列设置完成初始化工作的。在JSR 82规范不包含这些调用,这一点很重要,因为其它的JSR82实现可能包括其它的初始化堆栈的方式。
设备管理
JSR82规范介绍了用于设备管理的两个类:LocalDevice 和 RemoteDevice。
LocalDevice 允许你请求获得蓝牙设备的静态信息。它依靠javax.bluetooth.DeviceClass类来获得设备类型和它所提供的服务类型。
RemoteDevice可用来获得蓝牙邻近区的设备信息(例如,某个远程蓝牙设备的地址)。它可以代表一台远程设备(例如,一台在可到达范围内的设备),并提供相应的方法来获得关于这台设备的有关信息,包括它的蓝牙地址和名称。
每个蓝牙设备有一个唯一的硬件地址,像计算机的MAC地址一样。你可以设定设备发现的级别,通过调用LocalDevice 对象中的setDiscoverable()方法可以使得其它蓝牙设备发现当前设备
设备发现
无线设备需要一种机制来允许它们发现其它的设备并访问它们的功能。核心蓝牙API的DiscoveryAgent 类和DiscoveryListener接口提供了需要的发现服务。有三种方式获得可访问设备列表。DiscoveryAgent.startInquiry()方法可将设备设置为查询模式,为了充分利用这种模式,应用必须要指定一个事件监听器来对与查询相关的事件作出反应。当查询完成或取消时,会调用DiscoveryListener.inquiryCompleted()方法。
如果一台设备不想等待发现其它的设备,可以使用DiscoveryAgent.retrieveDevices()方法来获得一个已经存在的列表。该方法或者返回一个在前面的查询中发现的设备列表,或者返回一个预知的设备列表,这些设备是由本地设备提前告诉蓝牙控制中心的它经常联系的设备。返回那种列表取决于传递的参数。最简单的一种方式,当检测到一台新的蓝牙设备时,对象需要使用DiscoveryAgent通过DiscoveryListener接口通知你。
服务发现
服务发现允许你发现附近的服务,而不管哪一台设备提供的该服务。DiscoveryAgent提供的方法可以用来发现蓝牙服务设备上的服务,并初始化服务发现事务。在服务可以被发现以前,必须首先在蓝牙服务设备上注册或广播该服务。服务设备负责完成很多任务,包括创建描述所提供的服务的服务记录,接受来自客户端的连接,向服务设备的服务发现数据库(SDDB)添加新的服务记录。总之,它的工作类似于web服务器。
通讯
两台设备必须共享通用的通讯协议才能通讯。为了应用能够访问更多的蓝牙服务,蓝牙java API提供了这样一个机制,它允许连接到使用RFCOMM, L2CAP, 或 OBEX协议的任何服务。如果服务使用了位于上面协议之上其它的协议(例如TCP/IP),只有在应用中利用CLDC通用连接框架实现额外的协议,才可以访问该服务。
用于服务记录的URL包括数字和符号,大体是这样的结构:
btspp://508031205080110F1B1B1D1C100:8。它的意思是客户应该使用蓝牙串口框架来建立到地址为508031205080110F1B1B1D1C100的设备的8号服务。设备地址和计算机的物理地址相似