iOS CLLocationManager 未检测到 Android 信标库 iBeacon 信号发送自 Android
iOS CLLocationManager Not Detecting Android Beacon Library iBeacon Signal Sent From Android
应用目的
- 从 iOS 发送信标信号并在 Android 和 iOS 设备上检测该信号。
- 从 Android 发送信标信号并在 Android 和 iOS 设备上检测该信号。
技术
Android: Android 信标库。
- 在 Android 设备之间发送和接收的 AltBeacon 信号 (为了更准确)
- 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 使用 Android 信标库传输 iBeacon 信号,上述 CLLocationManager 委托方法在 [=94 上未检测到信标=].
代码
- 为了增加检测的机会,我已经删除了 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 设备无法通过 CoreBluetooth 检测到。您只能使用 iOS API 来检测具有以下布局的 iBeacon:
val beaconParser = BeaconParser()
.setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24")
在另一个论坛的早期回答中,我注意到 OP 正在使用添加了数据字段的布局,并建议他将其删除,但没有意识到更基本的问题,即问题中的布局使用匹配字节 beac
仅适用于 AltBeacon 格式。对于 iBeacon,您必须匹配 0215
应用目的
- 从 iOS 发送信标信号并在 Android 和 iOS 设备上检测该信号。
- 从 Android 发送信标信号并在 Android 和 iOS 设备上检测该信号。
技术
Android: Android 信标库。
- 在 Android 设备之间发送和接收的 AltBeacon 信号 (为了更准确)
- 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 使用 Android 信标库传输 iBeacon 信号,上述 CLLocationManager 委托方法在 [=94 上未检测到信标=].
代码
- 为了增加检测的机会,我已经删除了 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 设备无法通过 CoreBluetooth 检测到。您只能使用 iOS API 来检测具有以下布局的 iBeacon:
val beaconParser = BeaconParser()
.setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24")
在另一个论坛的早期回答中,我注意到 OP 正在使用添加了数据字段的布局,并建议他将其删除,但没有意识到更基本的问题,即问题中的布局使用匹配字节 beac
仅适用于 AltBeacon 格式。对于 iBeacon,您必须匹配 0215