Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 初級開發 >> Android藍牙API之BluetoothSocket類

Android藍牙API之BluetoothSocket類

編輯:初級開發

前面兩篇文章中我們提到了有關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的具體實現。 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved