JAVA與藍牙起步(Getting Started with Java and Bluetooth)
Posted on 2007-04-26 00:39 tanzek 閱讀(1858) 評論(0) 編輯 收藏 所屬分類: 技術學習棧初始化
在你做任何事之前,你需要初始化你的棧。記住,棧是一個用來控制你的藍牙設
備的軟件或固件。棧初始化由一系列工作組成,但是它的最主要目的是獲得準備
無線通信的藍牙設備。不同的廠商處理不同的初始化工作,所以我們將用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