4

このフォーラムに同様のトピックが投稿されているのを見ましたが、AT コマンドを送信して応答を受信する方法がわかりません。(私は数ヶ月前に C# でプログラミングを始めました。私はまだ未熟者ですが、それを学ぶために一生懸命取り組んでいます...)。

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();
}

もし誰かが助けてくれるなら、私はそれを感謝します.

どちらの場合も、とにかくありがとう. 乾杯.

4

1 に答える 1

6

最近忙しくて、お返事お待たせしてすみません。要するに、これは 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
}

}

これはテスト用のコードにすぎないため、機能しますが、修正および改善すべき点がたくさんあります。基本的に、このようなものを探しているすべての人にとって良いスタートになるでしょう...

乾杯。

于 2014-07-16T19:13:19.503 に答える