/// <summary> /// Отправить команду ТУ /// </summary> public override void SendCmd(Command cmd) { base.SendCmd(cmd); lastCommSucc = false; if (cmd.CmdType == CmdType.Binary && (cmd.CmdNum == 1 || cmd.CmdNum == 2)) { string logText; // текст для вывода в log-файл линии связи string cmdData = new string(Encoding.Default.GetChars(cmd.CmdData)); if (cmdData.Length > 0) { if (cmd.CmdNum == 1) { // отправка сообщения // данные команды: <телефон>;<текст> // телефонный номер указывается только для основного КП на линии связи int scPos = cmdData.IndexOf(';'); string phone = primary ? (scPos > 0 ? cmdData.Substring(0, scPos).Trim() : "") : CallNum; string text = scPos < 0 ? cmdData : scPos + 1 < cmdData.Length ? cmdData.Substring(scPos + 1).Trim() : ""; if (phone == "" || text == "") { WriteToLog(Localization.UseRussian ? "Отсутствует телефонный номер или текст сообщения" : "No telephone number or message text"); } else { int pduLen; string pdu = MakePDU(phone, text, out pduLen); KPUtils.WriteLineToSerialPort(SerialPort, "AT+CMGS=" + pduLen, out logText); WriteToLog(logText); Thread.Sleep(100); try { if (SerialPort != null) { SerialPort.NewLine = "\x1A"; } KPUtils.WriteLineToSerialPort(SerialPort, pdu, out logText); WriteToLog(logText); } finally { if (SerialPort != null) { SerialPort.NewLine = "\x0D"; } } List <string> inData = KPUtils.ReadLinesFromSerialPort(SerialPort, KPReqParams.Timeout, false, "OK", out lastCommSucc, out logText); WriteToLog(logText); Thread.Sleep(KPReqParams.Delay); } } else { // произвольная AT-команда KPUtils.WriteLineToSerialPort(SerialPort, cmdData, out logText); WriteToLog(logText); List <string> inData = KPUtils.ReadLinesFromSerialPort(SerialPort, KPReqParams.Timeout, false, new string[] { "OK", "ERROR" }, out lastCommSucc, out logText); WriteToLog(logText); Thread.Sleep(KPReqParams.Delay); } } else { WriteToLog(Localization.UseRussian ? "Отсутствуют данные команды" : "No command data"); } } else { WriteToLog(Localization.UseRussian ? "Недопустимая команда" : "Illegal command"); } CalcCmdStats(); }
/// <summary> /// Сеанс опроса основного КП /// </summary> private void PrimarySession() { string logText; // текст для вывода в log-файл линии связи int i; // отключение эхо if (WorkState != WorkStates.Normal) { lastCommSucc = false; i = 0; while (i < CommLineParams.TriesCnt && !lastCommSucc && !Terminated) { WriteToLog(Localization.UseRussian ? "Отключение эхо" : "Set echo off"); KPUtils.WriteLineToSerialPort(SerialPort, "ATE0", out logText); WriteToLog(logText); KPUtils.ReadLinesFromSerialPort(SerialPort, KPReqParams.Timeout, false, "OK", out lastCommSucc, out logText); WriteToLog(logText); FinishRequest(); i++; } } // сброс вызова if (lastCommSucc) { lastCommSucc = false; i = 0; while (i < CommLineParams.TriesCnt && !lastCommSucc && !Terminated) { WriteToLog(Localization.UseRussian ? "Сброс вызова" : "Drop call"); KPUtils.WriteLineToSerialPort(SerialPort, "ATH" /*"AT+CHUP"*/, out logText); WriteToLog(logText); List <string> inData = KPUtils.ReadLinesFromSerialPort(SerialPort, KPReqParams.Timeout, false, "OK", out lastCommSucc, out logText); WriteToLog(logText); FinishRequest(); i++; } } // обработка и удаление сообщений, полученных ранее int eventCnt = 0; // количество созданных событий if (lastCommSucc) { foreach (Message msg in messageList) { // обработка сообщения, если оно не обработано другими КП try { object[] msgObjArr = msg.Reference; if (!(bool)msgObjArr[5] /*сообщение не обработано*/ && (int)msgObjArr[1] <= 1 /*принятое сообщение*/) { // запись события WriteEvent(msg.TimeStamp, msg.Phone, msg.Text, ref eventCnt); msgObjArr[5] = true; } } catch { WriteToLog((Localization.UseRussian ? "Ошибка при обработке сообщения " : "Error processing message ") + msg.Index); } // удаление сообщений из памяти GSM-терминала bool deleteComplete = false; i = 0; while (i < CommLineParams.TriesCnt && !deleteComplete && !Terminated) { WriteToLog((Localization.UseRussian ? "Удаление сообщения " : "Delete message ") + msg.Index); KPUtils.WriteLineToSerialPort(SerialPort, "AT+CMGD=" + msg.Index, out logText); WriteToLog(logText); KPUtils.ReadLinesFromSerialPort(SerialPort, KPReqParams.Timeout, false, "OK", out deleteComplete, out logText); WriteToLog(logText); FinishRequest(); i++; } lastCommSucc = lastCommSucc && deleteComplete; } messageList.Clear(); GetMessageObjList().Clear(); } IncEventCount(eventCnt); if (lastCommSucc) { WriteToLog((Localization.UseRussian ? "Количество полученных сообщений: " : "Received message count: ") + eventCnt); } // запрос списка сообщений if (lastCommSucc) { lastCommSucc = false; i = 0; while (i < CommLineParams.TriesCnt && !lastCommSucc && !Terminated) { WriteToLog(Localization.UseRussian ? "Запрос списка сообщений" : "Request message list"); KPUtils.WriteLineToSerialPort(SerialPort, "AT+CMGL=4", out logText); WriteToLog(logText); List <string> inData = KPUtils.ReadLinesFromSerialPort(SerialPort, KPReqParams.Timeout, false, "OK", out lastCommSucc, out logText); WriteToLog(logText); // расшифровка сообщений if (lastCommSucc) { string errMsg; if (!FillMessageList(inData, out errMsg)) { WriteToLog(errMsg); lastCommSucc = false; } } FinishRequest(); i++; } // запись сообщений в общие свойства линии связи List <object[]> msgObjList = GetMessageObjList(); foreach (Message msg in messageList) { object[] msgObjArr = ConvertMessage(msg); msg.Reference = msgObjArr; msgObjList.Add(msgObjArr); } } // определение наличия связи double newVal = lastCommSucc ? 1.0 : -1.0; SetParamData(0, newVal, 1); }