我正在使用C#编写一个程序,该程序可以使用我的GSM调制解调器从我的电脑发送短信,并且我的大部分程序都可以工作。发送短信给CMS错误304
我可以发送大多数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间谍和响应发送到调试窗口正常工作。
调用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 ...
}
我应该提到“port”是SerialPort的一个实例。 – 2012-03-06 02:52:17