iOS CLLocationManager未检测到安卓信标库iBeacon信号从安卓发送



应用程序用途

  1. 从iOS传输信标信号,并在Android上检测该信号;iOS设备
  2. 从安卓系统传输信标信号,并在安卓系统上检测该信号;iOS设备

技术

安卓系统:安卓信标库。

  • AltBeacon信号在Android设备之间发送和接收(为了更好的准确性(
  • iBeacon信号从iOS发送并在Android上接收
  • iBeacon信号从Android发送并在iOS上接收(不工作(

iOS:CoreLocation CLLocationManager iBeacon。

  • iBeacon信号从iOS发送并在iOS上接收
  • iBeacon信号从iOS发送并在Android上接收
  • iBeacon信号从Android发送并在iOS上接收(不工作(

问题

  • 在两个平台上使用相同的UUID,当从iOS传输iBeacon信号时,会使用CLLocationManager委托方法在另一个iOS设备上检测到该信号
locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion)

使用相同的UUID使用Android Beacon库从Android传输iBeacon信号,iOS上的上述CLLocationManager委托方法不会检测到信标

守则

  • 为了增加检测的机会,我删除了iOS端对Major和Minor值的要求,以防止iOS因Major值和Minor值不匹配而过滤掉Beacon信号的可能性
  • 是的,我尝试过添加Major和Minor值,但没有成功
  • 我也尝试过使用以下方法对信标进行测距:
func startRangingBeacons(satisfying constraint: CLBeaconIdentityConstraint)

在iOS上检测

var locationManager: CLLocationManager!
var localBeaconUUID = "578f4eba-a16e-11ea-bb37-0242ac130002"
let beaconIdentifier = "MyBeacon"
override func viewDidLoad() {
locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.requestAlwaysAuthorization()
}
func startScanning() {
let uuid = UUID(uuidString: localBeaconUUID)!
let beaconRegion = CLBeaconRegion(uuid: uuid, identifier: beaconIdentifier)
locationManager.startMonitoring(for: beaconRegion)
locationManager.startRangingBeacons(in: beaconRegion)
}
func locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion) {
print("Ranged beacons: (beacons.count)")
}

在Android上传输iBeacon

private val uuid = "578f4eba-a16e-11ea-bb37-0242ac130002"
fun transmitBeacon() {
val beacon = Beacon.Builder()
.setId1(uuid)
.setId2("1")
.setId3("1")
.setManufacturer(0x004c)
.setTxPower(-59)
.setDataFields(listOf(0L))
.build()
val beaconParser = BeaconParser()
.setBeaconLayout("m:2-3=beac,i:4-19,i:20-21,i:22-23,p:24-24")
val beaconTransmitter = BeaconTransmitter(applicationContext, beaconParser)
beaconTransmitter.startAdvertising(beacon)
}

此处显示的布局:

val beaconParser = BeaconParser()
.setBeaconLayout("m:2-3=beac,i:4-19,i:20-21,i:22-23,p:24-24")

适用于AltBeacon,iOS设备无法通过核心蓝牙检测到。你只能使用iOS API来检测iBeacon,它有这样的布局:

val beaconParser = BeaconParser()
.setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24")

在另一个论坛的早期回答中,我注意到OP使用了一个添加了数据字段的布局,并建议他删除它,但没有意识到更根本的问题,即问题中的布局使用了仅适用于AltBeacon格式的匹配字节beac。对于iBeacon,您必须在0215上匹配

最新更新