【发布时间】:2012-03-23 13:10:30
【问题描述】:
我正在使用 C# 编写一个程序,该程序可以使用我的 GSM 调制解调器从我的计算机发送 SMS,并且我的大部分程序都可以运行。
我可以发送大多数 Hayes AT 命令,例如:“AT”和“AT+CGMI;+CGMM”,它返回消息“OK”,所以我知道我可以与调制解调器通信。
但是,我在将标准 7 位编码消息从调制解调器发送到我的手机时遇到问题。
在 PDUspy 的帮助下,我对自己的信息编码有一定的信心。
但是下面的代码失败得很惨:
public string SendEncodedSms(string reciever, string message)
{
string response = GetResponse("AT+CMGF=0");
if (isFine(response))
{
string encodedBody = "000100" + EncodedReceiver(reciever) + "0000";
encodedBody += EncodeToSeptet(message);
int cmgs_header = encodedBody.Length / 2;
port.WriteLine("AT+CMGS=" + cmgs_header.ToString() + "\r\n");
port.WriteLine(encodedBody + (char)26);
return ReadResponse(300);
}
else throw new ApplicationException("Cant go into SMS PDU mode");
}
里面有五个函数调用:
GetResponse() 是与调制解调器通信时用作包装器的函数 - 始终确保每个命令都以“\r”结尾,并根据调制解调器的响应返回 OK 或 Error。
isFine() 是一个简单的函数,用于检查来自 GetResponse() 的响应是否包含“OK”消息。
ReadResponse() 返回来自调制解调器的任何响应,无论是 OK 还是任何错误消息,以及 AT 命令和状态消息之间可能嵌入的任何内容。
EncodeReceiver() 以反向半字节表示法对接收方电话号码进行编码。例如。 12345678 变为 21436587。
EncodeToSeptet() 将消息从 8 位表示法编码为 7 位表示法。
使用 PDU spy 和发送到调试窗口的响应已确认所有功能都可以正常工作。
调用SendEncodedSms("<my phone number>", "test") 返回:
AT+CMGS=17
0001000A91xxxxxxxxxx000004F4F29C0E
+CMS ERROR: 304
出于隐私问题,我替换了我的编码电话号码... ;-)
- 有没有人可以给我提示一下我的失败之处?
更新:
链接提示我计算 cmgs_header 错误。
经过一些清理代码后,我得到了:
public string SendEncodedSms(string receiver, string message)
{
if(isFine("AT+CMGF=0"))
{
string encodedBody = EncodedReceiver(receiver) + "0000";
encodedBody += EncodeToSeptet(message);
/* The +2 in calculation is a hack. Its probleby two of the octets
* in 000100 that should be a part of length calculation. But need
* to verify in against severeal sites.
*/
int cmgs_header = (encodedBody.Length / 2) + 2;
encodedBody = "000100" + encodedBody;
// Rest is as before.
...
}
else ...
}
【问题讨论】:
-
我应该提到“端口”是 SerialPort 的一个实例。
标签: c# gsm at-command