利用公共的GSM短信信道(SMS)和GPRS數(shù)據(jù)信道(TCP/IP),實現(xiàn)設(shè)備的遠(yuǎn)程通訊,是英創(chuàng)嵌入式主板的主要應(yīng)用領(lǐng)域之一。在英創(chuàng)的x86嵌入式模塊產(chǎn)品線中,通過與西門子公司的MC39i無線模塊構(gòu)成基本硬件環(huán)境,已提供了完善的GSM短信收發(fā)(包括中文短信)方案和基于GPRS的TCP/IP數(shù)據(jù)通訊方案。在英創(chuàng)ARM9工控主板產(chǎn)品中,通過利用WinCE提供的RAS功能,已實現(xiàn)了基于GPRS、3G信道的TCP/IP通訊,相關(guān)方案的介紹請參考《WinCE下的GPRS應(yīng)用》、《WinCE主板接入3G網(wǎng)絡(luò)的方法》等文章。本文則主要側(cè)重介紹英創(chuàng)ARM9主板與MC39i模塊結(jié)合,通過eVC標(biāo)準(zhǔn)C/C++代碼操作AT指令,實現(xiàn)中英短信收發(fā)功能的方法。
收發(fā)短消息可分三種模式:BLOCK 模式、TEXT 模式和PDU 模式。BLOCK 模式現(xiàn)在用的很少了;TEXT 模式則只能發(fā)送ASCII 碼,它不能發(fā)送中文的UNICODE碼;而PDU 模式編碼較為復(fù)雜,它需要編寫專門的函數(shù)來將文本轉(zhuǎn)換為PDU格式,但PDU模式被所有手機(jī)支持,可以使用任何字符集,它也是手機(jī)默認(rèn)的編碼方式。英創(chuàng)公司提供的解決方案中,正是選用的PDU 模式。
用PDU模式收發(fā)短消息可以使用三種編碼: 7-bit 編碼、8-bit 編碼和UCS2 編碼。7-bit 編碼用于發(fā)送普通的ASCII字符;8-bit 編碼通常用于發(fā)送數(shù)據(jù)消息,如圖片或鈴聲等;UCS2 編碼用于發(fā)送Unicode字符,當(dāng)然也可以發(fā)送ASCII字符。由于英創(chuàng)的解決方案要實現(xiàn)中文短消息或者ASCII字符的發(fā)送,所以選擇用UCS2 編碼,即中文Unicode碼,這可以適應(yīng)發(fā)中文和ASCII字符的需要。PDU 串除了包含所發(fā)送的消息本身外,還包含很多其它參數(shù)信息,如服務(wù)中心號碼、目標(biāo)號碼和編碼方式等。
PDU編碼與解碼比較復(fù)雜,本文不做介紹。使用英創(chuàng)公司給出的SMS類,可以在不了解PDU編碼格式的情況下,輕松完成短信收發(fā)編程。下面詳細(xì)介紹SMS類的主要成員函數(shù)和使用方法。
為了方便程序開發(fā),定義SM_PARAM結(jié)構(gòu)體如下:
typedef struct {
char SCA[16]; // 短消息服務(wù)中心號碼(SMSC地址)
char TPA[16]; // 目標(biāo)號碼或回復(fù)號碼(TP-DA或TP-RA)
char TP_PID; // 用戶信息協(xié)議標(biāo)識(TP-PID)
char TP_DCS; // 用戶信息編碼方式(TP-DCS)
char TP_SCTS[16]; // 服務(wù)時間戳字符串(TP_SCTS), 接收時用到
char TP_UD[160]; // 接收到的短信內(nèi)容
TCHAR TP_UDS[160]; // 要發(fā)送的短信內(nèi)容
} SM_PARAM;
變量SCA為短消息服務(wù)中心號碼(SMSC地址),例如成都移動的短消息服務(wù)中心號碼為:8613800280500,注意,短消息服務(wù)中心號碼應(yīng)該包括86。
變量TPA為要發(fā)送的號碼和收到短信時對方的手機(jī)號碼,例如:8613880851364。
變量PID為協(xié)議標(biāo)識,00表示普通GSM 類型,點到點方式。
變量DCS為用戶信息編碼方式:00表示7-bit編碼;08表示UCS2 編碼;04:表示8-bit 編碼。
變量SCTS為收到的短信的時間戳字符串。
變量UDS為要發(fā)送短信的內(nèi)容,最大容量是140字節(jié),所以在UCS2 編碼方式下,可發(fā)送短消息的最大字符數(shù)是70 個變量UD為接收到的短信內(nèi)容。
在發(fā)短信之前,只需要填充SM_PARAM結(jié)構(gòu)體,然后調(diào)用SMS_SendPDUMessage函數(shù)就可以發(fā)短信了。調(diào)用SMS_ReadShortMessage,就可以把短信信息讀到SM_PARAM結(jié)構(gòu)體中。SMS類的主要函數(shù)如下:
// 函數(shù)名稱: SMS_Init
// 描 述: SMS 模塊初始化函數(shù)
// 輸入?yún)?shù): LPCTSTR Port : 串口號, 如 ‘COM1:’
// int BaudRate : 串口波特率, 如 115200
// DWORD UserParam: 用戶傳遞到該類中的參數(shù)
// 輸出參數(shù): 無
// 返 回: TRUE: 成功 FALSE: 失敗
BOOL CSMS:: SMS_Init(LPCTSTR Port, int BaudRate, DWORD UserParam)
// 發(fā)送PDU編碼短消息
// 輸入: pSrc - 源PDU參數(shù)指針
// 返回: TRUE: 成功 FALSE: 失敗
BOOL CSMS::SMS_SendPDUMessage(SM_PARAM* pSrc)
// 函數(shù)名稱: SMS_ReadShortMessage
// 描 述: 讀取短信內(nèi)容
// 輸入?yún)?shù): DWORD num : 短信序號
// 輸出參數(shù): SM_PARAM * SmGetMsg : 短信信息
// 返 回: TRUE: 成功 FALSE: 失敗
BOOL CSMS::SMS_ReadShortMessage(DWORD num, SM_PARAM * SmGetMsg)
// 函數(shù)名稱: SMS_DeleteShortMsg
// 描 述: 刪除短信
// 輸入?yún)?shù): 無
// 輸出參數(shù): DWORD num : 短信序號
// 返 回: TRUE: 成功 FALSE: 失敗
BOOL CSMS::SMS_DeleteShortMsg(DWORD num)
注意,在使用英創(chuàng)評估底板上的MC39i時,要先對先對MC39I上電,然后在調(diào)用初始化函數(shù)。下面以向13880851364號碼發(fā)送“英創(chuàng)hello!”為例,說明SMS_SendPDUMessage函數(shù)的使用方法。
1、對MC39I上電,并初始化:
SM_PARAM SmsInfo;
CSMS m_SMS;
GPRS_PowerOn( ); // MC39I上電
Sleep( 3000 ); // 等3秒鐘
m_SMS.SMS_Init(_T(‘COM3:’), 115200, (DWORD)this);
// MC39I接EM9000的com3口
2、填充pdu結(jié)構(gòu)體:
SmsInfo.SCA=‘8613800280500’
SmsInfo .TPA=‘8613880851364’
SmsInfo.TP_PID=0; // 00 協(xié)議標(biāo)識(TP-PID) 是普通GSM類型,點到點方式
SmsInfo.TP_DCS=GSM_UCS2; // 使用UCS2編碼方式
SmsInfo .TP_UDS=_T(‘英創(chuàng)hello!’);
3、調(diào)用SMS_SendPDUMessage函數(shù),發(fā)短信息:
m_SMS.SMS_SendPDUMessage(&SmsInfo);
在讀取短信時可以設(shè)置一個定時器,在響應(yīng)TIMER事件的函數(shù)中調(diào)用SMS_ReadShortMessage函數(shù),就可以及時得到含有短信信息的結(jié)構(gòu)體。
CString strTelCode, strMsg;
Bool ret = m_SMS.SMS_ReadShortMessage(1, &ReadMsg); // 讀取第 1 條短信
if (ret == TRUE)
{
strTelCode=ReadMsg.TPA; // 得到對方手機(jī)號碼
strMsg=ReadMsg.TP_UD; // 得到短信內(nèi)容
m_SMS.SMS_DeleteShortMsg(1); // 刪除短信
}
以上給出來使用英創(chuàng)提供的SMS類發(fā)短信與讀短信的方法,英創(chuàng)客戶可以在開發(fā)光盤中找到源碼,也可以和我們聯(lián)系得到源碼。
-
嵌入式主板
+關(guān)注
關(guān)注
7文章
6084瀏覽量
35154
發(fā)布評論請先 登錄
相關(guān)推薦
評論