1. 程式人生 > >Android藍芽API之BluetoothSocket類(1)

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

cwjSocket;privatefinalBluetoothDevice cwjDevice;publicConnectThread(BluetoothDevice device){BluetoothSocket tmp=null; 
        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的具體實現。