Beispiel #1
0
        public async Task <bool> Listen()
        {
            Debug.WriteLine("MessageListenerTask: Listen()");

            bool isSuccess = false;

            isCanceled = false;

            var    localSettings            = ApplicationData.Current.LocalSettings;
            string deviceId                 = localSettings.Values[DEVICEID_TAG] as string;
            string receiverConnectionString = localSettings.Values[IOTHUBRECVCONN_TAG] as string;

            DeviceClient deviceClientReceiver = null;

            try
            {
                // https://github.com/Azure/azure-iot-sdks/blob/master/csharp/device/Microsoft.Azure.Devices.Client/DeviceClient.cs
                deviceClientReceiver = DeviceClient.CreateFromConnectionString(
                    receiverConnectionString,
                    deviceId,
                    TransportType.Amqp_WebSocket_Only);
            }
            catch (Exception ex)
            {
                Debug.WriteLine("MessageListenerTask.Listen Exception: " + ex.Message);
                isCanceled = true;
            }

            _taskInstance.Progress = 0;

            while (true)
            {
                if (isCanceled)
                {
                    break;
                }

                CheckStopCondition();
                CheckPauseCondition();

                if (isPaused)
                {
                    await Task.Delay(500);

                    continue;
                }
                // To prevent exception happened when network is disconnected abnormally
                try
                {
                    Message receivedMessage = await deviceClientReceiver.ReceiveAsync(); // ReceiveAsync(new TimeSpan(0, 0, 30)); // 1 second

                    if (receivedMessage == null)
                    {
                        await Task.Delay(1000);

                        continue;
                    }

                    string messageData = Encoding.ASCII.GetString(receivedMessage.GetBytes());

                    var resultData = JsonConvert.DeserializeObject <ReceivedData>(messageData);

                    await deviceClientReceiver.CompleteAsync(receivedMessage);

                    HotZoneInfo zoneInfo = null;
                    try
                    {
                        zoneInfo = promotionList[resultData.ProductId];
                    }
                    catch
                    { }

                    if (zoneInfo == null)
                    {
                        zoneInfo = promotionList["default"];
                    }

                    string msg = zoneInfo.ZoneDesc
                                 + "\n" + _taskInstance.Progress + " " + resultData.ProductId + " " + resultData.SendTimestamp.ToLocalTime();
                    ApplicationData.Current.LocalSettings.Values[_taskInstance.Task.Name + NOTIFICATION_TAG] = msg;

                    Debug.WriteLine("MessageListenerTask Got Message: " + msg);

                    uint progressVal = (_taskInstance.Progress + 1) % 100;
                    if (progressVal == 0)
                    {
                        progressVal = 1;
                    }
                    _taskInstance.Progress = progressVal;

                    ToastPromotionInfo(resultData.ProductId, null);
                }
                catch (Exception ex)
                {
                    Debug.WriteLine("MessageListenerTask: " + ex.Message);
                    await Task.Delay(1000);
                }
            }
            isCanceled = false;
            return(isSuccess);
        }
Beispiel #2
0
        private void ToastPromotionInfo(string promotionKey, string dbgmsg)
        {
            string      appTitle = Windows.ApplicationModel.Package.Current.DisplayName;
            HotZoneInfo zoneInfo = null;

            try
            {
                zoneInfo = promotionList[promotionKey];
            }
            catch (Exception)
            { }

            if (zoneInfo == null)
            {
                zoneInfo = promotionList["default"];
            }

            var promotionUrls = zoneInfo.PromotionUrls;
            var promotionUrl  = promotionUrls[0];

            if (lastPromotionUrl != null)
            {
                foreach (var purl in promotionUrls)
                {
                    if (purl[1].CompareTo(lastPromotionUrl) != 0)
                    {
                        promotionUrl = purl;
                        break;
                    }
                }
            }

            string promotionMsg = promotionUrl[0];
            string url          = promotionUrl[1];

            lastPromotionUrl = url;

            try
            {
                string xmlPayload =
                    "<toast duration=\"long\" launch=\"" + url + "\">" + "\n"
                    + "<visual>" + "\n"
                    + "<binding template=\"ToastGeneric\">" + "\n"
                    + "<text>" + appTitle + "</text>" + "\n"
                    + "<text>" + zoneInfo.ZoneDesc + "</text>" + "\n"
                    + ((dbgmsg == null) ?
                       ("<text>" + promotionMsg + "</text>" + "\n")
                : ("<text>" + dbgmsg + ";" + promotionMsg + "</text>" + "\n"))
                    + "<image placement=\"appLogoOverride\" src=\"Assets/product-logo.png\" />" + "\n"
                    + "</binding>" + "\n"
                    + "</visual>" + "\n"
                    //+ "<actions>" + "\n"
                    //+ "<action activationType=\"foreground\" content=\"View Promotion\" arguments=\"" + url + "\" />" + "\n"
                    //+ "</actions>" + "\n"
                    + "</toast>" + "\n";

                // Create an XML document from the XML.
                var toastDOM = new Windows.Data.Xml.Dom.XmlDocument();
                toastDOM.LoadXml(xmlPayload);

                // Prepare to raise the toast.
                var toastNotifier = ToastNotificationManager.CreateToastNotifier();

                // Raise the toast immediately.
                var toast = new ToastNotification(toastDOM);
                toastNotifier.Show(toast);
            }
            catch (Exception ex)
            {
                Debug.WriteLine("Toast: " + ex.Message);
            }
        }
Beispiel #3
0
        public bool OneshotProcess(short?filterInRange, short?filterOutRange)
        {
            Debug.WriteLine("MessageListenerTask: OneshotProcess()");

            bool isSuccess = false;

            var           localSettings  = ApplicationData.Current.LocalSettings;
            string        eventMessages  = localSettings.Values[BTWATCHERTASK_TAG] as string;
            string        inrangeList    = localSettings.Values[CURRENTINRANGE_TAG] as string;
            string        beaconPrefix   = localSettings.Values[BEACONPREFIX_TAG] as string;
            List <string> inrangeDevices = null;
            string        productId      = null;
            string        dbgmsg         = null;

            try
            {
                short inrangeValue  = ((filterInRange != null)? filterInRange.Value : (short)-127);
                short outrangeValue = ((filterOutRange != null)? filterOutRange.Value : (short)-127);

                if (inrangeList == null)
                {
                    inrangeDevices = new List <string>();
                }
                else
                {
                    inrangeDevices = new List <string>(inrangeList.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries));
                }

                string[] events = eventMessages.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);
                foreach (var singleevent in events)
                {
                    if (singleevent.Length == 0)
                    {
                        continue;
                    }
                    try
                    {
                        string[] fields = singleevent.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                        if (fields == null || fields.Length < 3)
                        {
                            continue;
                        }

                        string beaconId       = fields[0];
                        short  signalStrength = 0;
                        short.TryParse(fields[1], out signalStrength);

                        //if (beaconId.Substring(0, beaconPrefix.Length) != beaconPrefix)
                        //    continue;

                        if (inrangeDevices.Contains(beaconId))
                        {
                            if (signalStrength <= outrangeValue)
                            {
                                inrangeDevices.Remove(beaconId);
                                //dbgmsg += ";-" + beaconId + "("+ signalStrength + ")";
                            }
                        }
                        else
                        {
                            if (signalStrength > inrangeValue)
                            {
                                if (productId == null)
                                {
                                    productId = "Product" + beaconId.Substring(beaconPrefix.Length, 2);
                                    inrangeDevices.Add(beaconId);
                                    //dbgmsg += ";+" + beaconId;
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        Debug.WriteLine(ex.Message);
                    }
                }

                inrangeList = "";
                foreach (var device in inrangeDevices)
                {
                    inrangeList += device + " ";
                }
                localSettings.Values[CURRENTINRANGE_TAG] = inrangeList;
                //dbgmsg += ";" + inrangeDevices.Count + ")" + inrangeList;
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
            }

            if (productId == null)
            {
                return(true);
            }

            // To prevent exception happened when network is disconnected abnormally
            try
            {
                HotZoneInfo zoneInfo = null;
                try
                {
                    zoneInfo = promotionList[productId];
                }
                catch
                { }

                if (zoneInfo == null)
                {
                    zoneInfo = promotionList["default"];
                }

                if (_taskInstance != null)
                {
                    // string msg = "[" + _taskInstance.Progress + "] " + ((messageData == null) ? "" : messageData);
                    string msg = zoneInfo.ZoneDesc
                                 + "\n" + _taskInstance.Progress + " " + productId + " " + DateTime.Now.ToLocalTime();
                    ApplicationData.Current.LocalSettings.Values[_taskInstance.Task.Name + NOTIFICATION_TAG] = msg;

                    Debug.WriteLine("MessageListenerTask Got Message: " + msg);

                    _taskInstance.Progress = 100;
                }

                ToastPromotionInfo(productId, dbgmsg);
                isSuccess = true;
            }
            catch (Exception ex)
            {
                Debug.WriteLine("MessageListenerTask: " + ex.Message);
            }
            return(isSuccess);
        }