標籤:android bluetooth
轉載請註明來自: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);}