Подключение к 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
Т.е я так понимаю ситуация такая: поступило сообщение, проверяется наличие соединения с модемом, его нет, вызывается:
Этот метод отрабатывает нормально, мы пытаемся отправить сообщение и выскакивает ошибка 1.
В случае ошибки мы разрываем соединение и открываем новое, но открыть новое не можем потому что соединение уже есть и следовательно возникает ошибка 2. Как так ведь из сообщения 1 следует что соединение так и не было открыто? Вот участок кода отправки сообщения:
client = new TcpClient(); client.Connect(config.Host, config.Port); //Чтоб метод Read не блокировал на долго программу client.ReceiveTimeout = 10000; stream = new ClearedStreamReader(client.GetStream());
/// <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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д