2013-07-10 6 views
3

비슷한 주제가이 포럼에 게시 된 것을 보았지만 AT 명령을 보내고 응답을받는 방법을 이해할 수 없습니다. (몇 달 전에 C#에서 프로그램을 시작했는데 아직도 n00b이지만 배우기 위해 열심히 노력하고 있습니다 ...).GSM 모뎀을 통한 SMS 수신

GSM USB 동글을 통해서만 SMS 메시지를받을 수있는 응용 프로그램을 만들어야합니다. 지금까지 사용 가능한 COM 포트를 통해 모뎀을 인식하고 연결하는 응용 프로그램을 만들었습니다. 이제 메시지를 받고 textBox에 표시하기 위해 AT 명령을 전달해야합니다. 누군가가 저에게 프로세스를 설명 할 수 있을지 궁금 해서요. 코드를 주석으로 수정하여 통신을 위해 serialPort를 사용하는 방법을 배우고 이해할 수 있는지 궁금합니다. 내가 알아야 할 것은, SMS가 전송 될 때,이 메시지는 GSM 모뎀에 의해 수신되고 저장되며 (일부 메시지를 읽을 때까지 저장되거나 메시지 수집을 위해 GSM 모뎀을 트리거하는 이벤트를 보내야 할 필요가있을 때까지 저장 됨) ISP로부터)? AT 명령을 푸시하고 응답을 수신하는 방법 (단, serialPort 객체를 사용하여 완료된다는 것을 알고 있지만 실마리가 없습니다.)

이것은 수신하기위한 방법입니다. 나는 그것을 알아낼 때까지 기꺼이 누군가가 도움이되면 나는 내 자신에 의해 그것을 처리해야하지 않을 경우, 나는 그것을 감사하겠습니다

private void receiveMessage() 
{ 
    //commclass is only a class for getting COM port, baud rate and timeout 
    CommClass cc = new CommClass(); 
    cc.setParameters(); 
    serialPort1.PortName = cc.getPort(); 
    serialPort1.BaudRate = cc.getBaud(); 
    serialPort1.ReadTimeout = cc.getTimeout(); 
    serialPort1.Open(); 

    if (!serialPort1.IsOpen) 
    { 
     //MessageBox is written in Croatian language, it is only an alert to check the configuration because port is not opened... 
     MessageBox.Show("Modem nije spojen, molimo provjerite konfiguraciju...!"); 
     //timer1.Stop(); 
    } 
    else 
    { 
     //this.label2.Text = serialPort1.PortName; 
     //this.label2.Visible = true; 
     //this.label3.Visible = true; 
     //this is where I need to place a code for receiving all SMS messages 
     this.serialPort1.Write("AT+CMGL=\"REC UNREAD\""); 
    } 
    serialPort1.Close(); 
} 

) : ... BTW 붙어 (아마 몇 시간/일 소요 ...)

두 경우 모두 고맙습니다. 건배.

답변

5

최근에 답장을 보내 주셔서 죄송합니다. 최근에 바빴습니다. 이것은 GSM USB 동글에서 메시지를 가져 오는 코드입니다. 나는 그것이 누군가에게 유용 할 것이라는 점을 희망한다. ...

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Drawing; 
using System.Data; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.IO.Ports; 

namespace SMSget 
{ 
public partial class SMSLogPanel : UserControl 
{ 
    SerialPort sp; 
    int datab = 0; 
    bool dtr = false; 
    bool encod; 
    Handshake h; 
    Parity p; 
    int wtimeout = 0; 
    StopBits s; 

    #region default constructor 
    public SMSLogPanel() 
    { 
     InitializeComponent(); 
     this.sp = serialPort1 = new SerialPort(); 
     this.datab = serialPort1.DataBits = 8; 
     this.dtr = serialPort1.DtrEnable = true; 
     this.encod = serialPort1.Encoding.Equals("iso-8859-1"); 
     this.h = serialPort1.Handshake = Handshake.RequestToSend; 
     this.p = serialPort1.Parity = Parity.None; 
     this.wtimeout = serialPort1.WriteTimeout = 300; 
     this.s = serialPort1.StopBits = StopBits.One; 
     checkLink(); 
    } 
    #endregion 
    #region checking communication and setting user controls... 
    private void checkLink() 
    { 
     GetValues value = new GetValues(); 
     string com = value.getPort(); 
     int baud = value.getBaud(); 
     int timeot = value.getTimeout(); 
     serialPort1.PortName = com; 
     serialPort1.BaudRate = baud; 
     serialPort1.ReadTimeout = timeot; 

     serialPort1.Open(); 
     if (serialPort1.IsOpen) 
     { 
      label1.Visible = true; 
     } 
     else 
     { 
      MessageBox.Show("Komunikacija sa modemom se ne može uspostaviti, molimo postavite novu konfiguraciju...!"); 
      this.Controls.Clear(); 
      SMSConfigPanel cfg = new SMSConfigPanel(); 
      cfg.Show(); 
      this.Controls.Add(cfg); 
     } 
     serialPort1.Close(); 
    } 
    #endregion 
    #region panel load method 
    private void SMSLogPanel_Load(object sender, EventArgs e) 
    { 
     setGSM(); 
    } 
    #endregion 
    #region execute serialport handler 
    public void getMessage() 
    { 
     if (serialPort1.IsOpen) 
     { 
      serialPort1.DataReceived += new SerialDataReceivedEventHandler(getResponse); 
     } 
     else 
     { 
      MessageBox.Show("Nije moguće zaprimiti poruku, komunikacijski port nije otvoren...1"); 
      return; 
     } 
    } 
    #endregion 
    #region get response from modem 
    public void getResponse(object sender, SerialDataReceivedEventArgs e) 
    { 
     SerialPort serPort = (SerialPort)sender; 
     string input = serPort.ReadExisting(); 

     if (input.Contains("+CMT:")) 
     { 

      if (input.Contains("AT+CMGF=1")) 
      { 
       string[] message = input.Split(Environment.NewLine.ToCharArray()).Skip(7).ToArray(); 
       textBox1.Text = string.Join(Environment.NewLine, message); 
      } 
      this.Invoke((MethodInvoker)delegate 
      { 
       textBox1.Text = input; 
      }); 
     } 
     else 
     { 
      return; 
     } 
    } 
    #endregion 
    #region initialize GSM 
    private void setGSM() 
    { 
     serialPort1.Open(); 

     if (!serialPort1.IsOpen) 
     { 
      MessageBox.Show("Problem u komunikaciji sa modemom, port nije otvoren...!"); 
     } 
     serialPort1.Write("AT+CMGF=1" + (char)(13)); 
     serialPort1.Write("AT+CNMI=1,2,0,0,0" + (char)(13)); 
    } 
    #endregion 
    #region setiranje timer-a... 
    private void timer1_Tick_1(object sender, EventArgs e) 
    { 
     timer1.Stop(); 
     getMessage(); 
     timer1.Start(); 
    } 
    #endregion 
} 

} 

이것은 테스트를위한 코드 일 뿐이므로 작동하지만 수정하고 개선해야 할 부분이 많이있다. 기본적으로 이것은 다음과 같은 것을 검색하는 모든 사람들에게 좋은 출발이 될 것입니다 ...

건배.