В настоящее время я создаю приложение, которое превращает мое устройство в маяк, одновременно сканируя другие маяки. Так что я могу отслеживать маяки, с которыми контактировал.
Проблема
Текущий Я тестировал этот код в следующих сценариях:
- Android TO Android - Передача и сканирование - Работает хорошо
- С Android на IOS - широковещательная передача и сканирование в обоих направлениях - Работает хорошо
- IOS на IOS - не работает (когда я транслирую UUID с устройства IOS, я вижу UUID на устройстве Android, но не вижу UUID на любом устройстве IOS.)
- Я установил этот фрагмент кода на 4 устройства (2 Android и 2 IOS). Теперь все 4 устройства транслируют разные UUID и одновременно слушают.
- На устройствах Android я вижу 1 UUID другого устройства Android и 2 UUID устройств IOS.
- В устройствах IOS я вижу 2 UUID Android, но не вижу UUID другого устройства IOS.
Это очень странно, и мне нужна помощь, чтобы решить эту проблему!
В настоящее время я реализовал 2 пакета для достижения этой функциональности:
(1) Для трансляции
beacon_broadcast: 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();
}