Ejemplo n.º 1
0
        public async Task SendEcho(string robotNumber)
        {
            // создали эхо - сообщение
            Message message = new Message()
            {
                Commands = new List <string>()
                {
                    "<ECHO>"
                },
                From = "0",
                To   = robotNumber,
                Text = null
            };

            // оно дошло?
            bool result = true;

            /*
             * нужно сказать серверу, что робот онлайн только 1 раз, поэтому нужен флаг
             */

            bool serverKnows = false;

            while (result)
            {
                Thread.Sleep(1000);
                result = await SendMessageToRobotTask(JsonConvert.SerializeObject(message));

                if (result)
                {
                    Console.WriteLine("Robot is online now");
                    if (!serverKnows)
                    {
                        Message notificationOn = new Message()
                        {
                            Commands = null,
                            From     = robotNumber,
                            Text     = "I am online!",
                            To       = "0"
                        };
                        await _serverConnector.SendMessageToServer(notificationOn);

                        serverKnows = true;
                    }
                }
            }

            Console.WriteLine("Robot is offline now");
            Message notificationOff = new Message()
            {
                Commands = null,
                From     = robotNumber,
                Text     = "I am offline!",
                To       = "0"
            };
            var robot = data.Robots.First(x => x.Number == robotNumber);

            robot.isOnline = false;
            await data.UpdateAsync(robot);

            await _serverConnector.SendMessageToServer(notificationOff);
        }
Ejemplo n.º 2
0
        public async Task Proccess(string str)
        {
            /*
             * Мы знаем, что все сообщения должны заканчиваться на <EOF>
             */
            string json = str.Replace("<EOF>", "");

            /*
             * Также мы знаем, что все сообщения имеют общий вид
             */
            Message message = JsonConvert.DeserializeObject <Message>(json);


            /* сообщение от робота. Его нужно отправить в на Сервер в любом случае.
             * Также мы должны начать отправлять эхо запросы и сделить, онлайн ли наш Робот или нет.
             */
            if (message.From != "0")
            {
                // Пока что все запросы идут на Сервер, в будущем будет не так.
                await _serverConnector.SendMessageToServer(message);

                // запрос на получение всех сообщений
                if (message.HasCommand(Mail))
                {
                    Robot robot    = data.Robots.First(x => x.Number == message.From);
                    var   messages = data.Messages.Where(x => x.Robot.RobotID == robot.RobotID);
                    Console.WriteLine("We have {0} messages", messages.Count());
                    foreach (var mes in messages.ToList())
                    {
                        await _robotConnector.SendMessageToRobotTask(mes.Text);

                        await data.RemoveAsync(mes);
                    }
                }

                /*
                 * Запускаем таску, которая шлет эхо сообщения на робота и
                 * останавливается, если при передаче происзошла ошибка.
                 */
                Task heartBeating = Task.Factory.StartNew(() =>
                {
                    _robotConnector.SendEcho(message.From).Start();
                });
            }
            // сообщение от сервера.
            else
            {
                // сначала найдем этого Робота в базе.
                Robot robot = data.Robots.First(x => x.Number == message.To);
                // если онлайн и сообщение до него дошло, то ОК.
                if (robot.isOnline && await _robotConnector.SendMessageToRobotTask(JsonConvert.SerializeObject(message)))
                {
                }
                // если Робот сейчас не online или недоступен, то сохраним сообщение в БД
                else
                {
                    await data.AddAsync(new StoredMessage()
                    {
                        Robot = robot,
                        Text  = message.Text
                    });
                }
            }
        }