Android藍牙開發的一些經驗

轉載請註明來自:http://blog.csdn.NET/icyfox_bupt/article/details/25487125

最近在實驗室做項目,使用了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);}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章