C# 发送SMS会导致CMS错误304
我正在用C#编写一个程序,它可以使用我的GSM调制解调器从我的电脑发送短信,我的大部分程序都可以正常工作 我可以发送大多数Hayes-AT命令,如:“AT”和“AT+CGMI;+CGMM”,返回消息“OK”,因此我知道我可以与调制解调器通信 但是,我确实在从调制解调器向手机发送标准7位编码信息时遇到问题 在PDUspy的帮助下,我有点自信我的信息编码是正确的 但是,以下代码失败得很惨:C# 发送SMS会导致CMS错误304,c#,gsm,at-command,C#,Gsm,At Command,我正在用C#编写一个程序,它可以使用我的GSM调制解调器从我的电脑发送短信,我的大部分程序都可以正常工作 我可以发送大多数Hayes-AT命令,如:“AT”和“AT+CGMI;+CGMM”,返回消息“OK”,因此我知道我可以与调制解调器通信 但是,我确实在从调制解调器向手机发送标准7位编码信息时遇到问题 在PDUspy的帮助下,我有点自信我的信息编码是正确的 但是,以下代码失败得很惨: public string SendEncodedSms(string reciever, string me
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位表示法
AT+CMGS=17
0001000A91xxxxxxxxxx000004F4F29C0E
+CMS ERROR: 304
为了隐私问题,我替换了我的编码电话号码…;-)
- 有没有人能给我一个暗示,我在什么方面失败了
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.WriteLine("AT+CMGS=" + cmgs_header.ToString() + "\r");
有些调制解调器严格要求在长度之后使用CR。LF已被解析为数据,
见下例:
AT+CMGS=14 CR
0001030691214365000004C9E9340B
我应该提到“端口”是SerialPort的一个实例。不幸的是,我不能使用文本模式,因为我需要接收包含斯堪的纳维亚字母的短信。GSM 7bit字母表支持这些字母,但显然不支持文本模式。因此,我需要编码/解码PDU。在使用解码PDU部分atm时,såI还可以使用它来验证我的编码部分是否正确我可以接收短信,所以解码应该更容易调试。嗯。。。链接看起来很有趣。。。我得去看看-等我下班回来。:-)是的-提示就在那里-显然我对cmgs_头的计算是错的,它太长了8个十六进制,PDUspy没有捕捉到。提示是,在计算cmgs_header.Heh时不应包含尾随的“000100”!自从我上次重提这个问题已经一年了!是的,我发现“\r”可能是一种皇家的痛苦。当我使用调制解调器进行通信时,它与华为的U盘相冲突。我的错误归结为计算页眉长度的错误。