发送短信的 AT 命令在 Windows 8.1 中不起作用
AT Commands to Send SMS not working in Windows 8.1
我已经研究了两天多,试图制作一个使用 AT 命令发送短信的应用程序,我实现了一些网上可用的教程和项目。不幸的是,none 成功了。
[https://docs.google.com/document/d/1VfBbMcKZsutP8Cwg2iu7Rqiyccks1J6N2ZEbkbxnCTU/preview ] 这段代码让我执行了命令,但没有发送消息。
然后我尝试了另一个项目(我正在使用 C# 和 Visual Studio 2013),它有以下文件,执行后状态更改为 Message Sent,但是我没有收到消息。我正在使用 HUAWEI Mobile Connect - 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();
}
}
}
程序有问题吗?我错过了什么吗?或者,运行 this 在Windows 8.1 中有问题,因为我还发现有一个名为MS HyperTerminal 的程序,其中的部分我不太清楚。
和代码
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()
发送短信。
我使用了以下格式的 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;
}
我已经研究了两天多,试图制作一个使用 AT 命令发送短信的应用程序,我实现了一些网上可用的教程和项目。不幸的是,none 成功了。
[https://docs.google.com/document/d/1VfBbMcKZsutP8Cwg2iu7Rqiyccks1J6N2ZEbkbxnCTU/preview ] 这段代码让我执行了命令,但没有发送消息。
然后我尝试了另一个项目(我正在使用 C# 和 Visual Studio 2013),它有以下文件,执行后状态更改为 Message Sent,但是我没有收到消息。我正在使用 HUAWEI Mobile Connect - 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();
}
}
}
程序有问题吗?我错过了什么吗?或者,运行 this 在Windows 8.1 中有问题,因为我还发现有一个名为MS HyperTerminal 的程序,其中的部分我不太清楚。
和代码
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()
发送短信。
我使用了以下格式的 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;
}