/// <summary> /// Обработать доступные данные в режиме соединения Individual /// </summary> protected void ProcAvailableDataIndiv(TcpConnection tcpConn) { if (tcpConn.RelatedKPExists) { // обработка входящего запроса в режиме ведомого для первого КП из группы с одинаковым позывным if (slaveBehavior) { KPLogic targetKP = tcpConn.GetFirstRelatedKP(); if (!ExecProcUnreadIncomingReq(targetKP, tcpConn, ref targetKP)) { tcpConn.ClearNetStream(inBuf); } } } else { // привязка соединения к КП по первому пакету данных if (devSelByFirstPackage) { if (tcpConn.JustConnected) { string firstPackage = ReceiveFirstPackage(tcpConn); if (!BindConnByFirstPackage(tcpConn, firstPackage)) { tcpConn.Broken = true; } } } else if (devSelByDeviceLibrary) { // привязка соединения к КП, используя произвольную библиотеку КП if (kpListNotEmpty) { KPLogic targetKP = null; if (!ExecProcUnreadIncomingReq(firstKP, tcpConn, ref targetKP)) { tcpConn.ClearNetStream(inBuf); } BindConnByDeviceLibrary(tcpConn, targetKP); } } } tcpConn.JustConnected = false; }
/// <summary> /// Выполнить действия после сеанса опроса КП или отправки команды /// </summary> public override void AfterSession(KPLogic kpLogic) { // очистка потока данных, если сеанс опроса КП завершён с ошибкой if (kpLogic.WorkState == KPLogic.WorkStates.Error && Behavior == OperatingBehaviors.Master) { TcpConnection tcpConn = kpLogic.Connection as TcpConnection; if (tcpConn != null && tcpConn.Connected) { tcpConn.ClearNetStream(inBuf); } } }
/// <summary> /// Обработать доступные данные в режиме соединения Shared /// </summary> protected void ProcAvailableDataShared(TcpConnection tcpConn) { // обработка входящего запроса в режиме ведомого для произвольного КП if (tcpConn == sharedTcpConn && slaveBehavior && firstKP != null) { KPLogic targetKP = null; if (!ExecProcUnreadIncomingReq(firstKP, tcpConn, ref targetKP)) { tcpConn.ClearNetStream(inBuf); } } }
/// <summary> /// Цикл приёма данных по индивидуальным соединениям в режиме ведомого (метод вызывается в отдельном потоке) /// </summary> protected void ListenIndividualConn() { try { while (!terminated) { foreach (KPLogic kpLogic in kpList) { TcpConnection tcpConn = kpLogic.Connection as TcpConnection; if (tcpConn != null && tcpConn.TcpClient.Available > 0) { KPLogic targetKP = kpLogic; if (!ExecProcUnreadIncomingReq(kpLogic, tcpConn, ref targetKP)) { sharedTcpConn.ClearNetStream(inBuf); } } } Thread.Sleep(SlaveThreadDelay); } } catch (Exception ex) { // данное исключение возникать не должно if (Localization.UseRussian) { WriteToLog("Ошибка при приёме данных по индивидуальным соединениям: " + ex.Message); WriteToLog("Приём данных прекращён"); } else { WriteToLog("Error receiving data via individual connections: " + ex.Message); WriteToLog("Data receiving is terminated"); } } }
/// <summary> /// Обработать доступные данные в режиме соединения Shared /// </summary> protected void ProcAvailableDataShared(TcpConnection tcpConn) { // обработка входящего запроса в режиме ведомого для произвольного КП if (tcpConn == sharedTcpConn && slaveBehavior && firstKP != null) { KPLogic targetKP = null; if (!ExecProcUnreadIncomingReq(firstKP, tcpConn, ref targetKP)) tcpConn.ClearNetStream(inBuf); } }
/// <summary> /// Обработать доступные данные в режиме соединения Individual /// </summary> protected void ProcAvailableDataIndiv(TcpConnection tcpConn) { if (tcpConn.RelatedKPExists) { // обработка входящего запроса в режиме ведомого для первого КП из группы с одинаковым позывным if (slaveBehavior) { KPLogic targetKP = tcpConn.GetFirstRelatedKP(); if (!ExecProcUnreadIncomingReq(targetKP, tcpConn, ref targetKP)) tcpConn.ClearNetStream(inBuf); } } else { // привязка соединения к КП по первому пакету данных if (devSelByFirstPackage) { if (tcpConn.JustConnected) { string firstPackage = ReceiveFirstPackage(tcpConn); if (!BindConnByFirstPackage(tcpConn, firstPackage)) tcpConn.Broken = true; } } else if (devSelByDeviceLibrary) { // привязка соединения к КП, используя произвольную библиотеку КП if (kpListNotEmpty) { KPLogic targetKP = null; if (!ExecProcUnreadIncomingReq(firstKP, tcpConn, ref targetKP)) tcpConn.ClearNetStream(inBuf); BindConnByDeviceLibrary(tcpConn, targetKP); } } } tcpConn.JustConnected = false; }