/// <summary> /// メインページ表示完了後に実行される処理 /// </summary> /// <param name="parameters">App.xaml.csのOnInitializedで設定されたパラメーター</param> public void OnNavigatedTo(NavigationParameters parameters) { // TxPowerの初期値を設定する。 TxPower = iBeacon.DEFAULT_TXPOWER; // 発信/停止ボタンの表記を更新する。 ButtonTitle = Const.STR_TRANSMIT_START; // iBeacon情報の変更を可能にする。 CanEditBeaconProperties = true; // iBeaconの情報を保持するためのインスタンスを作成する。 _ibeacon = new iBeacon(); if (!_iBeaconTransmitService.TransmissionSupported()) { // BLEの発信ができない場合、その旨のエラーダイアログを表示する。 _pageDialogService.DisplayAlertAsync(Const.STR_DIALOG_TITLE_ERROR, Const.STR_DIALOG_MSG_CANNOT_TRANSMIT, Const.STR_DIALOG_BUTTON_OK); // iBeacon情報の変更と発信ボタンの操作ができないようにする。 CanEditBeaconProperties = false; } // 空のHTMLを指定し、背景が実質的に何もない状態にする。 Url = _resourceUtility.GetResourceRootPath() + "Background_Blank.html"; }
public void StopScan() { if (!IsScanning) { return; } foreach (var eventHolder in _beaconEventHolderDict) { iBeacon targetBeacon = eventHolder.Value.ibeacon; var uuid = new NSUuid(targetBeacon.Uuid.ToString()); ushort?major = targetBeacon.Major; ushort?minor = targetBeacon.Minor; CLBeaconRegion beaconRegion; if (major.HasValue && minor.HasValue) { beaconRegion = new CLBeaconRegion(uuid, (ushort)major, (ushort)minor, eventHolder.Value.BeaconIdentifyStr); } else if (major.HasValue) { beaconRegion = new CLBeaconRegion(uuid, (ushort)major, eventHolder.Value.BeaconIdentifyStr); } else { beaconRegion = new CLBeaconRegion(uuid, eventHolder.Value.BeaconIdentifyStr); } _locationManager.StopRangingBeacons(beaconRegion); } IsScanning = false; }
/// <summary> /// メインページ表示完了後に実行される処理 /// </summary> /// <param name="parameters">App.xaml.csのOnInitializedで設定されたパラメーター</param> public void OnNavigatedTo(NavigationParameters parameters) { // アプリのタイトルを取得する。 if (parameters.ContainsKey("title")) { Title = (string)parameters["title"] + " and Prism"; } // TxPowerの初期値を設定する。 TxPower = iBeacon.DEFAULT_TXPOWER; // 発信/停止ボタンの表記を更新する。 ButtonTitle = Const.STR_TRANSMIT_START; // iBeacon情報の変更を可能にする。 CanEditBeaconProperties = true; // iBeaconの情報を保持するためのインスタンスを作成する。 _ibeacon = new iBeacon(); if (!_iBeaconTransmitService.TransmissionSupported()) { // BLEの発信ができない場合、その旨のエラーダイアログを表示する。 _pageDialogService.DisplayAlertAsync(Const.STR_DIALOG_TITLE_ERROR, Const.STR_DIALOG_MSG_CANNOT_TRANSMIT, Const.STR_DIALOG_BUTTON_OK); // iBeacon情報の変更と発信ボタンの操作ができないようにする。 CanEditBeaconProperties = false; } }
public IHttpActionResult POST(iBeacon beacon) { iBeaconModel db = new iBeaconModel(); var result = db.iBeacon.FirstOrDefault(x => x.UUID == beacon.UUID && x.Major == beacon.Major && x.Minor == beacon.Minor); if (result == null) { return(StatusCode(HttpStatusCode.NoContent)); } else { return(Ok(result)); } }
public void StartScan() { if (!SupportsBluetooth()) { throw new BluetoothUnsupportedException("This device does not support Bluetooth."); } if (!IsReadyToUseBluetooth()) { throw new BluetoothTurnedOffException("Bluetooth service on this device is turned off."); } if (!CanUseLocationForDetectBeacons()) { throw new LocationServiceNotAllowedException("Location service is not allowed for this device or app."); } if (IsScanning) { return; } foreach (var eventHolder in _beaconEventHolderDict) { iBeacon targetBeacon = eventHolder.Value.ibeacon; var uuid = new NSUuid(targetBeacon.Uuid.ToString()); ushort?major = targetBeacon.Major; ushort?minor = targetBeacon.Minor; CLBeaconRegion beaconRegion; if (major.HasValue && minor.HasValue) { beaconRegion = new CLBeaconRegion(uuid, (ushort)major, (ushort)minor, eventHolder.Value.BeaconIdentifyStr); } else if (major.HasValue) { beaconRegion = new CLBeaconRegion(uuid, (ushort)major, eventHolder.Value.BeaconIdentifyStr); } else { beaconRegion = new CLBeaconRegion(uuid, eventHolder.Value.BeaconIdentifyStr); } _locationManager.StartRangingBeacons(beaconRegion); } IsScanning = true; }
private void didRangeBeacons(object s, CLRegionBeaconsRangedEventArgs e) { foreach (var detectedBeacon in e.Beacons) { string beaconIdentifier = iBeaconEventHolder.GenerateBeaconIdentifyStr( new Guid(detectedBeacon.ProximityUuid.AsString().ToUpper()), detectedBeacon.Major.UInt16Value, detectedBeacon.Minor.UInt16Value); 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 < detectedBeacon.Rssi)) { eventHolder.ibeacon.Rssi = (short)detectedBeacon.Rssi; eventHolder.ibeacon.EstimatedDistanceMeter = detectedBeacon.Accuracy; _detectedBeaconDict[beaconIdentifier] = eventHolder.ibeacon; } } else { eventHolder.ibeacon.Rssi = (short)detectedBeacon.Rssi; if (detectedBeacon.Accuracy > 0) { eventHolder.ibeacon.EstimatedDistanceMeter = detectedBeacon.Accuracy; } _detectedBeaconDict.Add(beaconIdentifier, eventHolder.ibeacon); } foreach (iBeaconEventDetail eventDetail in eventHolder.EventList) { if (eventDetail.ThresholdRssi < detectedBeacon.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); 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(); } } } }
private void bleAdvWatcherReceived(BluetoothLEAdvertisementWatcher s, BluetoothLEAdvertisementReceivedEventArgs e) { iBeacon detectedBeacon = iBeaconUwpUtility.ConvertReceivedDataToBeacon(e); if (detectedBeacon == null || detectedBeacon.Rssi == null) { return; } string beaconIdentifier = iBeaconEventHolder.GenerateBeaconIdentifyStr(detectedBeacon.Uuid, detectedBeacon.Major, detectedBeacon.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 < detectedBeacon.Rssi)) { eventHolder.ibeacon.Rssi = detectedBeacon.Rssi; eventHolder.ibeacon.TxPower = detectedBeacon.TxPower; _detectedBeaconDict[beaconIdentifier] = eventHolder.ibeacon; } } else { eventHolder.ibeacon.Rssi = detectedBeacon.Rssi; eventHolder.ibeacon.TxPower = detectedBeacon.TxPower; _detectedBeaconDict.Add(beaconIdentifier, eventHolder.ibeacon); } foreach (var eventDetail in eventHolder.EventList) { if (eventDetail.ThresholdRssi < detectedBeacon.Rssi && eventDetail.LastTriggeredDateTime < DateTime.Now.AddMilliseconds(-1 * eventDetail.EventTriggerIntervalMilliSec)) { eventDetail.LastTriggeredDateTime = DateTime.Now; eventDetail.Function(); } } }
/// <summary> /// iBeacon発信開始処理(引数で渡されたiBeaconの定義に従い発信) /// </summary> /// <param name="ibeacon">iBeaconの定義</param> public void StartTransmission(iBeacon ibeacon) { this.StartTransmission(ibeacon.Uuid, ibeacon.Major, ibeacon.Minor, ibeacon.TxPower); }
/// <summary> /// Bluetoothの受信データをiBeacon情報に変換します。 /// 受信データがiBeaconのものでなかった場合、nullを返します。 /// </summary> /// <returns>受信データから生成したiBeacon情報</returns> /// <param name="args">Bluetoothの受信データ</param> public static iBeacon ConvertReceivedDataToBeacon(BluetoothLEAdvertisementReceivedEventArgs args) { //出力されているbyteデータから各値を抽出する IList <BluetoothLEManufacturerData> manufacturerSections = args.Advertisement.ManufacturerData; Guid uuid; ushort?major; ushort?minor; short? rssi; short? txPower; if (manufacturerSections.Count > 0) { BluetoothLEManufacturerData manufacturerData = manufacturerSections[0]; var data = new byte[manufacturerData.Data.Length]; using (var reader = DataReader.FromBuffer(manufacturerData.Data)) { reader.ReadBytes(data); } //長さをチェック if (data == null || data.Length < MINIMUM_LENGTH_BYTES + ADJUSTED_LENGTH_BYTES) { return(null); } //イベントから取得 rssi = args.RawSignalStrengthInDBm; //バイトデータから抽出 //公式での出力値(Windowsでは2byteずれているので補正が必要) // Byte(s) WinByte(s) Name // -------------------------- // 0-1 none Manufacturer ID (16-bit unsigned integer, big endian) // 2-3 0-1 Beacon code (two 8-bit unsigned integers, but can be considered as one 16-bit unsigned integer in little endian) // 4-19 2-17 ID1 (UUID) // 20-21 18-19 ID2 (16-bit unsigned integer, big endian) // 22-23 20-21 ID3 (16-bit unsigned integer, big endian) // 24 22 Measured Power (signed 8-bit integer) // 25 23 Reserved for use by the manufacturer to implement special features (optional) //BigEndianの値を取得 string uuidStr = BitConverter.ToString(data, 2, 4).Replace("-", string.Empty) + "-" + BitConverter.ToString(data, 6, 2).Replace("-", string.Empty) + "-" + BitConverter.ToString(data, 8, 2).Replace("-", string.Empty) + "-" + BitConverter.ToString(data, 10, 2).Replace("-", string.Empty) + "-" + BitConverter.ToString(data, 12, 6).Replace("-", string.Empty); uuid = new Guid(uuidStr); txPower = Convert.ToSByte(BitConverter.ToString(data, 24 + ADJUSTED_LENGTH_BYTES, 1), 16); // Byte 22 //.NET FramewarkのEndianはCPUに依存するらしい if (BitConverter.IsLittleEndian) { //LittleEndianの値を取得 byte[] revData; revData = new byte[] { data[20 + ADJUSTED_LENGTH_BYTES], data[21 + ADJUSTED_LENGTH_BYTES] };// Bytes 18-19 Array.Reverse(revData); major = BitConverter.ToUInt16(revData, 0); revData = new byte[] { data[22 + ADJUSTED_LENGTH_BYTES], data[23 + ADJUSTED_LENGTH_BYTES] };// Bytes 20-21 Array.Reverse(revData); minor = BitConverter.ToUInt16(revData, 0); } else { //BigEndianの値を取得 major = BitConverter.ToUInt16(data, 20 + ADJUSTED_LENGTH_BYTES); // Bytes 18-19 minor = BitConverter.ToUInt16(data, 22 + ADJUSTED_LENGTH_BYTES); // Bytes 20-21 } if (uuid != null && major != null && minor != null) { var ibeacon = new iBeacon() { Uuid = uuid, Major = (ushort)major, Minor = (ushort)minor, Rssi = rssi, TxPower = txPower, EstimatedDistanceMeter = CalcDistanceMeterFromRssiAndTxPower(rssi, txPower) }; return(ibeacon); } } return(null); }
void Awake() { m_instance = this; }
public IHttpActionResult PUT(iBeacon beacon) { return(Ok()); }
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(); } } } } }
private void didRangeBeacons(object s, CLRegionBeaconsRangedEventArgs e) { foreach (var detectedBeacon in e.Beacons) { string beaconIdentifier = iBeaconEventHolder.GenerateBeaconIdentifyStr( new Guid(detectedBeacon.ProximityUuid.AsString().ToUpper()), detectedBeacon.Major.UInt16Value, detectedBeacon.Minor.UInt16Value); string beaconIdentifierForNoMinor = iBeaconEventHolder.GenerateBeaconIdentifyStr( new Guid(detectedBeacon.ProximityUuid.AsString().ToUpper()), detectedBeacon.Major.UInt16Value, null); string beaconIdentifierForNoMajorMinor = iBeaconEventHolder.GenerateBeaconIdentifyStr( new Guid(detectedBeacon.ProximityUuid.AsString().ToUpper()), null, null); if (!_beaconEventHolderDict.ContainsKey(beaconIdentifier) && !_beaconEventHolderDict.ContainsKey(beaconIdentifierForNoMinor) && !_beaconEventHolderDict.ContainsKey(beaconIdentifierForNoMajorMinor)) { continue; } string[] beaconIdentifierArray = { beaconIdentifier, beaconIdentifierForNoMinor, beaconIdentifierForNoMajorMinor }; foreach (var beaconId in beaconIdentifierArray) { iBeaconEventHolder eventHolder = null; if (_beaconEventHolderDict.ContainsKey(beaconId)) { eventHolder = _beaconEventHolderDict[beaconId]; } else { continue; } if (_detectedBeaconDictFromClosestApproachedInfo.ContainsKey(beaconIdentifier)) { iBeacon detectedBeaconPrev = _detectedBeaconDictFromClosestApproachedInfo[beaconIdentifier]; short? rssiPrev = detectedBeaconPrev.Rssi; if (rssiPrev == null || ((short)rssiPrev < detectedBeacon.Rssi)) { eventHolder.ibeacon.Rssi = (short)detectedBeacon.Rssi; if (detectedBeacon.Accuracy > 0.0) { eventHolder.ibeacon.EstimatedDistanceMeter = detectedBeacon.Accuracy; } _detectedBeaconDictFromClosestApproachedInfo[beaconIdentifier] = eventHolder.ibeacon; } } else { eventHolder.ibeacon.Rssi = (short)detectedBeacon.Rssi; if (detectedBeacon.Accuracy > 0.0) { eventHolder.ibeacon.EstimatedDistanceMeter = detectedBeacon.Accuracy; } _detectedBeaconDictFromClosestApproachedInfo.Add(beaconIdentifier, eventHolder.ibeacon); } if (_detectedBeaconDictFromLastApproachedInfo.ContainsKey(beaconIdentifier)) { _detectedBeaconDictFromLastApproachedInfo[beaconIdentifier] = new iBeacon() { Uuid = new Guid(detectedBeacon.ProximityUuid.AsString()), Major = detectedBeacon.Major.UInt16Value, Minor = detectedBeacon.Minor.UInt16Value, Rssi = (short)detectedBeacon.Rssi, EstimatedDistanceMeter = detectedBeacon.Accuracy }; } else { _detectedBeaconDictFromLastApproachedInfo.Add( beaconIdentifier, new iBeacon() { Uuid = new Guid(detectedBeacon.ProximityUuid.AsString()), Major = detectedBeacon.Major.UInt16Value, Minor = detectedBeacon.Minor.UInt16Value, Rssi = (short)detectedBeacon.Rssi, EstimatedDistanceMeter = detectedBeacon.Accuracy }); } foreach (iBeaconEventDetail eventDetail in eventHolder.EventList) { if (eventDetail.ThresholdRssi < detectedBeacon.Rssi && eventDetail.LastTriggeredDateTime < DateTime.Now.AddMilliseconds(-1 * eventDetail.EventTriggerIntervalMilliSec)) { eventDetail.LastTriggeredDateTime = DateTime.Now; eventDetail.Function(); } } } } }
private void bleAdvWatcherReceived(BluetoothLEAdvertisementWatcher s, BluetoothLEAdvertisementReceivedEventArgs e) { iBeacon detectedBeacon = iBeaconUwpUtility.ConvertReceivedDataToBeacon(e); if (detectedBeacon == null || detectedBeacon.Rssi == null) { return; } string beaconIdentifier = iBeaconEventHolder.GenerateBeaconIdentifyStr(detectedBeacon.Uuid, detectedBeacon.Major, detectedBeacon.Minor); string beaconIdentifierForNoMinor = iBeaconEventHolder.GenerateBeaconIdentifyStr(detectedBeacon.Uuid, detectedBeacon.Major, null); string beaconIdentifierForNoMajorMinor = iBeaconEventHolder.GenerateBeaconIdentifyStr(detectedBeacon.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; } if (_detectedBeaconDictFromClosestApproachedInfo.ContainsKey(beaconIdentifier)) { iBeacon detectedBeaconPrev = _detectedBeaconDictFromClosestApproachedInfo[beaconIdentifier]; short? rssiPrev = detectedBeaconPrev.Rssi; if (rssiPrev == null || ((short)rssiPrev < detectedBeacon.Rssi)) { eventHolder.ibeacon.Rssi = detectedBeacon.Rssi; eventHolder.ibeacon.TxPower = detectedBeacon.TxPower; eventHolder.ibeacon.EstimatedDistanceMeter = detectedBeacon.EstimatedDistanceMeter; _detectedBeaconDictFromClosestApproachedInfo[beaconIdentifier] = eventHolder.ibeacon; } } else { eventHolder.ibeacon.Rssi = detectedBeacon.Rssi; eventHolder.ibeacon.TxPower = detectedBeacon.TxPower; eventHolder.ibeacon.EstimatedDistanceMeter = detectedBeacon.EstimatedDistanceMeter; _detectedBeaconDictFromClosestApproachedInfo.Add(beaconIdentifier, eventHolder.ibeacon); } if (_detectedBeaconDictFromLastApproachedInfo.ContainsKey(beaconIdentifier)) { _detectedBeaconDictFromLastApproachedInfo[beaconIdentifier] = detectedBeacon; } else { _detectedBeaconDictFromLastApproachedInfo.Add(beaconIdentifier, detectedBeacon); } foreach (var eventDetail in eventHolder.EventList) { if (eventDetail.ThresholdRssi < detectedBeacon.Rssi && eventDetail.LastTriggeredDateTime < DateTime.Now.AddMilliseconds(-1 * eventDetail.EventTriggerIntervalMilliSec)) { eventDetail.LastTriggeredDateTime = DateTime.Now; eventDetail.Function(); } } } }