Esempio n. 1
0
        /// <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";
        }
Esempio n. 2
0
        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;
        }
Esempio n. 3
0
        /// <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));
            }
        }
Esempio n. 5
0
        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;
        }
Esempio n. 6
0
        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();
                    }
                }
            }
        }
Esempio n. 7
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();
                    }
                }
            }
        }
        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();
                }
            }
        }
Esempio n. 9
0
 /// <summary>
 /// iBeacon発信開始処理(引数で渡されたiBeaconの定義に従い発信)
 /// </summary>
 /// <param name="ibeacon">iBeaconの定義</param>
 public void StartTransmission(iBeacon ibeacon)
 {
     this.StartTransmission(ibeacon.Uuid, ibeacon.Major, ibeacon.Minor, ibeacon.TxPower);
 }
Esempio n. 10
0
        /// <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);
        }
Esempio n. 11
0
	void Awake() {
		m_instance = this;	
	}
Esempio n. 12
0
 public IHttpActionResult PUT(iBeacon beacon)
 {
     return(Ok());
 }
Esempio n. 13
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();
                        }
                    }
                }
            }
        }
Esempio n. 14
0
 void Awake()
 {
     m_instance = this;
 }
Esempio n. 15
0
        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();
                        }
                    }
                }
            }
        }
Esempio n. 16
0
        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();
                    }
                }
            }
        }