基于嵌入式Linux的短信收發系統設計
摘要:移動通信中的短消息業務以其方便、可靠和價廉得到了廣泛應用,本文在嵌入式Linux系統中,通過西門子MC35模塊,實現了短信收發系統,該系統采用PDU短信模式,能支持中文短信。程序設計采用異步事件驅動方式,提高了系統的運行效率。嵌入式系統體積小巧,Linux資源開放,因此該系統經過二次開發,可方便地用于各種移動數據采集系統中。
1. 引言
全球移動通信系統GSM是我國范圍最廣、通信能力最強的移動通信業務,而其中的短消息功能由于其使用方便、價格低廉、可靠性高而得到廣泛應用。嵌入式Linux也是目前得到廣泛應用的技術,功能強大和資源豐富是其最大的優勢。本文在嵌入式Linux系統中利用GSM模塊實現短信的收發,對不方便架設通信線的偏遠地區,提供了數據采集的新手段。同時嵌入式系統體積小巧,Linux操作系統資源開放,所以本系統經過二次開發,可方便地構成移動數據采集系統,用于遠程數據采集、監控。
2. 短信收發原理
短信服務業務SMS(Short Message Service)是GSM系統提供給用戶的一種數字業務。它與話音傳輸及傳真一樣同為GSM數字蜂窩移動通信網絡提供的主要電信業務。涉及SMS管理的協議如圖1所示。
圖1 SMS管理的協議
圖中SME為短信實體, SMSC為短信服務中心,SMCGWMS為SMS網關,HLR是歸屬位置寄存器,用于永久儲存管理用戶和服務記錄的數據庫,MSC為移動交換中心,VLR為訪問位置寄存器,含有用戶臨時信息的數據庫,交換中心服務訪問用戶時需要這些信息。
短消息模塊的接入方式支持兩種模式:基于AT指令的TEXT模式和基于AT指令的PDU模式,它指的是短信息數據的編碼格式,文本模式只支持7-bit編碼,只能發送純英文和數字信息,而PDU模式支持7-bit編碼、8-bit編碼和UCS-2編碼,其中后者可進行Unicode編碼,如中文,所以本系統采用PDU模式。
GSM模塊采用標準AT指令集通信,其中本系統用到的AT指令如表1所示。
表1 相關AT指令
功能 | AT指令 |
短消息格式 | AT+CMGF |
短消息中心號碼 | AT+CSCA |
新消息提示 | AT+CNMI |
讀短消息 | AT+CMGR |
列短消息 | AT+CMGL |
發送短消息 | AT+CMGS |
短消息刪除 | AT+CMGD |
3. GSM短信數據格式分析
3.1 發送短信PDU字符串
由于短信模式選擇的是PDU格式,因此對PDU的編碼和轉碼就變得很重要。中文短信息的實現需要將GB2312的中文編碼轉換為代碼頁為CP936的Unicode編碼,PDU發送字符串數據格式中主要由短信中心地址、文件頭字節、信息類型、目的地址、協議標識、數據編碼方案、有效期、用戶數據長度和用戶數據組成。例如:設置PDU格式的編碼為08 91 68 31 08 20 01 05 F0 11 00 0D 91 68 31 21 43 65 87 F9 00 08 00 04 4F 60 59 7DH,這組代碼的含義如下所示:
08H:短信服務中心地址信息的長度,共8個八位字節(包括91) ;
91H:短信服務中心地址格式,用國際格式號碼,在前面加‘+’ ;
68 31 08 20 01 05 F0H:短信服務中心地址,8613800210500,補‘F’湊成偶數個;
11H:基本參數,協議數據單元類型,表示發送,TP-VP用相對格式;
00H :信息參考,00H表示參考本身號碼 ;
0DH :對方手機號數字個數,共13個十進制數 ;
91H :對方手機號,用國際格式號碼,在前面加‘+’ ;
68 31 21 43 65 87 F9H:對方手機號(TP-DA),8613123456789,補‘F’湊成偶數個;
00H:協議標識(TP-PID), 是普通GSM類型,點到點方式;
08H:用戶信息編碼方式(TP-DCS),主要用其1個字節的第2和第3位表示編碼方式,08H表示為UCS-2編碼,最多發140個字符;04H為8-bit編碼,最多發140個字符;00H為7-bit編碼,最多發160個字符;
00H:有效期(TP-VP),5分鐘;
04H:短信長度(TP-UDL),實際長度4個字節;
4F 60 59 7DH:用戶信息(TP-UD),“你好”的Unicode編碼 。
3.2 短信接收PDU字符串
接收方PDU字符串的含義和發送方不同,同樣以“你好”為例,接收方的PDU字符串為:08 91 68 31 08 20 01 05 F0 24 0D 91 68 31 67 24 47 63 F0 00 08 70 50 91 31 21 25 23 04 4F 60 59 7DH,其含義如下:
08 91 68 31 08 20 01 05 F0H:短信服務中心,分析同發送相同;
24H:協議數據單元類型基本參數(TP-MTI/VFP) ,發送,TP-VP用相對格式;
0DH:對方手機號數字個數;
91H:對方手機號(TON/NPI),用國際格式號碼(在前面加‘+’);
68 31 67 24 47 63 F0H :對方手機號(TP-DA),8613764274360,補‘F’湊成偶數個;
00H:協議標識(TP-PID) ,是普通GSM類型,點到點方式;
08H:用戶信息編碼方式(TP-DCS) ,分析同發送方;
70 50 91 31 21 25H:短信息發送時間(SCTS),07年05月19日13時12分52秒;
23H:發送時間對應的時區;
04H:短信長度(TP-UDL),實際長度4個字節;
4F 60 59 7DH:用戶信息(TP-UD) ,“你好”的Unicode編碼。
4. 系統組成
4.1 硬件組成
系統由嵌入式Linux系統和西門子MC35模塊通過串行接口三線制連接而構成, MC35模塊通過串口1與嵌入式系統相連,嵌入式系統配置包括50MHz 主頻的MPC860 32位處理器,16M SDRAM內存,2個RS232,操作系統采用嵌入式Linux for PowerPC。MC35模塊由GSM基帶處理器、電源專用集成電路、射頻電路和閃速存儲器等部分組成,負責處理GSM蜂窩設備中的音頻、數據信號,內嵌的軟件部分執行應用接口和所有GSM協議棧的功能。MC35模塊支持中文短信,支持GPRS功能,便于將來功能的擴展。
4.2 libcssl函數庫
為了實現短信收發,需要在嵌入式Linux下通過串口發送一系列的AT指令。串行通信是計算機與其它設備通信的常用方法,在本系統中采用一個基于Linux的串行通信函數庫libcssl,可實現串行接口的異步事件驅動并發。采用該方法,用戶只要在服務器和數據源之間建立異步連接,編寫數據處理函數,而對數據源事件的監測、數據讀取、多事件的處理等操作是由操作系統內部完成的,因而,很大程度上簡化了編程者的工作,同時保證了較高的資源利用率。
libcssl函數庫提供給用戶多種基于事件驅動方式的串行接口函數。其主要的函數有4類,分別進行串口初始化、收發數據、錯誤信息和結束串口操作。在使用某個串口之前,應調用初始化函數,為其設定相應的參數,使得收發雙方遵循相同的通信協議和數據格式,同時通過初始化操作,為串口數據源和采集服務器之間建立異步連接,分配采集句柄。當數據源通過串口向嵌入式系統發送數據時,該數據會被送入數據緩沖區,并通過該數據源的采集句柄訪問該串口的事件回調函數,在該函數中完成數據的處理。這樣,當用戶使用多個串口時,不需要用多個線程,只需為每個串口設置獨立的回調函數,各回調函數之間可方便地實現數據交換共享。程序中可通過獲取錯誤信息得知系統出現的錯誤狀態,而采集程序結束,應關閉串口,釋放系統資源。相關的函數如表2所示。
表2 libcssl函數庫中的主要函數
類型 | 函數名 | 功能 |
初始化 | cssl_start | 啟動串口 |
cssl_open | 打開串口 | |
cssl_setflowcontrol | 設置數據流控制 | |
釋放資源 | cssl_close | 關閉串口 |
cssl_stop | 停止串口 | |
串口發送數據 | cssl_putchar | 向串口輸出字符 |
cssl_putstring | 向串口輸出字符串 | |
cssl_putdata | 向串口輸出數據 | |
錯誤信息 | cssl_geterror | 獲取錯誤碼 |
4.3 軟件設計
使用了異步事件驅動函數庫,程序設計簡單而容易實現,程序主要由2部分組成,即主程序設計和回調函數程序設計,主程序只需做初始化和發送短信,其余功能都放在回調函數中完成。
在主程序中,各變量賦初值,調用cssl_open函數打開串口,設定的參數為采用串口1,即嵌入式Linux的ttyS0設備,波特率9600bps,8位數據位,1位停止位,無奇偶校驗,無數據流控制,定義串口接收數據緩沖區有數據輸入時,回調函數為callback函數,該函數對數據緩沖區中的數據進行分析處理。通過發送AT+CMGF=0指令定義短信模式為PDU模式,并判斷是否有短信需要發送。對待發送的短信按照PDU發送字符串格式進行編碼。
回調函數中首先讀取輸入緩沖區內容,根據對標志和緩沖區內容的判斷,可以得知回調事件是由哪個事件引起,分別加以處理,由于每次向GSM模塊發送AT指令后,模塊會發送OK或ERROR等響應表示操作成功或失敗,所以在回調函數中一個很重要的功能就是判斷AT指令是否發送成功,為了區分不同AT指令的響應,程序中采用狀態標志,表征系統發送AT指令的類型。在收到新短信后,需要提取短信發送方電話號碼、短信發送時間和短信內容等相關信息,并加以存儲,提取的依據就是短信接收PDU字符串的編碼格式。為了避免由于短信滿而無法接收新短信,需要將處理過的短信刪除。相關的流程圖如圖2和圖3所示。
圖2 主程序流程圖
圖3 回調函數程序流程圖
5. 結論
本文的創新之處在于提供了嵌入式Linux下GSM模塊的短信收發系統設計方法,程序設計中利用串行接口驅動函數庫libcssl,以串口I/O事件驅動設備的數據采集。短信收發采用PDU模式,能夠處理中文、英文和中英文短信。異步事件驅動的架構可以提高系統并發處理性能,程序能夠執行多個異步操作而不調用阻塞線程,降低系統開銷。嵌入式系統加GSM模塊的系統組成體積小巧,非常適合于偏遠地區或移動的數據采集系統。根據系統的需要,還可以充分利用MC35模塊的GPRS功能,實現高速的數據采集。
參考文獻:
[1] 程全.李向東.基于GSM模塊與AT98C51的接口設計及應用.微計算機信息.2006:9-2:293-295
[2] 萬求.李淼.張建.羅毅.GSM短信傳送文件的方法的研究與實現.計算機工程與應用.2006:32:122-125
[3] 吳琳艷.基于TC35模塊和VB的短消息接入收發設計.武漢理工大學學報.2006.28.11:153-155
linux操作系統文章專題:linux操作系統詳解(linux不再難懂)
評論