前面兩篇文章中我們提到了有關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類 的兩篇文章中有講到,這裡不再贅述,相關的範例程式碼如下:
private class ConnectThread extends Thread {
private final BluetoothSocket cwjSocket;
private final BluetoothDevice cwjDevice;
public ConnectThread(BluetoothDevice device) {
BluetoothSocket tmp= null;
cwjDevice= device;
try {
tmp= device.createRfcommSocketToServiceRecord(CWJ_UUID); //用戶端建立
} catch (IOException e) { }
cwjSocket= tmp;
}
public void run() {
myAdapter.cancelDiscovery(); //取消發現遠程裝置,這樣會降低系統效能
try {
cwjSocket.connect();
} catch (IOException connectException) {
try {
cwjSocket.close();
} catch (IOException closeException) { }
return;
}
manageConnectedSocket(cwjSocket); //管理一個已經串連的RFCOMM通道在單獨的線程。
}
public void cancel() {
try {
cwjSocket.close();
} catch (IOException e) { }
}
}
經過上面的介紹我們可以看到在Android平台上使用藍芽通訊相對比較方便和簡單,有關資料的具體通訊我們將在下次Android藍芽API之BluetoothSocket類(2) 講到manageConnectedSocket的具體實現。
本文轉自www.35java.com