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