public override void OnScanResult(ScanCallbackType callbackType, ScanResult result) { base.OnScanResult(callbackType, result); if (iBeaconDroidUtility.IsIBeacon(result.ScanRecord)) { Guid uuid = iBeaconDroidUtility.GetUuidFromRecord(result.ScanRecord); ushort major = iBeaconDroidUtility.GetMajorFromRecord(result.ScanRecord); ushort minor = iBeaconDroidUtility.GetMinorFromRecord(result.ScanRecord); string beaconIdentifier = iBeaconEventHolder.GenerateBeaconIdentifyStr(uuid, major, minor); if (!BeaconEventHolderDict.ContainsKey(beaconIdentifier)) { return; } iBeaconEventHolder eventHolder = BeaconEventHolderDict[beaconIdentifier]; if (DetectedBeaconDict.ContainsKey(beaconIdentifier)) { iBeacon detectedBeaconPrev = DetectedBeaconDict[beaconIdentifier]; short? rssiPrev = detectedBeaconPrev.Rssi; if (rssiPrev == null || ((short)rssiPrev < result.Rssi)) { eventHolder.ibeacon.Rssi = (short)result.Rssi; DetectedBeaconDict[beaconIdentifier] = eventHolder.ibeacon; } } else { eventHolder.ibeacon.Rssi = (short)result.Rssi; eventHolder.ibeacon.TxPower = iBeaconDroidUtility.GetTxPowerFromRecord(result.ScanRecord); DetectedBeaconDict.Add(beaconIdentifier, eventHolder.ibeacon); } foreach (var eventDetail in eventHolder.EventList) { if (eventDetail.ThresholdRssi < result.Rssi && eventDetail.LastTriggeredDateTime < DateTime.Now.AddMilliseconds(-1 * eventDetail.EventTriggerIntervalMilliSec)) { eventDetail.LastTriggeredDateTime = DateTime.Now; eventDetail.Function(); } } } }
public override void OnScanResult(ScanCallbackType callbackType, ScanResult result) { base.OnScanResult(callbackType, result); if (iBeaconDroidUtility.IsIBeacon(result.ScanRecord)) { Guid uuid = iBeaconDroidUtility.GetUuidFromRecord(result.ScanRecord); ushort major = iBeaconDroidUtility.GetMajorFromRecord(result.ScanRecord); ushort minor = iBeaconDroidUtility.GetMinorFromRecord(result.ScanRecord); string beaconIdentifier = iBeaconEventHolder.GenerateBeaconIdentifyStr(uuid, major, minor); string beaconIdentifierForNoMinor = iBeaconEventHolder.GenerateBeaconIdentifyStr(uuid, major, null); string beaconIdentifierForNoMajorMinor = iBeaconEventHolder.GenerateBeaconIdentifyStr(uuid, null, null); if (!BeaconEventHolderDict.ContainsKey(beaconIdentifier) && !BeaconEventHolderDict.ContainsKey(beaconIdentifierForNoMinor) && !BeaconEventHolderDict.ContainsKey(beaconIdentifierForNoMajorMinor)) { return; } string[] beaconIdentifierArray = { beaconIdentifier, beaconIdentifierForNoMinor, beaconIdentifierForNoMajorMinor }; foreach (var beaconId in beaconIdentifierArray) { iBeaconEventHolder eventHolder = null; if (BeaconEventHolderDict.ContainsKey(beaconId)) { eventHolder = BeaconEventHolderDict[beaconId]; } else { continue; } iBeacon holdBeacon = eventHolder.ibeacon; if (DetectedBeaconDictFromClosestApproachedInfo.ContainsKey(beaconIdentifier)) { iBeacon detectedBeaconPrev = DetectedBeaconDictFromClosestApproachedInfo[beaconIdentifier]; short? rssiPrev = detectedBeaconPrev.Rssi; if (rssiPrev == null || ((short)rssiPrev < result.Rssi)) { holdBeacon.Rssi = (short)result.Rssi; holdBeacon.TxPower = iBeaconDroidUtility.GetTxPowerFromRecord(result.ScanRecord); holdBeacon.EstimatedDistanceMeter = iBeaconDroidUtility.CalcDistanceMeterFromRssiAndTxPower(holdBeacon.Rssi, holdBeacon.TxPower); DetectedBeaconDictFromClosestApproachedInfo[beaconIdentifier] = holdBeacon; } } else { holdBeacon.Rssi = (short)result.Rssi; holdBeacon.TxPower = iBeaconDroidUtility.GetTxPowerFromRecord(result.ScanRecord); holdBeacon.EstimatedDistanceMeter = iBeaconDroidUtility.CalcDistanceMeterFromRssiAndTxPower(holdBeacon.Rssi, holdBeacon.TxPower); DetectedBeaconDictFromClosestApproachedInfo.Add(beaconIdentifier, holdBeacon); } if (DetectedBeaconDictFromLastApproachedInfo.ContainsKey(beaconIdentifier)) { var thisBeacon = new iBeacon() { Uuid = uuid, Major = major, Minor = minor, Rssi = (short)result.Rssi, TxPower = iBeaconDroidUtility.GetTxPowerFromRecord(result.ScanRecord), EstimatedDistanceMeter = iBeaconDroidUtility.CalcDistanceMeterFromRssiAndTxPower( (short)result.Rssi, iBeaconDroidUtility.GetTxPowerFromRecord(result.ScanRecord)) }; DetectedBeaconDictFromLastApproachedInfo[beaconIdentifier] = thisBeacon; } else { var thisBeacon = new iBeacon() { Uuid = uuid, Major = major, Minor = minor, Rssi = (short)result.Rssi, TxPower = iBeaconDroidUtility.GetTxPowerFromRecord(result.ScanRecord), EstimatedDistanceMeter = iBeaconDroidUtility.CalcDistanceMeterFromRssiAndTxPower( (short)result.Rssi, iBeaconDroidUtility.GetTxPowerFromRecord(result.ScanRecord)) }; DetectedBeaconDictFromLastApproachedInfo.Add(beaconIdentifier, thisBeacon); } foreach (var eventDetail in eventHolder.EventList) { if (eventDetail.ThresholdRssi < result.Rssi && eventDetail.LastTriggeredDateTime < DateTime.Now.AddMilliseconds(-1 * eventDetail.EventTriggerIntervalMilliSec)) { eventDetail.LastTriggeredDateTime = DateTime.Now; eventDetail.Function(); } } } } }