2012-03-06 351 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