雖然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
進行連接。
感謝您的信息! – jcady