栈初始化
在你做任何事之前,你需要初始化你的栈。记住,栈是一个用来控制你的蓝牙设

备的软件或固件。栈初始化由一系列工作组成,但是它的最主要目的是获得准备

无线通信的蓝牙设备。不同的厂商处理不同的初始化工作,所以我们将用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是用来通信的串行端口操作模式的协议层,但是这两个东西经常被当作同样来使用。