Пример #1
0
        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();
                    }
                }
            }
        }
Пример #2
0
        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();
                        }
                    }
                }
            }
        }