Android藍芽API之BluetoothSocket類(1)
前面兩篇文章中我們提到了有關Android平臺藍芽的配對、發現、啟用等操作,本文開始通過BluetoothSocket類建立有關藍芽通訊的套接字。從Android 2.0開始支援這一特性,藍芽和LAN一樣通過MAC地址來識別遠端裝置,建立完通訊連線RFCOMM通道後以輸入、輸出流方式通訊。
一、連線裝置
藍芽通訊分為server伺服器端和client客戶端,它們之間使用BluetoothSocket 類的不同方法來獲取資料,
1. 作為伺服器
如果一個裝置需要和兩個或多個裝置連線時,就需要作為一個server來傳輸,在android中提供了BluetoothServerSocket類來處理使用者發來的資訊,伺服器端套接字在接受(accepted) 一個客戶發來的BluetoothSocket時作出相應的響應。示例程式碼如下:
private class AcceptThread extends Thread {
private final BluetoothServerSocket cwjServerSocket;
public AcceptThread() {
BluetoothServerSocket tmp = null; //使用一個臨時物件代替,因為cwjServerSocket定義為final
try {
tmp = myAdapter.listenUsingRfcommWithServiceRecord(NAME, CWJ_UUID); //服務僅監聽
} catch (IOException e) { }
cwjServerSocket = tmp;
}
public void run() {
BluetoothSocket socket = null;
while (true) { //保持連線直到異常發生或套接字返回
try {
socket = cwjServerSocket.accept(); //如果一個連線同意
} catch (IOException e) {
break;
}
if (socket != null) {
manageConnectedSocket(socket); //管理一個已經連線的RFCOMM通道在單獨的執行緒。
cwjServerSocket.close();
break;
}
}
}
public void cancel() { //取消套接字連線,然後執行緒返回
try {
cwjServerSocket.close();
} catch (IOException e) { }
}
}
在這裡android開發網提醒大家需要注意的是伺服器一般處理多個任務不嫩阻塞,必須使用非同步的方法這裡我們開了一個執行緒,目前Android的虛擬機器上層沒有提供I/O模型,這裡我們以後會講解高負載情況下效能優化解決方案。
2. 作為客戶端
以便初始化一個連線到遠端裝置,首先必須獲取本地的BluetoothDevice物件,相關的方法在我們 Android藍芽API之BluetoothAdapter類 的兩篇文章中有講到,這裡不再贅述,相關的示例程式碼如下:
privateclassConnectThreadextendsThread{privatefinalBluetoothSocket
cwjDevice= device;try{ tmp= device.createRfcommSocketToServiceRecord(CWJ_UUID); //客戶端建立
}catch(IOException e){}
cwjSocket= tmp;}publicvoid run(){ myAdapter.cancelDiscovery(); //取消發現遠端裝置,這樣會降低系統性能
try{ cwjSocket.connect();}catch(IOException connectException){try{
cwjSocket.close();}catch(IOException closeException){}return;} manageConnectedSocket(cwjSocket); //管理一個已經連線的RFCOMM通道在單獨的執行緒。
}publicvoid cancel(){try{
cwjSocket.close();}catch(IOException e){}}}
經過上面的介紹我們可以看到在Android平臺上使用藍芽通訊相對比較方便和簡單,有關資料的具體通訊我們將在下次Android藍芽API之BluetoothSocket類(2) 講到manageConnectedSocket的具體實現。