protected override int OnPrepare(Route route, int port, PollTask initiator)
        {
            subscriber[route] = (bytes) =>
            {
                route.Send(this, bytes, Routes.Direction.ToInitiator);
            };

            route.Subscribe(this, (bytes, dir) =>
            {
                if (dir == Routes.Direction.FromInitiator)//К конечному устройству ОТ драйвера через ZigbeeConnection
                {
                    var pack = MakePackage(bytes);
                    TcpClientSend(pack);
                }
                else //сюда не должен зайти
                {
                    route.Send(this, bytes, dir);
                }
            });

            ////команда на открытие порта
            //route.Send(this, MakePackage((byte)port, 0x01, new byte[] { }), Routes.Direction.FromInitiator);

            return(0);
        }
예제 #2
0
        protected override int OnPrepare(Route route, int port, PollTask task)
        {
            //string phone = GetPhone();
            //var regex = new Regex(@"");
            //if (regex.IsMatch(phone))
            //{

            //}

            ////проверка по приоритету на попадание в окно
            //if (initiator.Priority < PollTask.PRIORITY_USER)
            //{
            //    //var now = DateTime.Now.Hour;
            //    if (!InWindow(initiator.CreationDate))// GetWindows().Contains(initiator.CreationDate.Hour))
            //    {
            //        Log(string.Format("окно для опроса закрыто (окна: {0})", string.Join(",", GetWindows())));
            //        log.Debug(string.Format("окно для опроса закрыто (окна: {0})", string.Join(",", GetWindows())));
            //        return Codes.CANT_CALL_WINDOW_CLOSED;
            //    }
            //    else
            //    {
            //        Log(string.Format("окно для опроса открыто (окна: {0})", string.Join(",", GetWindows())));
            //    }
            //}

            //звонок, если автоопрос, то ждем после неудачного звонка
            var res = Call(route, port);

            //  CheckAvailability(res == 0, task.Priority);
            return(res);
        }
예제 #3
0
        protected override int OnPrepare(Route route, int port, PollTask initiator)
        {
            //socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            try
            {
                //socket.Connect(GetHost(), GetPort());

                //loop = true;
                //worker = new Thread(() =>
                //{
                //    try
                //    {
                //        var buffer = new byte[1024];
                //        while (loop)
                //        {
                //            var readed = socket.Receive(buffer);
                //            route.Send(this, buffer.Take(readed).ToArray(), Direction.ToInitiator);
                //        }
                //    }
                //    catch (Exception ex)
                //    {
                //        log.Error(string.Format("остановлен поток lan соединения {0}:{1}", GetHost(), GetPort()), ex);
                //    }
                //});
                //worker.IsBackground = true;
                //worker.Name = string.Format("поток {0}", this);
                //worker.Start();

                route.Subscribe(this, (bytes, dir) =>
                {
                    //socket.Send(bytes);
                    var addr = Encoding.ASCII.GetString(bytes);
                    using (var client = new HttpClient())
                    {
                        var response = client.GetAsync(addr).Result;

                        if (response.IsSuccessStatusCode)
                        {
                            // by calling .Result you are performing a synchronous call
                            var responseContent = response.Content;

                            // by calling .Result you are synchronously reading the result
                            string responseString = responseContent.ReadAsStringAsync().Result;

                            var rsp = Encoding.ASCII.GetBytes(responseString);

                            route.Send(this, rsp, Direction.ToInitiator);
                        }
                    }
                });
            }
            catch (Exception ex)
            {
                log.Error(string.Format("приготовление {0}", this), ex);
                return(Codes.NO_HTTP_CONNECTION);
            }

            return(Codes.SUCCESS);
        }
예제 #4
0
        protected override int OnPrepare(Route route, int port, PollTask initiator)
        {
            log.Debug(string.Format("начата подготовка контроллера матрикс {0}", GetImei()));
            if (socket == null)
            {
                Log("контроллер не на связи");
                log.Debug(string.Format("завершена подготовка контроллера матрикс {0} (неудача)", GetImei()));
                return(Codes.MATRIX_NOT_CONNECTED);
            }

            subscriber = (package) =>
            {
                route.Send(this, package, Direction.ToInitiator);
            };

            route.Subscribe(this, (bytes, forward) =>
            {
                if (bytes == null)
                {
                    return;
                }
                SendDataToSocket(bytes);
            });

            return(Codes.SUCCESS);
        }
예제 #5
0
        protected override int OnPrepare(Route route, int port, PollTask initiator)
        {
            log.Debug(string.Format("начата подготовка терминала T/O WRX {0}", GetImei()));
            if (socket == null)
            {
                Log("контроллер не на связи");
                log.Debug(string.Format("завершена подготовка контроллера T/O WRX {0} (неудача)", GetImei()));
                return(Codes.MATRIX_NOT_CONNECTED);
            }

            bool isPortOpen = true;

            subscriber = (bytes) =>
            {
                isPortOpen = true;
                log.Trace(string.Format("[{0}] <- [{1}]", this, string.Join(",", bytes.Select(b => b.ToString("X2")))));
                route.Send(this, bytes, Direction.ToInitiator);
            };

            route.Subscribe(this, (bytes, forward) =>
            {
                if (bytes == null)
                {
                    return;
                }

                log.Trace(string.Format("[{0}] -> [{1}]", this, string.Join(",", bytes.Select(b => b.ToString("X2")))));

                SendDataToSocket(bytes);// MakePackage((byte)port, bytes));
            });

            //CheckVersion();
            //Log(string.Format("открытие порта"));
            //OpenPort((byte)port);
            var timeout = 0;
            var period  = 100;

            while (!isPortOpen && timeout < 20000)
            {
                Thread.Sleep(period);
                timeout += period;
            }

            // isConnected = isPortOpen;

            if (isPortOpen)
            {
                Log(string.Format("контроллер на связи"));
                log.Debug(string.Format("[{0}] сокет соединен", this));
            }
            else
            {
                Log("контроллер не на связи, ожидание");
                log.Debug(string.Format("[{0}] сокет не соединен, опрос не возможен", this));
            }

            log.Debug(string.Format("[{0}] завершена подготовка контроллера TeleofisWrx ({1})", this, isPortOpen ? "успех" : "неудача"));
            return(isPortOpen ? Codes.SUCCESS : Codes.MATRIX_NOT_CONNECTED);
        }
예제 #6
0
 protected override int OnPrepare(Route route, int port, PollTask initiator)
 {
     route.Subscribe(this, (bytes, dir) =>
     {
         log.Trace(string.Format("[{0}] {1} [{2}]", GetName(), dir == Routes.Direction.FromInitiator ? "->" : "<-", string.Join(",", bytes.Select(b => b.ToString("X2")))));
         route.Send(this, bytes, dir);
     });
     return(0);
 }
예제 #7
0
        protected override int OnPrepare(Route route, int port, PollTask initiator)
        {
            if (!Directory.Exists(GetDir()))
            {
                return(Codes.NO_DIRECTORY);
            }



            return(Codes.SUCCESS);
        }
예제 #8
0
 protected override bool OnLock(Route route, PollTask initiator)
 {
     lock (locker)
     {
         if (isBroken)
         {
             return(false);
         }
         return(base.OnLock(route, initiator));
     }
 }
예제 #9
0
 /// <summary>
 /// блокировка канала узла,
 /// при переопределении важно сохранить потокобезопасность
 /// </summary>
 /// <param name="port"></param>
 /// <returns></returns>
 protected virtual bool OnLock(Route route, PollTask initiator)
 {
     lock (locker)
     {
         log.Trace($"попытка залочить {this} - {(IsLocked() ? $"НЕ ЗАЛОЧЕН: route={route}; lockroute={lockRoute}" : "успех")}");
         if (IsLocked())
         {
             return(false);
         }
         lockRoute = route;
         return(true);
     }
 }
예제 #10
0
 /// <summary>
 /// Stop the ZeroMQ Server and release all resources (including the NetMQ Cleanup)
 /// </summary>
 public void Stop()
 {
     Logger.Info("stopping server");
     Poller.Stop();
     PollTask.Wait();
     try
     {
         Poller.Dispose();
     } catch (Exception ex)
     {
         Logger.Fatal(ex, "could not dispose Poller");
     }
     Server.Dispose();
     NetMQConfig.Cleanup();
 }
예제 #11
0
        protected override int OnPrepare(Route route, int port, PollTask initiator)
        {
            log.Debug(string.Format("начата подготовка zlite {0}", GetAddr()));

            ////сначала таски соединения
            while (PollTaskManager.Instance.HasTaskForStarter(this))
            {
                var task = PollTaskManager.Instance.GetTaskForStarter(this);
                var what = task.What;
                switch (what.ToLower())
                {
                default: break;
                }
                task.Destroy();
            }

            if (initiator.Owner == this)
            {
                log.Debug(string.Format("завершена подготовка zlite {0} (успех)", GetAddr()));
                return(0);
            }

            route.Subscribe(this, (bytes, dir) =>
            {
                if (bytes == null)
                {
                    return;
                }

                log.Trace(string.Format("[{0}] -> [{1}]", this, string.Join(",", bytes.Select(b => b.ToString("X2")))));

                if (dir == Routes.Direction.ToInitiator)//К драйверу ОТ конечного устройства
                {
                    var body = ParsePackage(bytes);
                    if (body != null)
                    {
                        route.Send(this, body, dir);
                    }
                }
                else
                {
                    var pack = MakePackage(bytes);
                    route.Send(this, pack, dir);
                }
            });

            return(0);
        }
예제 #12
0
        //парсинг сообщений ИЛИ тут, ИЛИ в subscribe

        /*public override void Receive(byte[] bytes)
         * {
         *  DataProcess(bytes, FrameProcess);
         * }*/


        protected override int OnPrepare(Route route, int port, PollTask initiator)
        {
            subscriber[route] = (bytes) =>
            {
                route.Send(this, bytes, Routes.Direction.ToInitiator);
            };

            route.Subscribe(this, (bytes, dir) =>
            {
                // ОТ драйвера
                // ДО конечного устройства
                // Driver->Tube->ZLC-> !ZLP! -> ... -> Device
                // Приходит в формате Addr[4] + bytes[...]
                // Необходимо подготовить маршрут и сохранить (на время сессии) в массив
                // ЛИБО каждый раз передавать этот маршрут в составе сообщения
                if (dir == Routes.Direction.FromInitiator)
                {
                    var addr = bytes.Take(4).ToArray();
                    var body = bytes.Skip(4);
                    //var packed = new List<byte> { 0x02 };
                    //packed.AddRange(body);
                    var pack = MakePackage(addr, body.ToArray());
                    if (pack != null)
                    {
                        route.Send(this, pack, dir);
                    }
                }
                // ОТ конечного устройства
                // ДО драйвера
                // Device -> ... -> !ZLP! -> ZLC -> ... -> Driver
                // Ответ от устройства необходимо обработать в соответствии с номером маршрута
                // и отправить в формате ChipID[12] + bytes[...] на ZLC
                else
                {
                    DataProcess(bytes, FrameProcess);
                }
            });

            /*{
             *  Log(string.Format("открытие порта"));
             *  var pack = MakePackage(chipId, new byte[] { 0x01 });
             *  route.Send(this, pack, Routes.Direction.FromInitiator);
             * }*/

            return(0);
        }
예제 #13
0
        protected override int OnPrepare(Route route, int port, PollTask initiator)
        {
            try
            {
                socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                socket.Connect(GetHost(), GetPort());

                loop   = true;
                worker = new Thread(() =>
                {
                    try
                    {
                        var buffer = new byte[1024];
                        while (loop)
                        {
                            var readed = socket.Receive(buffer);
                            route.Send(this, buffer.Take(readed).ToArray(), Direction.ToInitiator);
                        }
                    }
                    catch (Exception ex)
                    {
                        log.Error(string.Format("остановлен поток lan соединения {0}:{1}", GetHost(), GetPort()), ex);
                    }
                });
                worker.IsBackground = true;
                worker.Name         = string.Format("поток {0}", this);
                worker.Start();

                route.Subscribe(this, (bytes, dir) =>
                {
                    socket.Send(bytes);
                });
            }
            catch (Exception ex)
            {
                log.Error(string.Format("приготовление {0}", this), ex);
                Log(string.Format("сокет НЕ соединен {0}", this));
                return(Codes.NO_SOCKET);
            }

            Log(string.Format("сокет соединен {0}", this));
            return(Codes.SUCCESS);
        }
예제 #14
0
        protected override int OnPrepare(Route route, int port, PollTask initiator)
        {
            if (!isReceiver)
            {
                Log("открытие COM-порта");

                serialIsReady = false;
                ComPortStart();

                int timeout = 20000;
                while ((timeout > 0) && (!serialIsReady))
                {
                    timeout -= 100;
                    Thread.Sleep(100);
                }

                if (!serialIsReady)
                {
                    Log("COM-порт занят другим приложением");
                    ComPortStop();
                    return(Codes.RESOURCE_BUSY);
                }
            }

            subscriber[route] = (bytes) =>
            {
                route.Send(this, bytes, Routes.Direction.ToInitiator);
            };

            route.Subscribe(this, (bytes, dir) =>
            {
                if (dir == Routes.Direction.FromInitiator)// К к.у. ОТ драйвера через ZigbeeConnection
                {
                    ComPortSend(bytes);
                }
                else // ОТ к.у. К драйверу
                {
                    //в idle
                }
            });

            return(0);
        }
예제 #15
0
        protected override int OnPrepare(Route route, int port, PollTask initiator)
        {
            log.Info(string.Format("начата подготовка модема из пула {0}", GetPort()));
            turnDtr(true);
            Thread.Sleep(2000);
            //  SendAt("AT&D2");
            callback = (bytes) =>
                       route.Send(this, bytes, Direction.ToInitiator);

            route.Subscribe(this, (bytes, forward) =>
            {
                log.Trace(string.Format("[{0}] -> [{1}]", GetPort(), string.Join(",", bytes.Select(b => b.ToString("X2")))));
                if (write != null)
                {
                    write(bytes);
                }
            });

            log.Debug(string.Format("завершена подготовка модема из пула {0}", GetPort()));
            return(Codes.SUCCESS);
        }
예제 #16
0
        protected override int OnPrepare(Route route, int port, PollTask initiator)
        {
            subscriber[route] = (bytes) =>
            {
                route.Send(this, bytes, Routes.Direction.ToInitiator);
            };

            route.Subscribe(this, (bytes, dir) =>
            {
                if (dir == Routes.Direction.FromInitiator)//К конечному устройству ОТ драйвера
                {
                    route.Send(this, bytes, dir);
                }
                else //парсинг сообщений
                {
                    DataProcess(bytes, FrameProcess);
                }
            });

            return(0);
        }
예제 #17
0
        protected override int OnPrepare(Route route, int port, PollTask initiator)
        {
            if (!isReceiver)
            {
                tcpIsReady = false;
                TcpClientStart();

                int timeout = 20000;
                while ((timeout > 0) && (!tcpIsReady))
                {
                    timeout -= 100;
                    Thread.Sleep(100);
                }

                if (!tcpIsReady)
                {
                    TcpClientStop();
                    return(Codes.RESOURCE_BUSY);
                }
            }

            subscriber[route] = (bytes) =>
            {
                route.Send(this, bytes, Routes.Direction.ToInitiator);
            };

            route.Subscribe(this, (bytes, dir) =>
            {
                if (dir == Routes.Direction.FromInitiator)// К к.у. ОТ драйвера через ZigbeeConnection
                {
                    TcpClientSend(bytes);
                }
                else // ОТ к.у. К драйверу
                {
                    //в idle
                }
            });

            return(0);
        }
예제 #18
0
        protected override int OnPrepare(Route route, int port, PollTask initiator)
        {
            bool isPortOpen = false;

            route.Subscribe(this, (bytes, forward) =>
            {
                // log.Debug(string.Format("[{0}] -> [{1}]", this, string.Join(",", bytes.Select(b => b.ToString("X2")))));

                if (forward == Direction.ToInitiator)
                {
                    route.Send(this, MakePackage((byte)port, bytes), forward);
                }
                else
                {
                    dynamic package = PackageParse(bytes);
                    if (!package.success)
                    {
                        return;
                    }
                }
            });
            return(isPortOpen ? Codes.SUCCESS : Codes.MATRIX_NOT_CONNECTED);
        }
예제 #19
0
 protected override bool OnLock(Route route, PollTask initiator)
 {
     return(IsConnected && base.OnLock(route, initiator));
 }
예제 #20
0
        protected override int OnPrepare(Route route, int port, PollTask initiator)
        {
            log.Debug(string.Format("начата подготовка терминала T/O WRX {0}", GetImei()));
            if (socket == null)
            {
                Log("контроллер не на связи");
                log.Debug(string.Format("завершена подготовка контроллера T/O WRX {0} (неудача)", GetImei()));
                return(Codes.MATRIX_NOT_CONNECTED);
            }

            //if (initiator.Owner == this)
            //{
            //    var what = initiator.What;
            //    switch (what.ToLower())
            //    {
            //        case "at":
            //            {
            //                var dcom = initiator.Arg as IDictionary<string, object>;
            //                var cmd = "at";
            //                if (dcom.ContainsKey("command")) cmd = initiator.Arg.command.ToString();
            //                Log(string.Format("команда контроллеру: '{0}'", cmd));
            //                SendAt(cmd);
            //                break;
            //            }
            //        case "change":
            //            {
            //                var dcom = initiator.Arg as IDictionary<string, object>;
            //                var server = "";
            //                if (dcom.ContainsKey("server")) server = initiator.Arg.server.ToString();
            //                if (server != "")
            //                {
            //                    Log(string.Format("смена сервера: '{0}'", server));
            //                    ChangeServer(server);
            //                }
            //                break;
            //            }
            //        case "version":
            //            Log(string.Format("запрос версии котроллера"));
            //            CheckVersion();
            //            break;
            //    }
            //    initiator.Destroy();
            //    return Codes.SUCCESS;
            //}

            bool isPortOpen = true;

            subscriber = (bytes) =>
            {
                isPortOpen = true;
                log.Trace(string.Format("[{0}] <- [{1}]", this, string.Join(",", bytes.Select(b => b.ToString("X2")))));
                route.Send(this, bytes, Direction.ToInitiator);
            };

            route.Subscribe(this, (bytes, forward) =>
            {
                if (bytes == null)
                {
                    return;
                }

                log.Trace(string.Format("[{0}] -> [{1}]", this, string.Join(",", bytes.Select(b => b.ToString("X2")))));

                //if (bytes.Length >= 6 && Encoding.ASCII.GetString(bytes, 0, 6) == "matrix")
                //{
                //    var cmd = bytes[6];
                //    var body = bytes.Skip(7).ToArray();
                //    SendDataToSocket(MakePackage(cmd, body));
                //}
                //else
                //{
                SendDataToSocket(bytes);// MakePackage((byte)port, bytes));
                //}
            });

            //CheckVersion();
            //Log(string.Format("открытие порта"));
            //OpenPort((byte)port);
            var timeout = 0;
            var period  = 100;

            while (!isPortOpen && timeout < 20000)
            {
                Thread.Sleep(period);
                timeout += period;
            }

            // isConnected = isPortOpen;

            if (isPortOpen)
            {
                Log(string.Format("контроллер на связи"));
                log.Debug(string.Format("[{0}] сокет соединен", this));
            }
            else
            {
                Log("контроллер не на связи, ожидание");
                log.Debug(string.Format("[{0}] сокет не соединен, опрос не возможен", this));
            }

            log.Debug(string.Format("[{0}] завершена подготовка контроллера TeleofisWrx ({1})", this, isPortOpen ? "успех" : "неудача"));
            return(isPortOpen ? Codes.SUCCESS : Codes.MATRIX_NOT_CONNECTED);
        }
예제 #21
0
        protected override int OnPrepare(Routes.Route route, int port, PollTask initiator)
        {
            var isOpen = false;

            route.Subscribe(this, (bytes, dir) =>
            {
                if (dir == Routes.Direction.ToInitiator)
                {
                    ParsePackage(bytes, pack =>
                    {
                        if (!pack.success)
                        {
                            log.Debug(string.Format("ошибка при обработке данных в свитче: {0}", pack.error));
                            return;
                        }

                        if (pack.channel != port)
                        {
                            return;
                        }

                        if (pack.cmd == 3)
                        {
                            byte[] clear = pack.body;
                            log.Debug(string.Format("[Switch] {0} {1}", dir == Routes.Direction.FromInitiator ? "->" : "<-", string.Join(",", clear.Select(b => b.ToString("X2")))));
                            route.Send(this, clear, dir);
                        }

                        //0x00 - OK; 0x82 - другой порт открыт?; 0x83 - порт УЖЕ открыт - OK
                        if (pack.cmd == 1 && (pack.body[0] == 0x00 || pack.body[0] == 0x83 || pack.body[0] == 0x82))
                        {
                            log.Debug(string.Format("[Switch] порт {0} открыт", port));
                            isOpen = true;
                        }
                    });
                }
                else
                {
                    byte[] pack = MakePackage(GetNA(), (byte)port, 0x02, bytes);
                    route.Send(this, pack, dir);
                    log.Trace(string.Format("[Switch] {0} {1}", dir == Routes.Direction.FromInitiator ? "->" : "<-", string.Join(",", pack.Select(b => b.ToString("X2")))));
                }
            });

            //команда на открытие порта
            route.Send(this, MakePackage(GetNA(), (byte)port, 0x01, new byte[] { }), Routes.Direction.FromInitiator);
            var tmt = 5000;

            while (!isOpen && tmt > 0)
            {
                tmt -= 100;
                Thread.Sleep(100);
            }

            if (isOpen)
            {
                log.Debug("свитч порт открыт");
            }
            else
            {
                log.Debug("свитч порт закрыт");
            }

            return(isOpen ? Codes.SUCCESS : Codes.MATRIX_NOT_CONNECTED);
        }
예제 #22
0
 protected override bool OnLock(Route route, PollTask initiator)
 {
     return(true);
 }
예제 #23
0
 public virtual void AfterTaskAdd(PollTask task)
 {
 }
예제 #24
0
 /// <summary>
 /// имеет шанс при повторе
 /// </summary>
 /// <returns></returns>
 public virtual bool HasChance(PollTask task)
 {
     return(false);
 }
예제 #25
0
 /// <summary>
 /// подготовка узла, звонок на номер, открытие порта, создание сокета и т.п.
 /// </summary>
 /// <returns></returns>
 protected virtual int OnPrepare(Route route, int port, PollTask initiator)
 {
     return(0);
 }
예제 #26
0
 public virtual bool BeforeTaskAdd(PollTask task)
 {
     return(true);
 }
예제 #27
0
 protected override bool OnLock(Route route, PollTask initiator)
 {
     //return (!IsSleeping() || !IsAsleep) && base.OnLock(route);
     return(!IsAsleep && base.OnLock(route, initiator));
 }
예제 #28
0
 public override bool HasChance(PollTask task)
 {
     return(true);
 }
예제 #29
0
 public int Prepare(Route route, int port, PollTask initiator)
 {
     return(OnPrepare(route, port, initiator));
 }
예제 #30
0
 public virtual void AfterTaskSkip(PollTask task)
 {
 }