获取附近信标的 UUID

Getting UUID of nearby beacon

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

1) 在这段代码中我制作了一个扫描仪 class 并开始扫描我的片段并获取地址(我认为它是 BLE 设备的 mac 地址)和 RSSI 但是当我想得到 UUID 它说它是 null

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) {
    }

}

真不知道怎么回事...

对于使用 Android 信标库的第二个清单,问题是您从不调用 beaconManager.bind(this),因此,您永远不会收到 onBeaconServiceConnect 和 none 执行该方法中的代码。

由于您使用的是 Fragment 而不是 Activity,请注意您实际实现了 all BeaconConsumer 的方法,class 和 onBeaconServiceConnect 方法必须执行。有关该链接的更多信息,请参阅

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