繁体   English   中英

Flutter:IOS 到 IOS 广播信标不起作用

[英]Flutter : IOS to IOS Broadcast Beacon not working

我目前正在构建一个应用程序,将我的设备变成 Beacon,同时扫描其他 Beacon。 所以我可以跟踪我接触过的信标。


问题

目前我已经在以下场景中测试了这段代码:

  1. Android TO Android - 广播和扫描 - 运行良好
  2. Android 到 IOS - 广播和扫描两种方式 - 运行良好
  3. IOS 到 IOS - 不工作(当我从 IOS 设备广播 UUID 时,我可以在 Android 设备中看到 UUID,但在任何 IOS 设备中都看不到 UUID。)

  • 我在 4 个设备(2 个 Android 和 2 个 IOS)中安装了这段代码。 现在所有 4 个设备都在广播不同的 UUID 并同时收听。
  • 在 Android 设备中,我看到另一个 Android 设备的 1 个 UUID 和 IOS 设备的 2 个 UUID
  • 在 IOS 设备中,我看到 2 个 Android UUID,但我看不到另一个 IOS 设备 UUID。

这很奇怪,我需要帮助来解决这个问题,拜托了!


我目前已经实现了 2 个包来实现这个功能:

(1) 广播用

信标广播: https ://pub.dev/packages/beacon_broadcast 版本:0.2.1

(2) 用于扫描其他信标

flutter_blue: https ://pub.dev/packages/flutter_blue 版本: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();
}

不幸的是,您无法在 iOS 上使用 FlutterBlue 检测 iBeacon 数据包。

为什么? FlutterBlue 使用原始蓝牙扫描来检测信标,这意味着在 iOS 上使用原生 CoreBluetooth 扫描 API。 Apple 阻止 CoreBluetooth API 读取任何可解码为 iBeacon 广告的蓝牙广告的原始字节。 虽然这听起来很疯狂,但这很可能是由 Apple 对安全问题的误导所致。 在我的博客文章中阅读更多内容: CoreBluetooth 不会让您看到 iBeacons

解决此问题的两个选项:

  1. 切换到使用 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 上检测到。

  2. 切换到在 iOS 上使用不同的检测库,该库使用 CoreLocation(唯一允许在 iOS 上检测 iBeacon 的 API)而不是 CoreBluetooth。 这意味着放弃 FlutterBlue 以支持FlutterBeacon或类似的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM