【问题标题】:Sending SMS gives CMS error 304发送 SMS 会导致 CMS 错误 304
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 不幸的是,我无法使用文本模式,因为我需要接收包含斯堪的纳维亚字母的短信。 GSM 7bit 字母表支持这些字母,但文本模式显然不支持这些字母。因此,我需要对 PDU 进行编码/解码。在解码 PDU 部分 atm 上工作,我不妨用它来验证我的 ENCODE 部分是否正确执行! ;-) 我可以接收短信,所以解码应该更容易调试。
  • 嗯...链接看起来很有趣...必须检查一下 - 当我下班回来时。 :-)
  • 是的 - 提示就在那里 - 显然我对 cmgs_header 的计算已关闭,它太长了 8 个十六进制,PDUspy 没有捕捉到。提示是在 cmgs_header 的计算中不应包含尾随的“000100”。
【解决方案2】:

尝试用这个替换代码行,

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

一些调制解调器在长度之后要求严格的 CR。 LF 已经被解析为数据, 见下面的例子:

AT+CMGS=14 CR
0001030691214365000004C9E9340B

【讨论】:

  • 嘿!自从我上次重新访问这个问题以来大约一年!是的,我发现“\r”可能是一种皇家痛苦。当我与调制解调器通信时,它是针对华为 U 盘的。我的错误归结为计算标题长度错误。
猜你喜欢
  • 2014-05-15
  • 2018-10-18
  • 2015-02-12
  • 2015-08-02
  • 1970-01-01
  • 2018-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多