获取附近信标的UUID

时间:2019-09-05 14:45:00

标签: android kotlin bluetooth-lowenergy beacon altbeacon

我有一个应用程序,我想扫描附近的信标并获取其RSSI,UUID,主要和次要信息。为了测试我的代码,我曾经在另一台设备上使用Beacon Simulator应用程序制作了虚拟信标。我检查了几种方法,但都无法正常工作:

1)在这段代码中,我制作了一个扫描程序类,并在片段中开始扫描并获取地址(我认为这是BLE设备的mac地址)和RSSI,但是当我想获取UUID时,它说它为空

private val mLeScanCallback = BluetoothAdapter.LeScanCallback { device, rssi, scanRecord ->
    if (rssi > signalStrength) {
        mHandler.post{
            val uuid : String
            if(device.uuids != null){
                uuid = device.uuids[0].uuid.toString()
            }
            else{
                uuid = "nullll"
                scanRecord
            }
            Log.i("scan" , "device founded -> address:" + device.address + " name: " + device.name +" uuid: " + uuid + " RSSI: " + rssi + " type: " + device.type)
        }
    }
}

并在我的片段中调用此函数进行扫描:

private fun scanLeDevice(enable: Boolean) {
    if (enable && !isScanning) {
        Log.i("scan" , "starting scan ...")

        // Stops scanning after a pre-defined scan period.
        mHandler.postDelayed({
            Log.i("scan" , "stopping scan ...")

            isScanning = false
            mBluetoothAdapter.stopLeScan(mLeScanCallback)

            stopScan()
        }, scanPeriod)

        isScanning = true
        mBluetoothAdapter.startLeScan(mLeScanCallback)
    } else {
        isScanning = false
        mBluetoothAdapter.stopLeScan(mLeScanCallback)
    }
}

2)我检查的第二种方法是在片段中使用此功能,但是什么也没发生,也没有检测到信标:

private val beaconManager = BeaconManager.getInstanceForApplication(MainApplication.applicationContext())



override fun onBeaconServiceConnect() {
    beaconManager.removeAllRangeNotifiers()
    beaconManager.addRangeNotifier(object : RangeNotifier {
        override fun didRangeBeaconsInRegion(beacons: Collection<Beacon>, region: Region) {
            if (beacons.size > 0) {
                Log.i(TAG, "The first beacon I see is about " + beacons.iterator().next().getDistance() + " meters away.")
            }
        }
    })

    try {
        beaconManager.startRangingBeaconsInRegion(Region("myRangingUniqueId", null, null, null))
    } catch (e: RemoteException) {
    }

}

我真的不知道怎么了...

1 个答案:

答案 0 :(得分:0)

对于使用Android Beacon库的第二个列表,问题在于您永远不会调用beaconManager.bind(this),因此,您永远不会得到对onBeaconServiceConnect的回调,并且该方法中的任何代码都不会执行

由于您使用的是片段而不是活动,因此请务必实际实现BeaconConsumer all 方法,带有onBeaconServiceConnect方法的类必须实现。有关该链接的更多信息,请参见here

最后,如果您正在寻找iBeacon发射机,则必须设置信标布局。执行此操作的Java代码是beaconManager.getBeaconParsers().add(new BeaconParser().setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"));