Ejemplo n.º 1
0
        /// <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();
        }
Ejemplo n.º 2
0
        /// <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);
        }