获取附近信标的 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"));
我有一个应用程序,我想扫描附近的信标并获取它们的 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"));