Подключение к GSM модему через сокеты - C#

Узнай цену своей работы

Формулировка задачи:

Добрый день. Помогите разобраться с проблемой. Я подключаюсь к модему для того чтобы передать сообщение. Алгоритм работы такой: сообщение поступает в очередь которую мониторит вторичный поток, проверяется наличие соединения с модемом, если соединения нет, происходит подключение к нему синхронным методом, затем отправляется сообщение и соединение закрывается. Все работает как и должно, но в какой-то момент после долгого простоя в программе возникает исключение во время отправки поступившего сообщения: 1. The operation is not allowed on non-connected sockets. 2. No connection could be made because the target machine actively refused it 10.81.134.61:4001 Т.е я так понимаю ситуация такая: поступило сообщение, проверяется наличие соединения с модемом, его нет, вызывается:
 
client = new TcpClient();
            client.Connect(config.Host, config.Port);
 
            //Чтоб метод Read не блокировал на долго программу
            client.ReceiveTimeout = 10000;
 
            stream = new ClearedStreamReader(client.GetStream());
Этот метод отрабатывает нормально, мы пытаемся отправить сообщение и выскакивает ошибка 1. В случае ошибки мы разрываем соединение и открываем новое, но открыть новое не можем потому что соединение уже есть и следовательно возникает ошибка 2. Как так ведь из сообщения 1 следует что соединение так и не было открыто? Вот участок кода отправки сообщения:
 /// <summary>
       /// Проверка очереди сообщений, и отправка имеющихся сообщений
       /// </summary>
        private void MsgQueueChecker()
        {
            Notice data = null;
            while (isLoop)
            {
                try
                {
                    if (msgQueue != null && msgQueue.Count != 0)
                    {
//Если соедиенения нет открываем его
                        if (!plugin.IsConnected)
                        {
                            plugin.Connect();                           
                        }
 
                        //сперва получаем объект и если отправка прошла успешно только тогда удалим
                        lock (locker)
                        {
                            data = (Notice)msgQueue.Peek();

                            if (data == null)
                            {
                                OnDebug("Список сообщений пуст");
                                continue;
                            }
//Если сообщение в очереди больше 60 минутт не отправляем его
                            if (isOldMessages(data, 60))
                            {
                                if (msgQueue.Count > 0)
                                    msgQueue.Dequeue();
                                OnDebug("Удаление старого сообщения. ");
                                continue;
                            }
                        }
 
                        OnDebug("Отправка сообщения");
 
                        if (plugin.Send(data))
                        {
                            OnMessageSended(data);
                            OnEventInfo("Сообщение отправлено");
 
                            lock (locker)
                            {
                                if (msgQueue.Count > 0)
                                    msgQueue.Dequeue();
                            }
                        }
                        else
                        {
                            OnEventWarrning("Сбой отправки сообщения.");
                            if (plugin.IsConnected)
                            {
                                plugin.Disconnect();
                            }
                            Thread.Sleep(5000);
                        }
                    }
                    else
                    {
                        if (plugin.IsConnected)
                        {
                            plugin.Disconnect();
                        }
                        Thread.Sleep(5000);
                    }
                }
                catch (Exception ex)
                {
                    OnEventError(ex.Message);
 
                    if (plugin.IsConnected)
                    {
                        plugin.Disconnect();
                    }
 
                    Thread.Sleep(5000);
                }
            }
 
            if (plugin.IsConnected)
            {
                plugin.Disconnect();
            }
        }

Решение задачи: «Подключение к GSM модему через сокеты»

textual
Листинг программы
AT+CGATT=1
AT#APNSERV="xxxx"
AT#APNUN="yyyy"
AT#APNPW="zzzz"
AT#CONNECTIONSTART

{ Подсоединение к TCP- cерверу }
AT#DLEMODE=1,0
AT#TCPSERV=1,"xxx.xxx.xxx.xxx"
AT#OTCP=1

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.429 из 5
Похожие ответы