Android藍芽API之BluetoothSocket類(1)__Android

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.