關 閉

        新聞中心

        EEPW首頁 > 安全與國防 > 設計應用 > 嵌入式系統中短消息實時處理的實現

        嵌入式系統中短消息實時處理的實現

        ——
        作者:華東師范大學 李德領 馬潮 時間:2007-01-26 來源:《單片機與嵌入式系統應用》 收藏
        引言

        gsm數字蜂窩移動通信技術已得到成熟而廣泛的應用,目前以建成的覆蓋全國的gsm數字蜂窩移動通信網,是我國公眾移動通信網的重要方式。它能提供話音、短消息、數據等多種業務。短消息服務是gsm網絡的一項重要業務,在遠距離監控、數據采集、gps定位、無線報警、繳費通知、車輛調度等領域有著廣泛的應用。

        本文引用地址:http://www.104case.com/article/20668.htm

        gsm模塊通常都提供uart串行接口,因此很容易和單片機在物理層上互聯。使用符合gsm07.05和gsm07.07標準的at指令集,可以使gsm模塊方便地完成短消息接收/發送等各種操作。其通信框圖如圖1所示。

        移動設備me主要負責與gsm網絡進行無線通信,終端適配器ta負責me與外部終端設備te的信息交換,at指令就是在ta與te之間傳送的。te可以是pc,或者是單片機系統,通過at指令與me進行信息交互。現在市場上的gsm模塊,如tc35、falcom等,都把me和ta集成在一起,這樣整個通信就變成了te與gsm模塊之間的通信了。

        一般地,gsm模塊在處理短消息時,采用一問一答的信息交互方式,這比較符合at指令集的精神。但在實際應用中,發現這種方法存在一定的缺點:模塊接收到短消息并存儲起來,用戶再用查詢方式,發送指令“at+cmgl”或“at+cmgr”,使短消息傳送到te,這中間會有一定的延時。另外,由于sim卡容量有限,要保證短消息及時準備地接收,還要經常刪除sim卡中的短消息,這樣多次的讀寫操作,勢必會影響sim卡的壽命。因此,有必要進行一些軟件設置,使短消息不通過sim卡,而直接發送至終端設備。本文給出一種在嵌入式系統中實時處理短消息的實現方法,當移動設備gsm模塊接收到短消息時,直接將消息轉發到終端設備,提高系統的響應速度和處理效率。

        1 硬件接口實現

        一般,gsm無線通信控制終端采用標準的gsm模塊進行二次開發,目前市場上很多,如tc35、falcom、wismo3等。它們都具備gsm無線通信的全部功能,支持gsm07.05,gsm07.07所定義的at指令集。

        在本設計中,采用的gsm通信模塊為falcomc2d,單片機使用的是atmel公司的高速8位處理器atmega128。atmega128內部集成有4kb的ram,4kb的eeprom,128kb的flash,以及2個uart串行接口等。其高速和大容量ram的特性,為處理短消息這樣的大數據包提供了便利;同時,節省了外圍器件,使得硬件結構簡化,提高系統可靠性。中文液晶屏用來顯示接收到的中英文短信。系統的硬件接口框圖如圖2所示。

        2 系統參數設置

        短消息的發送和接收控制模式有三種:block模式、pdu模式和text模式。使用block模式需要手機生產廠家提供驅動支持。目前,pdu模式已取代block模式,而text模式不支持中文。因此,為了系統的通用性,兼容中英文短消息的發送接收,本系統使用pdu模式來處理短消息。

        在進行系統設置前,先簡要說明一下短消息類(class)的概念:根據指定存儲的位置,短消息分為class0-3四個類,也可以不指定類別(no class),由移動設備按默認設置進行處理,存儲到內存或者sim卡中。在tpdu的tp-dcs字節中,當bit7-bit4為00x1、1111時,bit1-bit0指示消息所屬類。

        00——class 0,可直接顯示。

        01——class 1,默認儲存在me內存中。

        02——class 2,儲存在sim卡中。

        03——class 3,可直接傳輸到終端設備te。

        默認的短消息存在sim卡中,無類別的短消息通常也存在sim卡中。

        gsm modem一般都支持一條“at+cnmi”指令,用于設定當有某類短消息到達時,如何處理它——只儲存在制定的內存(易失的/非易失的)中;先儲存后通知te;直接轉發到te,等等。

        “at+cnmi”指令語法為:

        at+cnmi=<mode>,<mt>,<bm>,<ds>,<bfr>

        (1)<mode>控制通知te的方式。

        0——先將通知緩存起來,再按照<mt>的值進行發送。

        1——在數據線空閑的情況下,通知te,否則,不通知te。

        2——數據線空閑時,直接通知te;否則先將通知緩存起來,待數據線空閑時再行發送。

        3——直接通知te。在數據線被占用的情況下,通知te的消息將混合在數據中一起傳輸。

        (2)<mt>設置短消息存儲和通知te的內容。

        0——接受的短消息存儲到默認的內存位置(包括class 3),不通知te。

        1——接收的短消息儲存到默認的內存位置,并且向te發出通知(包括class 3)。通知的形式為:

        +cmti:”sm”,<index>

        2——對于class 2短消息,儲存到sim卡,并且向te發出通知;對于其他class,直接將短消息轉發到te:

        +cmt:[<alpha>],<length><cr><lf><pdu>(pdu模式)

        或者+cmt:<oa>,[<alpha>,]<scts>[,<tooa>,<fo>,<pid>,<dcs>,<sca>,<tosca>,<length>]<cr><lf><data>(text模式)

        3——對于class 3短消息,直接轉發到te,同<mt>=2;對于其他class,同<mt>=1。

        (3)bm、ds、bfr的含義,請參考相關標準文檔。一般不需要去關心它們,設置為0即可。

        綜合以上分析,若使短消息不經過sim卡,直接發送至te,可以設置:

        at+cnmi=2,2,0,0,0

        但是這樣還有一個問題,class 2的短信,還是會存入sim卡中,并發送+cmti:”sm”,<index>。那么,接收程序需要處理短信通知和內容兩種情況,增加了復雜性。如果發送方也由程序控制,可以只發no class和class 1的短信。這里選用no class的配置。pdu模式下,令tp-dcs的bit7-bit4為00x0,即可設置發送的短信為no class。通常用手機發送的短信,也是無類別的。

        通信時,發送接收雙方要統一短信格式。在發送方設置at+cmgf=0,確定短信發送格式為pdu方式。

        在接收方設置:

        at+cmgf=0 //短信接收格式為pdu方式

        at+csms=0

        如果at+csms=1,接收到短信時,te需在一定的時間內發送反饋消息至模塊;若超時,<mode>和<mt>的值會強制復位到0。那么,再有新的短信將不能被正確處理,需要用“at+cnmi”指令重新設置參數才行。這增加了程序處理的復雜性。at+csms=0時,省去了這些麻煩。

        3 pdu模式下的中英文通信接收實現

        系統參數設置好以后,當接收到新的短信時,gsm模塊直接轉發至te的格式如下所示:

        +cmt:,23

        0891683108200105f0040ba13119388742f5000850802251739120044f60597d

        “+cmt:”為短消息指示標識,由at+cnmi的值確定。“23”指明該短消息pdu數據包長度為23字節。第2行為十六進制數據,總長度為32字節,其中smsc地址占用9字節,其余23字節為tpdu數據。

        需要指出的是,和at指令中的指令符號、數字一樣,pdu數據都是以ascii編碼的形式傳送的,比如“a”的ascii編碼為41h,“0”的ascii編碼為30h等。pdu數據包的內容是以十六進制表示的數據,但并不是直接向單片機傳遞十六進制數據,而是把每一位十六進制數以ascii編碼來發送。例如:08h會以30h(“0”),38h(“8”)的形式發送。這樣,1個字節的十六進制數就變成2個字節的ascii碼。但是,pdu數據包中的數據字節長度部分仍然是原始十六進制字節的長度,而不是變成ascii碼的字節長度,這在編程時應特別注意,否則,接收和處理數據就會不完整。單片機接收到pdu數據包數據后,必須將其恢復成十六進制數據,其算法如下:

        設a為接收的ascii碼,b為轉換后的十六進制數。如果a<39h,則b=a-30h;如果a>39h,則b=a-30h-07h,最后把前后2個數合并為1個字節。

        pdu數據包有著嚴格的定義,現簡單介紹如下:

        pdu的這種格式,層次清楚,結構清晰,方便接收。在本系統中,采用usart中斷方式接收短信,充分利用了avr系列單片機指令執行速度塊的特點,并在接收過程中運用狀態機的思想,解析出短信中的發送源號碼、日期時間、數據編碼方案和用戶短信數據。接收到一個完整的pdu數據包后,中斷程序中設置接收完成標志為1。在主程序中,檢測到接收完成標志為1時,就根據數據編碼方案,對接收到的短信解碼并保存,并準備下一條段短信的接收。如果短信到來時ta與te的數據線忙,則短信會暫時保存在ta的緩存中,等數據線空閑時再轉發至te。

        在pdu模式中,發送普通的ascii字符用7-bit編碼方式,將一串7-bit字符編碼為8-bit數據,每8個字符可壓縮成7個。如果發送中文字符,則采用ucs2編碼方式,每個中文字符用16位的unicode字符表示;如果是中英文混合的短信,由于英文字符只占1字節,需要補0,成為16位的編碼。例如,“你好!”的unicode編碼為4f60597d0021,其中“!”的ascii碼為21h,編碼后為0021h。pdu的用戶數據段最大容量是140字節,gsm模塊發送給單片機的是280個ascii編碼。除此之外,還要接收保存發送源號碼、日期和時間等信息。由于atmega128有4kb內部sram,為短信的接收和解碼提供了足夠的空間。這是它的一大優勢。pdu串的用戶信息長度tpudl,在7-bit編碼時,指原始短消息的字符個數,而不是編碼后的字節數;在ucs2編碼時,指編碼后的十六進制字節數,因為1個字符用2個字節表示,所以經ucs2編碼后,字節數等于原始短消息字符數的2倍。

        pdu模式下可以發送中英文短信,但是對英文字符和數字的7-bit編碼/解碼比較復雜,如果只需要發送和接收純英文字符和數字字符,最好采用text方式。

        3.1 7-bit用戶數據解碼

        7-bit數據解碼時,將源數據每7個字節分為一組,解碼成8個字符。基本自然是:將第n個字節左移n位,再加上前一字節的剩余數據,即第(n-1)個字節右移(8-n)位的數值,屏幕最高位,即得到一目標字符數據,n=0…6。第7個字節右移1位就得到解碼后的第8個字符數據。

        3.2 中文字符解碼

        短消息的中文字符采用unicode 編碼,占用2字節,不是目前國內常用的gb-2312編碼,為了能夠在帶有gb-2312漢字庫的液晶上顯示,還需要進行中文編碼的轉換。

        基本思想就是建立unicode和gb-2312兩個中文編碼表,通過查找實現相互轉換。具體過程這里不再敘述。請參考文獻[1]。

        結語

        上述介紹的在嵌入式系統中,實時接收處理短消息的設計方案,已在車載gsm-gps系統上應用。經過長時間的操作使用,系統工作穩定,用戶反映良好。



        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 广宁县| 万年县| 瑞丽市| 盖州市| 高尔夫| 翼城县| 陇川县| 东兰县| 循化| 清新县| 浙江省| 邵阳县| 城口县| 宣化县| 虎林市| 新野县| 习水县| 库尔勒市| 辽阳县| 南陵县| 正蓝旗| 赞皇县| 曲松县| 绥阳县| 宁化县| 灯塔市| 石河子市| 荔波县| 临沭县| 科尔| 那坡县| 苏尼特右旗| 都安| 井研县| 南通市| 玛纳斯县| 黑龙江省| 沙坪坝区| 安泽县| 于都县| 万宁市|