2015-05-28 153 views
2

我一直在研究了超过两天,试图让一个应用程序无法正常工作使用AT命令发送短信,我实现了在网上提供一些教程和项目。不幸的是,他们都没有工作。AT命令发送短信在Windows 8.1

[https://docs.google.com/document/d/1VfBbMcKZsutP8Cwg2iu7Rqiyccks1J6N2ZEbkbxnCTU/preview]这段代码给了我执行命令,但不发送消息。

然后我尝试了另一个项目(我使用的是C#和Visual Studio 2013),它具有以下文件,执行后状态更改为消息已发送,但我没有收到消息。我使用华为移动连接 - 3G的应用程序接口 GSM调制解调器

Program.cs的

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace CSharp_SMS 
{ 
static class Program 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Form_SMS_Sender()); 
    } 
} 
} 

Form1.cs的

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

namespace CSharp_SMS 
{ 
public partial class Form_SMS_Sender : Form 
{ 
    private SerialPort _serialPort; 
    public Form_SMS_Sender() 
    { 
     InitializeComponent(); 
    } 

    private void buttonSend_Click(object sender, EventArgs e) 
    { 
     string number = textBoxNumber.Text; 
     string message = textBoxMessage.Text; 

     _serialPort = new SerialPort("COM17", 19200); //Replace "COM7" with corresponding port name 

     Thread.Sleep(1000); 

     _serialPort.Open(); 

     Thread.Sleep(1000); 

     _serialPort.Write("AT+CMGF=1\r"); 

     Thread.Sleep(1000); 

     _serialPort.Write("AT+CMGS=\"" + number + "\"\r\n"); 

     Thread.Sleep(1000); 

     _serialPort.Write(message + "\x1A"); 

     Thread.Sleep(1000); 

     labelStatus.Text = "Status: Message sent"; 

     _serialPort.Close(); 
    } 
} 
} 

有问题的程序?我错过了什么?或者,在Windows 8.1中运行这个问题有问题,因为我还发现有一个名为MS HyperTerminal的程序,这部分对我来说不是很清楚。

+1

即_tutorial_应删除(相关帖子:[1](http://stackoverflow.com/q/283​​15943/1207195)和[2](http://stackoverflow.com/a/15591673/ 1207195))。什么不工作?有什么异常?根本没有结果?你必须改变一些串口属性,不要等待使用Thred.Sleep(),**检查调制解调器响应**(顺便说一下,第一次睡眠是无用的)。我还建议将该代码移到背景工作者(或者您将挂起UI)。状态变为“发送消息”,因为这是你写的,调制解调器实际告诉你的是未知的(因为你没有阅读它的答案)。 –

+0

您没有进行身份验证。你确定你的SIM卡没有PIN吗? 超级终端直接发送AT命令(不管你输入被立即发送。) –

+0

运行此的东西,如SysIntertnals Portmon运行,所以你可以看到从设备是您目前完全忽视了响应(看发出ATV1/AT + CMEE命令以启用更详细的响应) –

回答

0

我在下面的格式使用AT Commands和它的作品。

public bool sendMsg(string smsid, string PhoneNo, string Message, string from, string to) 
{ 
    string recievedData; 
    bool isSend = false; 
    string text = "Hello " + to + ",\n" + Message + "\n\n" + from; 
    if (!port.IsOpen)     
     port = OpenPort(); 
    recievedData = ExecCommand(port, "AT+CMGF=1", 400, "Failed to set message format."); 

    try 
    { 
     //string recievedData; // = ExecCommand(port, "AT", 3000, "No phone connected"); 
     String command = "AT+CMGS=\"" + PhoneNo + "\""; 
     recievedData = ExecCommand(port, command, 1000, "Failed to accept phoneNo"); 
     command = text + char.ConvertFromUtf32(26) + "\r"; 
     recievedData = ExecCommand(port, command, 1000, "Failed to send message"); 
     if (recievedData.Contains("OK")) 
     { 
      isSend = true;     
     } 
     else if (recievedData.Contains("ERROR")) 
     { 
      isSend = false;     
     } 
    } 
    catch (Exception ex) 
    { 
     MyLog.Write(new LogPacket(ex, DateTime.Now)); 
    } 
    return isSend; 
} 
2

我用SMSPDUlib

和代码

private const string LT = "\r\n"; 

    public void Auth(string pin) 
    { 
     lock (smsSendSync) 
     { 
      //Check if gateway is alive 
      lastSplit = SplitResponse(SendCommand("AT")); 
      if (!(lastSplit[lastSplit.Length - 1] == "OK")) 
       throw new OperationCanceledException("AT connection failed"); 

      //Echo ON 
      lastSplit = SplitResponse(SendCommand("ATE1")); 
      if (!(lastSplit[lastSplit.Length - 1] == "OK")) 
       throw new OperationCanceledException("ATE command failed"); 

      //Check echo 
      lastSplit = SplitResponse(SendCommand("AT")); 
      if (!(lastSplit.Length == 2 && lastSplit[1] == "OK")) 
       throw new OperationCanceledException("AT command failed"); 

      //Verbose error reporting 
      lastSplit = SplitResponse(SendCommand("AT+CMEE=2")); 
      if (!(lastSplit.Length == 2 && lastSplit[1] == "OK")) 
       throw new OperationCanceledException("AT+CMEE command failed"); 

      //Enter a PIN 
      lastSplit = SplitResponse(SendCommand("AT+CPIN?")); 
      if (!(lastSplit.Length == 3 && lastSplit[2] == "OK")) 
       throw new OperationCanceledException("AT+CPIN? command failed"); 
      switch (lastSplit[1]) 
      { 
       case "+CPIN: READY": //no need to enter PIN 
        break; 
       case "+CPIN: SIM PIN": //PIN requested 
        lastSplit = SplitResponse(SendCommand("AT+CPIN=" + pin)); 
        string m_receiveData = String.Empty; 
        WaitForResponse(out m_receiveData); 
        if (m_receiveData == String.Empty) 
         throw new OperationCanceledException("PIN authentification timed out"); 
        break; 
       default: 
        throw new OperationCanceledException("Unknown PIN request"); 
      } 
      //Check if registered to a GSM network 
      lastSplit = SplitResponse(SendCommand("AT+CREG?")); 
      if (!(lastSplit.Length == 3 && lastSplit[2] == "OK")) 
       throw new OperationCanceledException("AT+CREG? command failed"); 
      lastSplit = lastSplit[1].Split(new string[] {" ", ","}, StringSplitOptions.RemoveEmptyEntries); 
      if (!(lastSplit[2] == "1" || lastSplit[2] == "5")) 
       throw new OperationCanceledException("Not registered to a GSM network"); 
      Debug.WriteLine("Authentification successfull"); 
     } 
    } 

    private string[] SplitResponse(string response) 
    { 
     string[] split = response.Split(new string[] { LT }, StringSplitOptions.RemoveEmptyEntries); 
     for (int i = 0; i < split.Length; i++) 
      split[i] = split[i].Trim(); 
     return split; 
    } 

    public string SendCommand(string command) 
    { 
     string m_receiveData = string.Empty; 
     smsPort.ReadExisting();  //throw away any garbage 
     smsPort.WriteLine(command + LT); 
     WaitForResponse(out m_receiveData); 
     //Debug.WriteLine(m_receiveData); 
     return m_receiveData; 
    } 

    public string SendSms2(string phoneNumber, string message, bool flashMsg, SMS.SMSEncoding encoding) 
    { 
     if (phoneNumber.StartsWith("00")) 
      phoneNumber = "+" + phoneNumber.Substring(2); 
     if (phoneNumber.StartsWith("0")) 
      //replace with your national code 
      phoneNumber = "+386" + phoneNumber.Substring(1); 
     string StatusMessage = string.Empty; 
     SMS sms = new SMS();       //Compose PDU SMS 
     sms.Direction = SMSDirection.Submited;   //Setting direction of sms 
     sms.Flash = flashMsg;       //Sets the flash property of SMS 
     sms.PhoneNumber = phoneNumber.Replace(" ",""); //Set the recipient number 
     sms.MessageEncoding = encoding;     //Sets the Message encoding for this SMS 
     sms.ValidityPeriod = new TimeSpan(4, 0, 0, 0); //Set validity period 
     sms.Message = message;       //Set the SMS Message text 
     string sequence = sms.Compose() + CtrlZ;  //Compile PDU unit 
     string sequenceLength = ((sequence.Length - 3)/2).ToString(); 
     lock (smsSendSync) 
     { 
      StatusMessage = SendCommand("AT+CMGS=" + sequenceLength) + " "; 
      Thread.Sleep(500); 
      StatusMessage += SendCommand(sequence); 
     } 
     Debug.WriteLine(StatusMessage); 
     if (StatusMessage.Contains("ERROR")) 
      throw new OperationCanceledException("Error sending SMS"); 
     return StatusMessage; 
    } 

使用Auth()初始化调制解调器和SendSms2()发送短信。

+0

你可以给参数的汇总方式通'flashMsg'和'encoding'此功能'公共字符串SendSms2(字符串phoneNumber,字符串消息,布尔flashMsg,SMS.SMSEncoding编码)' –

+0

FlashSMS: https://en.wikipedia.org/wiki/Short_Message_Service#Flash_SMS 通常它应该是错误的。 编码: 用于发送短信的编码。它可以是_7bit,_8bit或UCS2(类似于Unicode) –

+0

请不要使用'Thread.Sleep'来等待来自调制解调器的''n \ r>“'响应。有关详细信息,请参阅[此答案]的第一部分(http://stackoverflow.com/a/15591673/23118)。 – hlovdal