Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android藍牙開發的一些經驗

Android藍牙開發的一些經驗

編輯:關於Android編程

 

最近在實驗室做項目,使用了Android的藍牙開發,這裡面有好多坑..所以還是希望能記下來這些東西和大家分享,不要再走我的老路了。


先說一下背景,我是開發手機與帶藍牙的智能設備(藍牙血壓計、血糖儀、手環等)設備對接的APP。也就是說,在設備端沒有什麼可以操作的,手機負責發起數據傳輸。

  1. 藍牙連接,不需要配對

    由於被曾經使用藍牙的思路所誤導,一直以為使用藍牙是必須一個配對的過程的。實際上不是這樣。搜索到設備以後,直接去connect設備而不去配對,目前在我這裡是沒問題的,搜索到設備以後,可以直接用一下代碼進行連接:

        final String SPP_UUID = 00001101-0000-1000-8000-00805F9B34FB;     
        UUID uuid = UUID.fromString(SPP_UUID);     
        BluetoothSocket socket;      
        socket = device.createInsecureRfcommSocketToServiceRecord(uuid);
    
        adapter.cancelDiscovery();  
        socket.connect(); 
    
       這裡的UUID是比較好用的一個,設備都可以識別。
    
    1. startDiscovey有可能啟動失敗

      一般程序中會有兩步:開啟藍牙開始尋找設備。之前我寫的代碼是用戶按下按鈕就直接順序執行這兩步,導致的結果就是經常性搜索失敗。仔細看了一下API,發現adapter.startDiscovery()函數是有一個boolean返回值的,也就是說如果啟動失敗就返回false。這就解釋了為什麼會啟動失敗了:順序執行了開啟藍牙-尋找設備的步驟,但是由於藍牙還沒有完全打開,就開始尋找設備,導致尋找失敗。於是最後我把代碼改成了這樣,問題解決:

      adapter = BluetoothAdapter.getDefaultAdapter();     
      if (adapter == null)     
      {     
          // 設備不支持藍牙      
      }     
      // 打開藍牙      
      if (!adapter.isEnabled())     
      {     
          adapter.enable();
          adapter.cancelDiscovery();
      }    
      
      // 尋找藍牙設備,android會將查找到的設備以廣播形式發出去      
      while (!adapter.startDiscovery()){
          Log.e(BlueTooth, 嘗試失敗);
          try {
              Thread.sleep(100);
          } catch (InterruptedException e) {
              e.printStackTrace();
          }
      }
      
    2. 接收數據轉換

      使用socket.getInputStream接收到的數據是字節流,這樣的數據是沒法分析的。又由於一般來說廠家給的協議都是類似於FA 22 89 D0這樣的十六進制數據,所以很多情況需要一個byte轉十六進制String的函數:

      public static String bytesToHex(byte[] bytes) {
      char[] hexChars = new char[bytes.length * 2];
      for ( int j = 0; j < bytes.length; j++ ) {
          int v = bytes[j] & 0xFF;
          hexChars[j * 2] = hexArray[v >>> 4];
          hexChars[j * 2 + 1] = hexArray[v & 0x0F];
      }
      return new String(hexChars);}
      
      
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved