/// <summary>
        /// Конструктор клиентской части
        /// </summary>
        /// <param name="readerPortName">Имя считываюшего порта</param>
        /// <param name="writerPortName">Имя порта для записи</param>
        /// <param name="id">Идентификатор клиента</param>
        /// <param name="portSpeed">Скорость портов</param>
        public CommunicationUnit(string readerPortName,string writerPortName, byte id, int portSpeed)
        {
            _readPorts = new SerialPort[1];

            _readPorts[0] = new SerialPort();
            _readPorts[0].PortName = readerPortName;
            _readPorts[0].BaudRate = portSpeed;
            _readPorts[0].Parity = Parity.None;
            _readPorts[0].DataBits = 8;
            _readPorts[0].StopBits = StopBits.One;
            _readPorts[0].Handshake = Handshake.None;
            _readPorts[0].ReadTimeout = 500;
            _readPorts[0].WriteTimeout = 500;
            _readPorts[0].WriteBufferSize = 65000;
            _readPorts[0].ReadBufferSize = 65000;
            _readPorts[0].ReadTimeout = 5000;

               _comPortWriter = new SerialPort();
               _comPortWriter.PortName = writerPortName;
               _comPortWriter.BaudRate = portSpeed;
               _comPortWriter.Parity = Parity.None;
               _comPortWriter.DataBits = 8;
               _comPortWriter.StopBits = StopBits.One;
               _comPortWriter.Handshake = Handshake.None;
               _comPortWriter.ReadTimeout = 500;
               _comPortWriter.WriteTimeout = 500;
               _comPortWriter.WriteBufferSize = 65000;
               _comPortWriter.ReadBufferSize = 65000;

            // Особая уличная кодировка для правильной отправки байтов чьё значение больше 127-ми
            _readPorts[0].Encoding = Encoding.GetEncoding(28591);
            _comPortWriter.Encoding = Encoding.GetEncoding(28591);

               ProcessedFileSize = 0;

               IsRecivingFile = false;

            ClietnId = id;

            Client.Continue = true;

            // Добавление клиента "Сервер" с id 0 для получения информации для инициализации и дальнейших коммуникаций
            _clientArray.Add(0, new Client((byte)0, ClietnId, _outMessageQueueSize, _comPortWriter));

            ReOpenPort(_readPorts[0]);
            ReOpenPort(_comPortWriter);

            _selfCheckingThread = new Thread(SelfChecking);
            _selfCheckingThread.Start();

            // Отправка запроса на инициализацию
            SendInitializationRequest();

               var initData = ReadInitialization(_readPorts[0]);

               _broadcastManager = new BroadcastManager(initData.EnabledClients.Length);

               _enabledClientIDs = initData.EnabledClients;

               ClientNames = initData.Names;

               // Подписывает на события от сервера
               _clientArray[0].AcknowledgeRecived +=
               new EventHandler<MessageRecivedEventArgs>(ClientAcknowledgeRecived);

               _clientArray[0].AcknowledgeRecived +=
                new EventHandler<MessageRecivedEventArgs>(_broadcastManager.ReceiveAcknowledge);

               SetSystemDateTime(initData.SycDateTime);

               // Создание объекто для каждого клиента, обхект с номер равным номеру текущего клиента используется для широковещательных сообщений
              foreach (int client in initData.EnabledClients)
              {
              _clientArray.Add(client, new Client((byte)client, ClietnId, _outMessageQueueSize, _comPortWriter));

              // Подписывает на события от клиента
              _clientArray[client].AcknowledgeRecived +=
                  new EventHandler<MessageRecivedEventArgs>(ClientAcknowledgeRecived);

              _clientArray[client].AcknowledgeRecived +=
                   new EventHandler<MessageRecivedEventArgs>(_broadcastManager.ReceiveAcknowledge);
              }

            //for (int i = 0; i < 5; i++)
            //{
            //    //  _clientArray[i] = new Client((byte)i,ClietnId, _outMessageQueueSize, _comPortWriter);
            //    _clientArray.Add(i, new Client((byte)i, ClietnId, _outMessageQueueSize, _comPortWriter));
            //
            //    // Подписывает на обработку события получения состояния  доставки пакета
            //    _clientArray[i].AcknowledgeRecived +=
            //        new EventHandler<MessageRecivedEventArgs>(ClientAcknowledgeRecived);
            //
            //    _clientArray[i].AcknowledgeRecived +=
            //        new EventHandler<MessageRecivedEventArgs>(_broadcastManager.ReceiveAcknowledge);
            //}

            _waitFileTransferAnswerTimer = new Timer(WaitFileAnswerTransfer);

            _readThread = new Thread(Read);
            _readThread.Start(_readPorts[0]);
        }
        // TODO Убрать возможность определять ID для сервера сделать его всегда 0
        /// <summary>
        /// Конструктор серверной части 
        /// </summary>
        /// <param name="readerPortName1">Имя первого считываюшего порта </param>
        /// <param name="readerPortName2">Имя второго считываюшего порта</param>
        /// <param name="readerPortName3">Имя третьего считываюшего порта</param>
        /// <param name="readerPortName4">Имя четвертого считываюшего порта</param>
        /// <param name="writerPortName">Имя порта для записи</param>
        /// <param name="id">Идентификатор сервера, необходимо установить 0</param>
        /// <param name="portSpeed">Скорость портов</param>
        /// <param name="enabledClientIDs">ID достуаных клиентов</param>
        public CommunicationUnit(string readerPortName1, string readerPortName2, string readerPortName3, string readerPortName4, string writerPortName, byte id, int portSpeed, int[] enabledClientIDs, Dictionary<int, string> names)
        {
            _isServer = true;

               //ClientNames = new Dictionary<int, string>();
               //ClientNames = (from x in names
               //                  select x).ToDictionary(x => x.Key, x => x.Value);

               ClientNames = new Dictionary<int, string>(names);

               _readPorts = new SerialPort[4];

               _comPortWriter = new SerialPort();
               _comPortWriter.PortName = writerPortName;
               _comPortWriter.BaudRate = portSpeed;
               _comPortWriter.Parity = Parity.None;
               _comPortWriter.DataBits = 8;
               _comPortWriter.StopBits = StopBits.One;
               _comPortWriter.Handshake = Handshake.None;
               _comPortWriter.ReadTimeout = 500;
               _comPortWriter.WriteTimeout = 500;
               _comPortWriter.WriteBufferSize = 65000;
               _comPortWriter.ReadBufferSize = 65000;

               _comPortWriter.Encoding = Encoding.GetEncoding(28591);

               ReOpenPort(_comPortWriter);

               _readPorts[0] = new SerialPort();
               _readPorts[0].PortName = readerPortName1;

               _readPorts[1] = new SerialPort();
               _readPorts[1].PortName = readerPortName2;

               _readPorts[2] = new SerialPort();
               _readPorts[2].PortName = readerPortName3;

               _readPorts[3] = new SerialPort();
               _readPorts[3].PortName = readerPortName4;

               Client.Continue = true;

               for (int i = 0; i < _readPorts.Length; i++)
               {
               _readPorts[i].BaudRate = portSpeed;
               _readPorts[i].Parity = Parity.None;
               _readPorts[i].DataBits = 8;
               _readPorts[i].StopBits = StopBits.One;
               _readPorts[i].Handshake = Handshake.None;
               _readPorts[i].ReadTimeout = 500;
               _readPorts[i].WriteTimeout = 500;
               _readPorts[i].WriteBufferSize = 65000;
               _readPorts[i].ReadBufferSize = 65000;
               _readPorts[i].ReadTimeout = 5000;

               _readPorts[i].Encoding = Encoding.GetEncoding(28591);

               ReOpenPort(_readPorts[i]);

              _readThread = new Thread(Read);
              _readThread.Start(_readPorts[i]);
               }

               ProcessedFileSize = 0;

               IsRecivingFile = false;

               ClietnId = id;

               // Создание объекто для каждого клиента, обхект с номер равным номеру текущего клиента используется для широковещательных сообщений
               //  for (int i = 0; i < 5; i++)
               //  {
               //     // _clientArray[i] = new Client((byte)i, ClietnId, _outMessageQueueSize, _comPortWriter);
               //      _clientArray.Add(i, new Client((byte)i, ClietnId, _outMessageQueueSize, _comPortWriter));
               //
               //      // Подписывает на события от клиента
               //      _clientArray[i].AcknowledgeRecived +=
               //          new EventHandler<MessageRecivedEventArgs>(ClientAcknowledgeRecived);
               //
               //      _clientArray[i].AcknowledgeRecived +=
               //           new EventHandler<MessageRecivedEventArgs>(_broadcastManager.ReceiveAcknowledge);
               //
               //  }

               _enabledClientIDs = enabledClientIDs;

               _broadcastManager = new BroadcastManager(enabledClientIDs.Length);

               foreach (int client in enabledClientIDs)
               {
               _clientArray.Add(client, new Client((byte)client, ClietnId, _outMessageQueueSize, _comPortWriter));

               // Подписывает на события от клиента
               _clientArray[client].AcknowledgeRecived +=
                   new EventHandler<MessageRecivedEventArgs>(ClientAcknowledgeRecived);

               _clientArray[client].AcknowledgeRecived +=
                    new EventHandler<MessageRecivedEventArgs>(_broadcastManager.ReceiveAcknowledge);
               }

               _waitFileTransferAnswerTimer = new Timer(WaitFileAnswerTransfer);

               _routerQueue = new ConcurrentQueue<Packet.Packet>();

               _routerThread = new Thread(Route);
               _routerThread.Start();

               _selfCheckingThread = new Thread(SelfChecking);
               _selfCheckingThread.Start();
        }