隨著移動(dòng)通訊技術(shù)的發(fā)展普及,GPRS無(wú)線通訊和SMS短信收發(fā)越來(lái)越多地應(yīng)用到工業(yè)領(lǐng)域的遠(yuǎn)程數(shù)據(jù)通訊中。GPSR主要是進(jìn)行的數(shù)據(jù)通訊,SMS則是AT指令的操作模式,在不少的無(wú)線通訊模塊,比如西門(mén)子的MC39i、華為的GTM900,模塊一旦處于GPRS數(shù)據(jù)通訊狀態(tài),則無(wú)法再進(jìn)行AT指令的操作,從而難以同時(shí)實(shí)現(xiàn)SMS短信數(shù)據(jù)收發(fā)的功能。解決這個(gè)問(wèn)題方法之一是在軟件上實(shí)現(xiàn)多路轉(zhuǎn)換協(xié)議,這種方式通過(guò)軟件協(xié)議的方式將一個(gè)物理口虛擬為多個(gè)口,從而將GPRS通訊和SMS通訊分開(kāi),這種模式程序往往比較復(fù)雜,在嵌入式的應(yīng)用中比較難以實(shí)現(xiàn)。方法之二就是直接在硬件物理口上將GPRS和SMS通訊分開(kāi),西門(mén)子提供的MC37i無(wú)線模塊本身就自帶有兩個(gè)物理串口,可以支持分別進(jìn)行GPRS和SMS通訊的操作。本文將結(jié)合英利公司提供的ARM9 Linux主板EM9160和ETA300 GPRS擴(kuò)展單元(GPRS無(wú)線模塊為MC37i),著重介紹如何同時(shí)實(shí)現(xiàn)GPSR通訊和SMS短信收發(fā)的應(yīng)用。
硬件組成
英利公司的嵌入式Linux主板EM9160共有6個(gè)異步串口,在Linux環(huán)境中為“/dev/ttyS1”-“/dev/ttyS6”。ETA300是包括MC37i模塊的外掛式GPRS通訊單元,可直接通過(guò)帶線與英利EM9160開(kāi)發(fā)評(píng)估底板相連,如下圖所示。其中GPRS通訊占用EM9160的 “/dev/ttyS1” (或稱(chēng)COM2) 口,SMS通訊占用EM9160的“/dev/ttyS4”( 或稱(chēng)COM5 ) 口,連接方式如下圖所示。
MC37i電源管理
通過(guò)ETA300 GPRS擴(kuò)展單元可實(shí)現(xiàn)對(duì)MC37i的電源管理,MC37i的電源管理是通過(guò)兩路GPIO:GPIO8和GPIO9來(lái)實(shí)現(xiàn),分別對(duì)應(yīng)GPRS _STB、GPRS_AUX管腳信號(hào)。在程序上操作GPIO8、GPIO9實(shí)現(xiàn)對(duì)MC37i的上電、關(guān)電操作。以下為提供的對(duì)MC37i電源管理的操作函數(shù):
// 功能描述:該函數(shù)通過(guò)對(duì)EM9160的GPRS_STB和GPRS_AUX兩個(gè)管腳信號(hào)的操作,實(shí)現(xiàn)對(duì)GPRS模塊的電源管理。
// 輸入?yún)?shù) OpMode: 電源管理功能索引號(hào),有效索引號(hào)包括:
OpMode = 1: 對(duì)GPRS模塊進(jìn)行上電操作,并把執(zhí)行該操作后電 源狀態(tài)返回;
OpMode = 2: 對(duì)GPRS模塊進(jìn)行強(qiáng)制關(guān)電,并把執(zhí)行該操作后電源狀態(tài)返回;
OpMode = 3: 讀取GPRS模塊當(dāng)前的電源狀態(tài)。
// 輸出參數(shù) pResult: 用于存儲(chǔ)讀取的電源狀態(tài)信息。
*pResult = 0: 表示GPRS模塊的電源已關(guān)閉;
*pResult = 1: 表示GPRS模塊的電源已加載成功;
int GPRS_PM( int fd, int OpMode, int* pResult )
嵌入式Linux中的GPRS撥號(hào)
嵌入式Linux ppp GPRS撥號(hào)程序pppd和相關(guān)的腳本文件,均已經(jīng)缺省包含在EM9160板卡的根文件系統(tǒng)中。
嵌入式Linux主板EM9160環(huán)境下進(jìn)行GPRS撥號(hào)時(shí),首先調(diào)用函數(shù)GPRS_PM(…)使MC37i上電成功,然后再啟動(dòng)pppd進(jìn)程進(jìn)行GPRS撥號(hào)。
printf('GPRS Power On\n');
GPRS_PM(fd, 1, &GPRS_State);
// MC37i模塊上電登錄到移動(dòng)網(wǎng)絡(luò)等待時(shí)間
for( i1=0; i1<8; i1++ )
{
sleep( 1 );
printf( '.\n' );
}
system( 'pppd call pppd-connect-script' );
掛斷直接可調(diào)用ppp-off腳本:
system( '/etc/ppp/ppp-off' );
嵌入式Linux中的SMS短信收發(fā)
SMS短信收發(fā)的核心通訊模式為串口通訊,應(yīng)用程序上也是采用的C++的編程方式,利用英利公司網(wǎng)站技術(shù)天地欄目中《嵌入式Linux串口通訊的C++設(shè)計(jì)》一文中介紹的CSerial類(lèi),在CSerial基礎(chǔ)上派生了一個(gè)針對(duì)于SMS收發(fā)應(yīng)用的class SMS,該派生類(lèi) class SMS 中重新實(shí)現(xiàn)了虛函數(shù)PackagePro(…) 接收數(shù)據(jù)處理函數(shù),以滿足SMS收發(fā)的應(yīng)用需求。
在sms.h中定義了短信的數(shù)據(jù)結(jié)構(gòu):
struct SMS_DATA
{
unsigned char PhoneNum[16]; // 對(duì)端電話號(hào)碼
struct Date d; // 日期:年月日
struct Time t; // 時(shí)間:時(shí)分秒
int DatLen; // 數(shù)據(jù)長(zhǎng)度
unsigned char DBuf[168]; // 短信數(shù)據(jù)內(nèi)容
};
對(duì)于SMS短信收發(fā)可調(diào)用的類(lèi)函數(shù)包括有:
// 按照指定的參數(shù)打開(kāi)短信Modem端口,并創(chuàng)建短信接收線程
int OpenPort( int PortNo, int baudrate, char databits, char stopbits, char parity );
// 關(guān)閉短信Modem端口并釋放相關(guān)資源
int ClosePort( );
// 發(fā)送AT指令初始化短信Modem
int InitSMSModem( );
// 發(fā)送短信
int SendMessage( struct SMS_DATA* pSMS );
在該例程中短信接收的處理放在函數(shù)PackagePro(…)中實(shí)現(xiàn)的,用戶可以根據(jù)實(shí)際情況加以調(diào)整。SMS短信收發(fā)的實(shí)現(xiàn)代碼均在sms.cpp下,由于是CSerial的派生類(lèi),其接收的主要流程可參見(jiàn)英利公司網(wǎng)站技術(shù)天地欄目中《嵌入式Linux串口通訊的C++設(shè)計(jì)》一文中相關(guān)介紹,這里不再贅述。
在class SMS中實(shí)現(xiàn)了支持中文短信的發(fā)送,所以短信發(fā)送的模式均采用PDU模式。對(duì)于中文字符,在短信發(fā)送時(shí)還需要轉(zhuǎn)換為unicode碼,程序代碼中已經(jīng)實(shí)現(xiàn)了中文內(nèi)碼到unicode 碼的自動(dòng)轉(zhuǎn)換,客戶在測(cè)試該程序時(shí),需要注意的是要將unicode 的相關(guān)轉(zhuǎn)換文件表COPY到/mn/nandflash:gsm0338.bin gb2312.bin unicode.bin。
本文中所介紹的例程僅僅適用于英利EM9160嵌入式主板,均有源碼提供。感興趣的客戶可以發(fā)郵件到公司技術(shù)支持郵箱 support@emlinix.com索取相關(guān)代碼。
成都英創(chuàng)信息技術(shù)有限公司 028-8618 0660