2013-08-29 3 views
0

Я послал команду USSD, используя этот код:Как получить ответный результат при отправке команд USSD в C#?

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», но когда я отправлю эту команду собственным приложением модема, вы получите правильный ответ от оператора, это означает, что моя команда отправки в порядке, но это приложение получает ответ, но я получаю половину.

+0

У вас есть решение? Im, сталкивающееся с той же проблемой. –

+0

Это связано с тем, что код сначала получает ответ модема (это нормально), и через небольшой промежуток времени получает ответ сети (который является фактическим балансовым сообщением) –

ответ

1

На самом деле я обновил код и теперь он работает с библиотекой 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 ""; 
    } 
Смежные вопросы