我正在使用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 ...
}
我應該提到「port」是SerialPort的一個實例。 – 2012-03-06 02:52:17