Пример #1
0
        public async Task StartListener()
        {
            var backgroundTaskRegistration = await BackgroundTaskService.Register <BroadcastListenerBackgroundTask>(new SocketActivityTrigger());

            datagramSocket = new DatagramSocket();
            datagramSocket.EnableTransferOwnership(backgroundTaskRegistration.TaskId, SocketActivityConnectedStandbyAction.DoNotWake);
            await datagramSocket.BindServiceNameAsync("4536");

            datagramSocket.MessageReceived += DatagramSocket_MessageReceived;
        }
Пример #2
0
        public async Task Bind(string localAddress, string multicastAddress, string multicastPort)
        {
            information = new ServerInformation(localAddress, multicastAddress, multicastPort);

            socket = new DatagramSocket();
            socket.Control.MulticastOnly = true;
            socket.EnableTransferOwnership(taskId);

            await socket.BindEndpointAsync(new HostName(information.LocalAddress), information.MulticastPort);

            socket.JoinMulticastGroup(new HostName(information.MulticastAddress));

            socket.MessageReceived += OnMessageReceived;
        }
Пример #3
0
        public async Task StartListenerAsync()
        {
            try
            {
                _datagramSocket = new DatagramSocket();
                var window     = CoreWindow.GetForCurrentThread();
                var dispatcher = window.Dispatcher;
                _backgroundTaskRegistration = (BackgroundTaskRegistration)_backgroundTaskService.FindRegistration <SocketActivityTriggerBackgroundTask>();
                if (_backgroundTaskRegistration == null)
                {
                    _backgroundTaskRegistration = await _backgroundTaskService.Register <SocketActivityTriggerBackgroundTask>(new SocketActivityTrigger());
                }
                if (_backgroundTaskRegistration != null)
                {
                    _datagramSocket.EnableTransferOwnership(_backgroundTaskRegistration.TaskId, SocketActivityConnectedStandbyAction.DoNotWake);
                }
                await _datagramSocket.BindServiceNameAsync(_applicationDataService.GetSetting <string>("UdpPort"));

                _datagramSocket.MessageReceived += async(s, e) =>
                {
                    uint stringLength    = e.GetDataReader().UnconsumedBufferLength;
                    var  incomingMessage = e.GetDataReader().ReadString(stringLength);
                    var  package         = JsonConvert.DeserializeObject <Package>(incomingMessage);
                    if (package != null)
                    {
                        switch ((PayloadType)package.PayloadType)
                        {
                        case PayloadType.Discovery:
                            package = new Package()
                            {
                                PayloadType = (int)PayloadType.Room,
                                Payload     = new Room()
                                {
                                    RoomGuid   = _applicationDataService.GetSetting <string>("Guid"),
                                    RoomName   = _applicationDataService.GetSetting <string>("RoomName"),
                                    RoomNumber = _applicationDataService.GetSetting <string>("RoomNumber"),
                                    Occupancy  = _applicationDataService.GetSetting <int>("ActualOccupancy"),
                                    IsIoT      = _iotService.IsIotDevice()
                                }
                            };
                            var json = JsonConvert.SerializeObject(package);
                            await _transmissionControlService.SendStringData(e.RemoteAddress, _applicationDataService.GetSetting <string>("TcpPort"), json);

                            break;

                        case PayloadType.PropertyChanged:
                            break;

                        default:
                            break;
                        }
                    }
                };
            }
            catch (Exception ex)
            {
                SocketErrorStatus webErrorStatus = SocketError.GetStatus(ex.GetBaseException().HResult);
            }

            _eventAggregator.GetEvent <PortChangedEvent>().Subscribe(async() =>
            {
                await StartListenerAsync();
            });
        }
Пример #4
0
        public async void Run(IBackgroundTaskInstance taskInstance)
        {
            if (_container == null)
            {
                _container = new UnityContainer();
                _container.RegisterType <IStorageFactory, StorageFactory>();
                _container.RegisterFactory <IStorage>((c) => c.Resolve <IStorageFactory>().Create(), FactoryLifetime.Singleton);
                _container.RegisterType <IChecklistsFactory, ChecklistsFactory>();
                _container.RegisterFactory <IChecklists>((c) => c.Resolve <IChecklistsFactory>().Create(), FactoryLifetime.Singleton);
                _container.RegisterType <ILiveTileFactory, LiveTileFactory>();
                _container.RegisterFactory <ILiveTile>((c) => c.Resolve <ILiveTileFactory>().Create(), FactoryLifetime.Singleton);
            }
            var checklists         = _container.Resolve <IChecklists>();
            var liveTile           = _container.Resolve <ILiveTile>();
            var backgroundWorkCost = BackgroundWorkCost.CurrentBackgroundWorkCost;

            if (backgroundWorkCost == BackgroundWorkCostValue.High)
            {
                return;
            }
            else
            {
                var deferral = taskInstance.GetDeferral();
                try
                {
                    var details           = taskInstance.TriggerDetails as SocketActivityTriggerDetails;
                    var socketInformation = details.SocketInformation;
                    switch (details.Reason)
                    {
                    case SocketActivityTriggerReason.SocketActivity:
                        var datagramSocket = socketInformation.DatagramSocket;
                        datagramSocket.MessageReceived += async(s, e) =>
                        {
                            var dataReader   = e.GetDataReader();
                            var defconStatus = dataReader.ReadString(dataReader.UnconsumedBufferLength);
                            int.TryParse(defconStatus, out int parsedDefconStatus);
                            if (parsedDefconStatus > 0 && parsedDefconStatus < 6)
                            {
                                ApplicationDataContainer roamingSettings = ApplicationData.Current.RoamingSettings;
                                int savedDefconStatus = 0;
                                if (roamingSettings.Values.ContainsKey("defconStatus"))
                                {
                                    savedDefconStatus = Convert.ToInt16(roamingSettings.Values["defconStatus"].ToString());
                                }
                                if (parsedDefconStatus != savedDefconStatus)
                                {
                                    roamingSettings.Values["defconStatus"] = defconStatus;
                                    ShowToast("DEFCON " + defconStatus);
                                    liveTile.DefconTile.SetTile(int.Parse(defconStatus));
                                }
                            }
                            if (parsedDefconStatus == 0)
                            {
                                try
                                {
                                    using (var streamSocket = new StreamSocket())
                                    {
                                        await streamSocket.ConnectAsync(e.RemoteAddress, "4537");

                                        string response = String.Empty;
                                        using (Stream inputStream = streamSocket.InputStream.AsStreamForRead())
                                        {
                                            using (StreamReader streamReader = new StreamReader(inputStream))
                                            {
                                                response = await streamReader.ReadLineAsync();

                                                var checkListItems        = JsonConvert.DeserializeObject <List <CheckListItem> >(response);
                                                var defcon1CheckListItems = checklists.Collection.Defcon1Checklist;
                                                var defcon2CheckListItems = checklists.Collection.Defcon2Checklist;
                                                var defcon3CheckListItems = checklists.Collection.Defcon3Checklist;
                                                var defcon4CheckListItems = checklists.Collection.Defcon4Checklist;
                                                var defcon5CheckListItems = checklists.Collection.Defcon5Checklist;
                                                foreach (var item in checkListItems)
                                                {
                                                    bool itemFound = false;
                                                    if (item.DefconStatus == 1)
                                                    {
                                                        for (int i = 0; i < defcon1CheckListItems.Count; i++)
                                                        {
                                                            if (defcon1CheckListItems[i].UnixTimeStampCreated == item.UnixTimeStampCreated)
                                                            {
                                                                itemFound = true;
                                                                if (defcon1CheckListItems[i].Deleted != item.Deleted)
                                                                {
                                                                    defcon1CheckListItems[i].Deleted    = true;
                                                                    defcon1CheckListItems[i].Visibility = Visibility.Collapsed;
                                                                }
                                                                else if (defcon1CheckListItems[i].UnixTimeStampUpdated < item.UnixTimeStampUpdated)
                                                                {
                                                                    defcon1CheckListItems[i].Item    = item.Item;
                                                                    defcon1CheckListItems[i].Checked = item.Checked;
                                                                }
                                                            }
                                                        }
                                                        if (!itemFound)
                                                        {
                                                            defcon1CheckListItems.Add(item);
                                                        }
                                                    }
                                                    else if (item.DefconStatus == 2)
                                                    {
                                                        for (int i = 0; i < defcon2CheckListItems.Count; i++)
                                                        {
                                                            if (defcon2CheckListItems[i].UnixTimeStampCreated == item.UnixTimeStampCreated)
                                                            {
                                                                itemFound = true;
                                                                if (defcon2CheckListItems[i].Deleted != item.Deleted)
                                                                {
                                                                    defcon2CheckListItems[i].Deleted    = true;
                                                                    defcon2CheckListItems[i].Visibility = Visibility.Collapsed;
                                                                }
                                                                else if (defcon2CheckListItems[i].UnixTimeStampUpdated < item.UnixTimeStampUpdated)
                                                                {
                                                                    defcon2CheckListItems[i].Item    = item.Item;
                                                                    defcon2CheckListItems[i].Checked = item.Checked;
                                                                }
                                                            }
                                                        }
                                                        if (!itemFound)
                                                        {
                                                            defcon2CheckListItems.Add(item);
                                                        }
                                                    }
                                                    else if (item.DefconStatus == 3)
                                                    {
                                                        for (int i = 0; i < defcon3CheckListItems.Count; i++)
                                                        {
                                                            if (defcon3CheckListItems[i].UnixTimeStampCreated == item.UnixTimeStampCreated)
                                                            {
                                                                itemFound = true;
                                                                if (defcon3CheckListItems[i].Deleted != item.Deleted)
                                                                {
                                                                    defcon3CheckListItems[i].Deleted    = true;
                                                                    defcon3CheckListItems[i].Visibility = Visibility.Collapsed;
                                                                }
                                                                else if (defcon3CheckListItems[i].UnixTimeStampUpdated < item.UnixTimeStampUpdated)
                                                                {
                                                                    defcon3CheckListItems[i].Item    = item.Item;
                                                                    defcon3CheckListItems[i].Checked = item.Checked;
                                                                }
                                                            }
                                                        }
                                                        if (!itemFound)
                                                        {
                                                            defcon3CheckListItems.Add(item);
                                                        }
                                                    }
                                                    else if (item.DefconStatus == 4)
                                                    {
                                                        for (int i = 0; i < defcon4CheckListItems.Count; i++)
                                                        {
                                                            if (defcon4CheckListItems[i].UnixTimeStampCreated == item.UnixTimeStampCreated)
                                                            {
                                                                itemFound = true;
                                                                if (defcon4CheckListItems[i].Deleted != item.Deleted)
                                                                {
                                                                    defcon4CheckListItems[i].Deleted    = true;
                                                                    defcon4CheckListItems[i].Visibility = Visibility.Collapsed;
                                                                }
                                                                else if (defcon4CheckListItems[i].UnixTimeStampUpdated < item.UnixTimeStampUpdated)
                                                                {
                                                                    defcon4CheckListItems[i].Item    = item.Item;
                                                                    defcon4CheckListItems[i].Checked = item.Checked;
                                                                }
                                                            }
                                                        }
                                                        if (!itemFound)
                                                        {
                                                            defcon4CheckListItems.Add(item);
                                                        }
                                                    }
                                                    else if (item.DefconStatus == 5)
                                                    {
                                                        for (int i = 0; i < defcon5CheckListItems.Count; i++)
                                                        {
                                                            if (defcon5CheckListItems[i].UnixTimeStampCreated == item.UnixTimeStampCreated)
                                                            {
                                                                itemFound = true;
                                                                if (defcon5CheckListItems[i].Deleted != item.Deleted)
                                                                {
                                                                    defcon5CheckListItems[i].Deleted    = true;
                                                                    defcon5CheckListItems[i].Visibility = Visibility.Collapsed;
                                                                }
                                                                else if (defcon5CheckListItems[i].UnixTimeStampUpdated < item.UnixTimeStampUpdated)
                                                                {
                                                                    defcon5CheckListItems[i].Item    = item.Item;
                                                                    defcon5CheckListItems[i].Checked = item.Checked;
                                                                }
                                                            }
                                                        }
                                                        if (!itemFound)
                                                        {
                                                            defcon5CheckListItems.Add(item);
                                                        }
                                                    }
                                                }
                                                await checklists.Operations.SaveCheckList(defcon1CheckListItems, 1);

                                                await checklists.Operations.SaveCheckList(defcon2CheckListItems, 2);

                                                await checklists.Operations.SaveCheckList(defcon3CheckListItems, 3);

                                                await checklists.Operations.SaveCheckList(defcon4CheckListItems, 4);

                                                await checklists.Operations.SaveCheckList(defcon5CheckListItems, 5);
                                            }
                                        }
                                        await streamSocket.CancelIOAsync();

                                        streamSocket.Dispose();
                                    }
                                }
                                catch (Exception ex)
                                {
                                    SocketErrorStatus webErrorStatus = SocketError.GetStatus(ex.GetBaseException().HResult);
                                }
                            }
                        };
                        await datagramSocket.CancelIOAsync();

                        datagramSocket.TransferOwnership("myDefconDatagramSocket");
                        break;

                    case SocketActivityTriggerReason.SocketClosed:
                        DatagramSocket newDatagramSocket = new DatagramSocket();
                        newDatagramSocket.EnableTransferOwnership(taskInstance.Task.TaskId, SocketActivityConnectedStandbyAction.DoNotWake);
                        await newDatagramSocket.BindServiceNameAsync("4536");

                        await newDatagramSocket.CancelIOAsync();

                        newDatagramSocket.TransferOwnership("myDefconDatagramSocket");
                        break;

                    default:
                        break;
                    }
                }
                catch (Exception)
                {
                    try
                    {
                        DatagramSocket newDatagramSocket = new DatagramSocket();
                        newDatagramSocket.EnableTransferOwnership(taskInstance.Task.TaskId, SocketActivityConnectedStandbyAction.DoNotWake);
                        await newDatagramSocket.BindServiceNameAsync("4536");

                        await newDatagramSocket.CancelIOAsync();

                        newDatagramSocket.TransferOwnership("myDefconDatagramSocket");
                    }
                    catch (Exception) { }
                }
                deferral.Complete();
            }
        }