Java藍牙API概述
Java藍牙API依賴java通用連線框架,一直一來這成為java藍牙API套用的一個局限。但是,人們建議將GCF加入到J2SE中。Java藍牙API使得訪問更多的系統成為可能。
Java藍牙API定義了兩個包:一個是Java藍牙API的核心javax.bluetooth,另一個是用於對象交換協定的javax.obex(OBEX)。
根據JSR82規範,所有潛在藍牙系統都必須支持藍牙控制中心(BCC),該控制中心是一個控制臺,它的作用類似於可以讓用戶或OEM給堆疊中的某些配置參數定義具體值得應用程式,特別是,它將套用於堆疊初始化中。
Java藍牙API組件
任何藍牙套用都有以下這些組件:堆疊初始化組件,設備管理組件,設備發現組件,服務發現組件和通訊組件
堆疊初始化
在開始無線通訊之前,你需要以銷售商預訂的方式初始化藍牙設備。(具體的堆疊初始化步驟超出了藍牙API規範的範圍。)
在一篇關於java與藍牙技術起步的java.net文章中,BruceHopkins(java與藍牙技術的作者)向我們介紹了在Atinavjava藍牙開發平台上是如何通過一系列設定完成初始化工作的。(見列表A)在JSR82規範不包含這些調用,這一點很重要,因為其它的JSR82實現可能包括其它的初始化堆疊的方式。
設備管理
服務發現允許你發現附近的服務,而不管哪一台設備提供的該服務。DiscoveryAgent提供的方法可以用來發現藍牙服務設備上的服務,並初始化服務發現事務。在服務可以被發現以前,必須首先在藍牙服務設備上註冊或廣播該服務。服務設備負責完成很多任務,包括創建描述所提供的服務的服務記錄,接受來自客戶端的連線,向服務設備的服務發現資料庫(SDDB)添加新的服務記錄。總之,它的工作類似於web伺服器。列表D是服務註冊的一個例子。
通訊
兩台設備必須共享通用的通訊協定才能通訊。為了套用能夠訪問更多的藍牙服務,藍牙javaAPI提供了這樣一個機制,它允許連線到使用RFCOMM,L2CAP,或OBEX協定的任何服務。如果服務使用了位於上面協定之上其它的協定(例如TCP/IP),只有在套用中利用CLDC通用連線框架實現額外的協定,才可以訪問該服務。
用於服務記錄的URL包括數字和符號,大體是這樣的結構:
btspp://508031205080110F1B1B1D1C100:8.它的意思是客戶應該使用藍牙串口框架來建立到地址為508031205080110F1B1B1D1C100的設備的8號服務。設備地址和計算機的物理地址相似,列表E顯示了簡單的RFCOMM連線。
程式列表
列表A:
importjavax.bluetooth.*;
importjavax.microedition.io.*;
importcom.atinav.bcc.*;
...
BCC.setPortName("COM1");
BCC.setBaudRate(57600);
BCC.setConnectable(true);
BCC.setDiscoverable(DiscoveryAgent.GIAC);
...
列表B:
...
//retrievethelocalBluetoothdeviceobject
LocalDevicelocal=LocalDevice.getLocalDevice();
//retrievethenameofthelocalBluetoothdevice
Stringname=local.getFriendlyName();
...
列表C:
...
LocalDevicelocaldevice=LocalDevice.getLocalDevice();
DiscoveryAgentdiscoveryAgent=localdevice.getDiscoveryAgent();
discoveryAgent.startInquiry(DiscoveryAgent.GIAC,this);
...
列表D:
...
//Serviceregistration
//invokeConnector.openwithaserverconnectionURLargument
StreamConnectionNotifierservice=(StreamConnectionNotifier)Connector.open("someURL");
//Obtaintheservicerecordcreatedbytheserverdevice
ServiceRecordsr=local.getRecord(service);
//Indicatethattheserviceisreadytoacceptaclientconnection.acceptAndOpen()blocks
//untilaclientconnects.
StreamConnectionconnection=(StreamConnection)service.acceptAndOpen();
//DOSOMEEXCHANGEHERE
service.close();
列表E
...
Stringurl=serviceRecord.getConnectionURL(record.NOAUTHENTICATE_NOENCRYPT,false);
//openaconnectiontotheserver
StreamConnectionconnection=(StreamConnection)Connector.open(url);
//Send/receivedata
try{
bytebuf[]=newbyte[200];
Stringmsg="Testmessage";
InputStreamis=connection.openInputStream();
OutputStreamos=connection.openOutputStream();
//senddatatotheserver
os.write(msg.getBytes);
//readdatafromtheserver
is.read(buf);
connection.close();
}catch(IOExceptione){
e.printStackTrace();
}