Flutter:IOS 到 IOS 广播信标不工作
Flutter : IOS to IOS Broadcast Beacon not working
我目前正在构建一个应用程序,将我的设备变成一个 Beacon,同时扫描其他 Beacon。
所以我可以跟踪我接触过的信标。
问题
目前我已经在以下场景中测试了这段代码:
- Android 到 Android - 广播和扫描 - 运作良好
- Android 至 IOS - 双向广播和扫描 - 运作良好
- IOS 到 IOS - 不工作(当我从 IOS 设备广播 UUID 时,我可以在 Android 设备中看到 UUID,但看不到 UUID在任何 IOS 设备中。)
- 我在 4 台设备(2 Android 和 2 IOS)中安装了这段代码。现在所有 4 台设备都在广播不同的 UUID 并同时收听。
- 在 Android 设备中,我看到另一个 Android 设备的 1 个 UUID 和 IOS 设备的 2 个 UUID
- 在 IOS 设备中,我看到 2 个 Android UUID,但我看不到另一个 IOS 设备 UUID。
这很奇怪,我需要帮助解决这个问题!
我目前已经实现了 2 个包来实现此功能:
(1) 广播
beacon_broadcast: https://pub.dev/packages/beacon_broadcast
version : 0.2.1
(2) 扫描其他信标
flutter_blue: https://pub.dev/packages/flutter_blue
version : 0.6.3+1
这些是我的代码的一部分
(1) 用于广播
String UUID = 'DYNAMIC_UUID_FOR_EACH_DEVICE';
static const MAJOR_ID = 1;
static const MINOR_ID = 30;
static const TRANSMISSION_POWER = -59;
static const IDENTIFIER = 'com.example.myDeviceRegion';
static const LAYOUT = 'm:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24';
static const MANUFACTURER_ID = 0x004c;
BeaconBroadcast beaconBroadcast = BeaconBroadcast();
beaconBroadcast
.setUUID(UUID)
.setMajorId(MAJOR_ID)
.setMinorId(MINOR_ID)
.setTransmissionPower(TRANSMISSION_POWER)
.setIdentifier(IDENTIFIER)
.setLayout(LAYOUT)
.setManufacturerId(MANUFACTURER_ID);
.start();
(2) 用于扫描
FlutterBlue flutterBlue = FlutterBlue.instance;
flutterBlue.startScan(timeout: Duration(seconds: 30));
flutterBlue.scanResults.listen((List<ScanResult> results) {
print('scanningListen...');
for (ScanResult result in results) {
result.advertisementData.manufacturerData.forEach((item, hexcodeAsArray) => {
print("calculated UUID String : " + calculateHexFromArray(v));
_addToScanResult(calculateHexFromArray(v));
});
}
}
String calculateHexFromArray(decimalArray) {
String uuid = '';
decimalArray.forEach((i) => {uuid += i.toRadixString(16).padLeft(2, '0')});
String uuid1 = uuid.substring(4, uuid.length - 12);
return uuid1.toUpperCase();
}
遗憾的是,您无法使用 FlutterBlue 检测 iOS 上的 iBeacon 数据包。
为什么? FlutterBlue 使用原始蓝牙扫描来检测信标,这意味着在 iOS 上使用原生 CoreBluetooth 扫描 APIs。 Apple 阻止 CoreBluetooth APIs 读取任何可解码为 iBeacon 广告的蓝牙广告的原始字节。虽然这听起来很疯狂,但很可能是出于 Apple 误导的安全考虑。在我的博客 post 中阅读更多内容:CoreBluetooth Doesn't Let You See iBeacons
解决此问题的两个选项:
切换到使用 AltBeacon 格式。只需更改 LAYOUT = 'm:2-3=beac,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25';
和 MANUFACTURER_ID = 0x0118;
这会起作用,但缺点是只能在前台 iOS 检测到广告。
切换到在 iOS 上使用不同的检测库,该检测库使用 CoreLocation(唯一 API 允许在 iOS 上检测 iBeacon)而不是 CoreBluetooth。这意味着放弃 FlutterBlue,转而使用 FlutterBeacon 或类似的东西。
我目前正在构建一个应用程序,将我的设备变成一个 Beacon,同时扫描其他 Beacon。 所以我可以跟踪我接触过的信标。
问题
目前我已经在以下场景中测试了这段代码:
- Android 到 Android - 广播和扫描 - 运作良好
- Android 至 IOS - 双向广播和扫描 - 运作良好
- IOS 到 IOS - 不工作(当我从 IOS 设备广播 UUID 时,我可以在 Android 设备中看到 UUID,但看不到 UUID在任何 IOS 设备中。)
- 我在 4 台设备(2 Android 和 2 IOS)中安装了这段代码。现在所有 4 台设备都在广播不同的 UUID 并同时收听。
- 在 Android 设备中,我看到另一个 Android 设备的 1 个 UUID 和 IOS 设备的 2 个 UUID
- 在 IOS 设备中,我看到 2 个 Android UUID,但我看不到另一个 IOS 设备 UUID。
这很奇怪,我需要帮助解决这个问题!
我目前已经实现了 2 个包来实现此功能:
(1) 广播
beacon_broadcast: https://pub.dev/packages/beacon_broadcast version : 0.2.1
(2) 扫描其他信标
flutter_blue: https://pub.dev/packages/flutter_blue version : 0.6.3+1
这些是我的代码的一部分
(1) 用于广播
String UUID = 'DYNAMIC_UUID_FOR_EACH_DEVICE';
static const MAJOR_ID = 1;
static const MINOR_ID = 30;
static const TRANSMISSION_POWER = -59;
static const IDENTIFIER = 'com.example.myDeviceRegion';
static const LAYOUT = 'm:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24';
static const MANUFACTURER_ID = 0x004c;
BeaconBroadcast beaconBroadcast = BeaconBroadcast();
beaconBroadcast
.setUUID(UUID)
.setMajorId(MAJOR_ID)
.setMinorId(MINOR_ID)
.setTransmissionPower(TRANSMISSION_POWER)
.setIdentifier(IDENTIFIER)
.setLayout(LAYOUT)
.setManufacturerId(MANUFACTURER_ID);
.start();
(2) 用于扫描
FlutterBlue flutterBlue = FlutterBlue.instance;
flutterBlue.startScan(timeout: Duration(seconds: 30));
flutterBlue.scanResults.listen((List<ScanResult> results) {
print('scanningListen...');
for (ScanResult result in results) {
result.advertisementData.manufacturerData.forEach((item, hexcodeAsArray) => {
print("calculated UUID String : " + calculateHexFromArray(v));
_addToScanResult(calculateHexFromArray(v));
});
}
}
String calculateHexFromArray(decimalArray) {
String uuid = '';
decimalArray.forEach((i) => {uuid += i.toRadixString(16).padLeft(2, '0')});
String uuid1 = uuid.substring(4, uuid.length - 12);
return uuid1.toUpperCase();
}
遗憾的是,您无法使用 FlutterBlue 检测 iOS 上的 iBeacon 数据包。
为什么? FlutterBlue 使用原始蓝牙扫描来检测信标,这意味着在 iOS 上使用原生 CoreBluetooth 扫描 APIs。 Apple 阻止 CoreBluetooth APIs 读取任何可解码为 iBeacon 广告的蓝牙广告的原始字节。虽然这听起来很疯狂,但很可能是出于 Apple 误导的安全考虑。在我的博客 post 中阅读更多内容:CoreBluetooth Doesn't Let You See iBeacons
解决此问题的两个选项:
切换到使用 AltBeacon 格式。只需更改
LAYOUT = 'm:2-3=beac,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25';
和MANUFACTURER_ID = 0x0118;
这会起作用,但缺点是只能在前台 iOS 检测到广告。
切换到在 iOS 上使用不同的检测库,该检测库使用 CoreLocation(唯一 API 允许在 iOS 上检测 iBeacon)而不是 CoreBluetooth。这意味着放弃 FlutterBlue,转而使用 FlutterBeacon 或类似的东西。