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); }
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); }
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); }
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); }
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); }
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); }
protected override int OnPrepare(Route route, int port, PollTask initiator) { if (!Directory.Exists(GetDir())) { return(Codes.NO_DIRECTORY); } return(Codes.SUCCESS); }
protected override bool OnLock(Route route, PollTask initiator) { lock (locker) { if (isBroken) { return(false); } return(base.OnLock(route, initiator)); } }
/// <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); } }
/// <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(); }
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); }
//парсинг сообщений ИЛИ тут, ИЛИ в 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); }
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); }
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); }
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); }
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); }
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); }
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); }
protected override bool OnLock(Route route, PollTask initiator) { return(IsConnected && base.OnLock(route, initiator)); }
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); }
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); }
protected override bool OnLock(Route route, PollTask initiator) { return(true); }
public virtual void AfterTaskAdd(PollTask task) { }
/// <summary> /// имеет шанс при повторе /// </summary> /// <returns></returns> public virtual bool HasChance(PollTask task) { return(false); }
/// <summary> /// подготовка узла, звонок на номер, открытие порта, создание сокета и т.п. /// </summary> /// <returns></returns> protected virtual int OnPrepare(Route route, int port, PollTask initiator) { return(0); }
public virtual bool BeforeTaskAdd(PollTask task) { return(true); }
protected override bool OnLock(Route route, PollTask initiator) { //return (!IsSleeping() || !IsAsleep) && base.OnLock(route); return(!IsAsleep && base.OnLock(route, initiator)); }
public override bool HasChance(PollTask task) { return(true); }
public int Prepare(Route route, int port, PollTask initiator) { return(OnPrepare(route, port, initiator)); }
public virtual void AfterTaskSkip(PollTask task) { }