2016-03-28 47 views
0

我的應用程序不使用信標(至少不是常用含義)。用例是連續後臺掃描匹配特定格式的BLE外設,然後連接到這些外設併發送/接收數據並斷開連接(可能不止一次)。使用AltBeacon作爲BLE掃描/連接的包裝

Android上的藍牙LE的穩定性和可靠性讓人不太滿意,特別是如果支持早期的API版本(18+),就像我一樣。 AltBeacon似乎是一個經驗豐富的庫,可處理Android藍牙LE管理中的許多奇怪邊緣情況和複雜情況(至少在掃描端)。我想利用這個庫來掃描和識別我的外設,然後自己連接它們。有誰知道我可以如何實現這一目標?

回答

2

雖然Android信標庫的設計並不是爲了掃描藍牙服務,但在某些情況下,它可以很方便地用於此目的。然而,預先警告說,這樣做違背了它的設計理念,並迫使你做一些非常醜陋的黑客攻擊。如果這樣的黑客讓你的眼睛流血,那就不要再讀了!對於那些誰受得了,這裏就是你需要做的:

  • 設置一盞明燈解析器將尋找一個GATT服務UUID。您必須在服務UUID中的幾個字節上進行匹配,並且庫的匹配器一次只能匹配幾個字節。因此,如果您的GATT服務UUID爲00010203-0405-0607-0809-0a0b0c0d0e0f,則應該記錄前三個字節:00,01,02並將它們用作匹配表達式。由於匹配表達式具有不同的字節順序,因此必須將字節的順序顛倒爲02,01,00。所以,你最終用這樣的代碼:

    BeaconManager beaconManager = org.altbeacon.beacon.BeaconManager.getInstanceForApplication(this); 
    beaconManager.getBeaconParsers().add(new BeaconParser(). 
         setBeaconLayout("m:0-2=020100,i:0-15l,p:15-15")); 
    
  • 開始測距根據您完全的GATT服務UUID相匹配的區域。 (同樣,你必須替換您的服務的UUID。):

    Region gattServiceRegion = new Region("gattServiceRegion", 
         Identifier.parse("00010203-0405-0607-0809-0a0b0c0d0e0f"), null, null); 
    beaconManager.setRangeNotifier(this); 
    beaconManager.startRangingBeaconsInRegion(region); 
    

現在圖書館將每次看到廣告爲GATT服務UUID時間做一個回調到您的類didRangeBeaconsInRegion方法。所以你知道它在附近,你可以獲得圖書館的所有節電,後臺啓動和其他好處。現在的問題是,圖書館沒有公開提及connectGatt(...)所需的原始BluetoothDevice對象。

所以,除非您修改庫源代碼,否則只要知道信標只是爲了獲取此引用,您仍然必須使用原始掃描API。無論如何,您必須決定使用庫是否值得所有這些麻煩,因爲您必須使用原始掃描API來獲取BluetoothDevice進行連接。

+0

感謝您的信息! – jcady