发送短信会给出CMS错误304

时间:2012-03-06 02:45:04

标签: c# gsm at-command

我正在使用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 ...
}

2 个答案:

答案 0 :(得分:2)

也许this会帮助你。为什么不以文本模式发送短信?

答案 1 :(得分:0)

尝试使用替换代码行

port.WriteLine("AT+CMGS=" + cmgs_header.ToString() + "\r");

有些调制解调器希望严格控制CR。 LF已被解析为数据, 见下面的例子:

AT+CMGS=14 CR
0001030691214365000004C9E9340B