栈初始化
在你做任何事之前,你需要初始化你的栈。记住,栈是一个用来控制你的蓝牙设
备的软件或固件。栈初始化由一系列工作组成,但是它的最主要目的是获得准备
无线通信的蓝牙设备。不同的厂商处理不同的初始化工作,所以我们将用Atinav
JAVA Bluetooth SDK来适用如何初始化一个栈。
import javax.bluetooth.*;
import javax.microedition.io.*;
import com.atinav.BCC;
public class WirelessDevice implements DiscoveryListener {
LocalDevice localDevice = null;
public WirelessDevice (){
//setting the port number using Atinav's BCC
BCC.setPortName("COM1");
//setting the baud rate using Atinav's BCC
BCC.setBaudRate(57600);
//connectable mode using Atinav's BCC
BCC.setConnectable(true);
//Set discoverable mode using Atinav's BCC
BCC.setDiscoverable(DiscoveryAgent.GIAC);
try{
localDevice = LocalDevice.getLoaclDevice();
}
catch (BluetoothStateException exp) {
}
// implementation of methods in DiscoveryListener class
// of javax.bluetooth goes here
// now do some work
}
}
设备管理
LocalDevice类
RemoteDevice类
JAVA Bluetooth标准中让你用来进行设备管理的两个主类,可查询一些你的本地
蓝牙设备和区域内设备的静态信息。
静态方法getLocalDevice(),返回一个供你使用的LocalDevice实例对象
LocalDevice对象上的getBluetoothAddress(),获得你的蓝牙无线装置的唯一地
址
LocalDevice对象上的静态方法setDiscoverable(),设备允许其它的蓝牙设备发
现到该设备
当获得一个LocalDevice对象后,调用LocalDeevice.getDiscoveryAgent()实例化
一个DiscoveryAgent对象。
首先,本地对象实现DiscoveryListener接口;为了我启动发现进程,调用你的Di
scoveryAgent对象的startInquiry()方法,此方法为非阻塞式的,所以你能够去
干其它的事情,一边等待其它的蓝牙设备被发现。
当蓝牙设备被发现后,JVM会调用实现DiscoveryListener接口类的deviceDiscove
red()方法,此方法会传递给你一个代表被查询的设备的RemoteDevice对象
服务发现
DiscoveryAgent类的searchServices()方法允许你搜索RemoteDevice对象上的服
务。当服务查找到,而且你的对象实现了DiscoveryListener接口,JVM会调用ser
vicesDiscovered()方法。此回调方法也会传入属于你查找到的服务的一个Servic
eRecord对象。当创建了ServiceRecord对象后,将其连接至RemoteDevice。
String connectionURL = servRecord[i].getConnectionURL(0, false);
服务注册Service Registration
当一个蓝牙客户端设备能够在一个蓝牙服务器设备用服务发现之前,蓝牙服务器
需要在服务发现数据库中(Service Discovery database, SDDB)中注册它的服务
数据库中,此过程叫做服务注册。这一节将讨论一个蓝牙设备服务注册包括一些
什么,同时我也会给出一个需要完成这项工作的类纲要。
注意:在点对点的应用中,比如一个文件传输或聊天应用,记住任何设备都是客
户端或服务器,为了处理同时为服务发现和服务注册的情况,因此你需要将这些
功能(包括客户端和服务器)合并入你的程序中。下面是一个包含了获得你注册
的服务和存入SDDB中的情景。
1、调用Connector.open()并将Connection的结果放入到一个StreamConnectionNo
tifier对象。一个Connector.open()创建一个ServiceRecord并设定一些属性;
2、用LocalDevice对象和StreamConnectionNotifier来获得系统创建的ServiceRe
cord;
3、在ServiceRecord中增加或修改属性;[可选]
4、用StreamConnectionNotifier调用acceptAndOpen()方法,并等待蓝牙客户端
发现并连接服务;
a、系统在SDDB中创建一个服务记录。
5、等待直到一个客户端连接;
6、当服务器端准备退出,在StreamConnectionNotifier上调用close()
a、系统移除SDDB中的服务记录
StreamConnectNotifier和Connector都来自于J2ME平台的javax.microedition.io
包中。完成上面任务的代码片断显示如下:
// lets name our variables
StreamConnectionNotifier notifier = null;
StreamConnection sconn = null;
LocalDevice localdevice = null;
ServiceRecord servicerecord = null;
// step #1
// the String url will already be defined with the
// correct url parameters
notifier = (StreamConnectionNotifier)Connector.open(url);
// step #2
// we will get the LocalDevice if not already done so
localdevice = LocalDevice.getLocalDevice();
servicerecord = localdevice.getRecord(notifier);
// step #3 is optional
// step #4
// this step will block the current thread until
// a client responds this step will also cause the
// service record to be stored in the SDDB
notifier.acceptAndOpen();
// step #5
// just wait...
// assume the client has connected and you are ready to exit
// step #6
// this causes the service record to be removed
// from the SDDB
notifier.close();
你需要在蓝牙里面做的服务发现如上,下一步是通信
通信
蓝牙是一个通信协议,因此你将如何与它通信呢?JAVA Bluetooth API给你三种方法来发送和接收数据。但为立刻起见,我们实现其中的一个:RFCOMM
注意:RFCOMM是用来通信的串行端口操作模式的协议层,但是这两个东西经常被当作同样来使用。
[未完...]
[Original Text]:
http://today.java.net/pub/a/today/2004/07/27/bluetooth.html