轉載請註明來自:http://blog.csdn.NET/icyfox_bupt/article/details/25487125
最近在實驗室做項目,使用了Android的藍牙開發,這裏面有好多坑..所以還是希望能記下來這些東西和大家分享,不要再走我的老路了。
先說一下背景,我是開發手機與帶藍牙的智能設備(藍牙血壓計、血糖儀、手環等)設備對接的APP。也就是說,在設備端沒有什麼可以操作的,手機負責發起數據傳輸。
- 藍牙連接,不需要
配對
由於被曾經使用藍牙的思路所誤導,一直以爲使用藍牙是必須一個配對的過程的。實際上不是這樣。搜索到設備以後,直接去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是比較好用的一個,設備都可以識別。
-
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(); } }
-
接收數據轉換
使用
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);}