C# 发送SMS会导致CMS错误304

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

我正在用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()返回调制解调器的任何响应,无论是OK还是任何错误消息,以及AT命令和状态消息之间可能嵌入的任何消息

  • EncodeReceiver()以反向半字节表示法对接收器的电话号码进行编码。例如,12345678变为21436587

  • EncodeToSeptet()将消息从8位表示法编码为7位表示法

使用PDU spy和发送到调试窗口的响应,已确认所有功能工作正常

调用SendEncodedSms(“,“test”)返回:

AT+CMGS=17

0001000A91xxxxxxxxxx000004F4F29C0E

+CMS ERROR: 304
为了隐私问题,我替换了我的编码电话号码…;-)

  • 有没有人能给我一个暗示,我在什么方面失败了
更新:

链接暗示我计算cmgs_头是错误的

经过一点清理代码后,我得到:

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盘相冲突。我的错误归结为计算页眉长度的错误。