Android藍芽API之BluetoothSocket類

來源:互聯網
上載者: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的具體實現。
本文轉自www.35java.com

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.