2012-03-06 352 views
1

我正在使用C#编写一个程序,该程序可以使用我的GSM调制解调器从我的电脑发送短信,并且我的大部分程序都可以工作。发送短信给CMS错误304

我可以发送大多数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间谍和响应发送到调试窗口正常工作。

调用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

我应该提到“port”是SerialPort的一个实例。 – 2012-03-06 02:52:17

回答

2

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

+1

不幸的是我不能使用文本模式,因为我需要接收包含斯堪的纳维亚字母的短信。 这些字母由GSM 7位字母表支持,但显然不是通过文本模式。因此,我需要代码/解码PDU。 在解码PDU部分atm上工作,我不妨用它来验证我的ENCODE部分是正确的! ;-) 我可以接收短信,所以解码应该是easyer来调试。 – 2012-03-13 04:53:27

+0

嗯...链接看起来很有趣...要检查出来 - 当我从工作中回来。 :-) – 2012-03-13 04:57:29

+0

好的。希望你能解决它。 – benJima 2012-03-13 08:01:12

0

这种尝试替换码线,

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

有些调制解调器预计长度后严格CR。 LF已被解析为数据, 请参阅下面的示例:

AT+CMGS=14 CR 
0001030691214365000004C9E9340B 
+0

嘿!大约一年以来,我上次重访这个问题!是的,我发现“\ r”可能是皇室的痛苦。当我与调制解调器通信时,它是针对华为U盘的。 我的错误归结为计算标题长度错误。 – 2014-02-28 12:22:28