Как получить результат ответа при отправке USSD-команд в С#?

Я отправил USSD-команду, используя этот код:

SerialPort port = new SerialPort();

port.BaudRate = 921600;
port.PortName = "COM16";
port.Parity = Parity.None;
port.DataBits = 8;
port.StopBits = StopBits.One;
port.ReadTimeout = 3000;
port.WriteTimeout = 3000;
port.DataReceived += port_DataReceived;

port.Open();

port.Write("AT+CUSD=1,\"*140*1#\"" + "\r\n");

void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
        SerialPort spL = (SerialPort)sender;
        byte[] buf = new byte[spL.BytesToRead];
        spL.Read(buf, 0, buf.Length);

        foreach (Byte b in buf)
        {
            message += b.ToString();
        }

        var result = Encoding.ASCII.GetString(buf);//just return OK
    }

Зачем просто получать OK в результате?

в этом случае я хочу получить свой баланс, и я должен получить ответ вроде этого: "ваш баланс 100$...", но просто получить: "AT+CUSD=1,\"*140*1#\"\r\ n\OK\r\n", но когда я отправляю эту команду собственным приложением модема, получаю правильный ответ от оператора, это означает, что моя отправляющая команда в порядке, но это приложение получает весь ответ, а я получаю половину.


person motevalizadeh    schedule 29.08.2013    source источник
comment
У вас есть решение? Я столкнулся с той же проблемой.   -  person Shofiqul Alam    schedule 10.02.2015
comment
Это связано с тем, что код сначала получает ответ модема (что нормально), а через небольшой промежуток времени получает ответ сети (который является фактическим сообщением о балансе).   -  person Reza Mortazavi    schedule 14.04.2016


Ответы (2)


На самом деле я обновил код, и теперь он работает с библиотекой GSMCOMM. Я могу проверить свой баланс и увидеть ответ. Я просто добавил ответ к строковой переменной, пока еще получал ответ.

public string SendUssdRequest(string request)
    {
        log.DebugFormat("Sending USSD Request {0}", request);
        string result = "";
        try
        {
            IProtocol protocol = comm.GetProtocol();
            string gottenString = protocol.ExecAndReceiveMultiple("AT+CUSD=1," + request + ",15");
            result = gottenString;
            int i = 0;
            if (!gottenString.Contains("\r\n+CUSD: 2"))
            {
                bool receiving = false;
                do
                {
                    receiving = protocol.Receive(out gottenString);
                    result += gottenString;
                    ++i;
                } while (receiving);
            }

            result = result.Replace("\r\n", "");

            result = result.Replace("+CUSD: 2,", "");
            result = result.Replace(",15", "");
            log.DebugFormat("{1} - USSD Response is:  {0}", result,SenderNumber);
            return result;
        }
        catch(Exception ex) 
        {
            log.Error(ex);
        }
        finally
        {

            comm.ReleaseProtocol();
        }
        return "";
    }
person Scrappy    schedule 02.03.2015

в конце кода

port.Write("AT+CUSD=1,\"*140*1#\"" + ",15\r");

person AbdusSalam    schedule 03.04.2014