我正在使用C#编写一个程序,可以使用我的GSM调制解调器从我的计算机发送短信,我的大部分程序都可以使用。
我可以发送大多数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()返回来自调制解调器的任何响应,无论是否正常或任何错误消息以及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 ...
}
答案 0 :(得分:2)
也许this会帮助你。为什么不以文本模式发送短信?
答案 1 :(得分:0)
尝试使用替换代码行
port.WriteLine("AT+CMGS=" + cmgs_header.ToString() + "\r");
有些调制解调器希望严格控制CR。 LF已被解析为数据, 见下面的例子:
AT+CMGS=14 CR
0001030691214365000004C9E9340B