<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          關(guān) 閉

          新聞中心

          EEPW首頁 > 安全與國防 > 設(shè)計(jì)應(yīng)用 > 嵌入式系統(tǒng)中短消息實(shí)時(shí)處理的實(shí)現(xiàn)

          嵌入式系統(tǒng)中短消息實(shí)時(shí)處理的實(shí)現(xiàn)

          ——
          作者:華東師范大學(xué) 李德領(lǐng) 馬潮 時(shí)間:2007-01-26 來源:《單片機(jī)與嵌入式系統(tǒng)應(yīng)用》 收藏
          引言

          gsm數(shù)字蜂窩移動(dòng)通信技術(shù)已得到成熟而廣泛的應(yīng)用,目前以建成的覆蓋全國的gsm數(shù)字蜂窩移動(dòng)通信網(wǎng),是我國公眾移動(dòng)通信網(wǎng)的重要方式。它能提供話音、短消息、數(shù)據(jù)等多種業(yè)務(wù)。短消息服務(wù)是gsm網(wǎng)絡(luò)的一項(xiàng)重要業(yè)務(wù),在遠(yuǎn)距離監(jiān)控、數(shù)據(jù)采集、gps定位、無線報(bào)警、繳費(fèi)通知、車輛調(diào)度等領(lǐng)域有著廣泛的應(yīng)用。

          本文引用地址:http://www.ex-cimer.com/article/20668.htm

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

          移動(dòng)設(shè)備me主要負(fù)責(zé)與gsm網(wǎng)絡(luò)進(jìn)行無線通信,終端適配器ta負(fù)責(zé)me與外部終端設(shè)備te的信息交換,at指令就是在ta與te之間傳送的。te可以是pc,或者是單片機(jī)系統(tǒng),通過at指令與me進(jìn)行信息交互?,F(xiàn)在市場(chǎng)上的gsm模塊,如tc35、falcom等,都把me和ta集成在一起,這樣整個(gè)通信就變成了te與gsm模塊之間的通信了。

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

          1 硬件接口實(shí)現(xiàn)

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

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

          2 系統(tǒng)參數(shù)設(shè)置

          短消息的發(fā)送和接收控制模式有三種:block模式、pdu模式和text模式。使用block模式需要手機(jī)生產(chǎn)廠家提供驅(qū)動(dòng)支持。目前,pdu模式已取代block模式,而text模式不支持中文。因此,為了系統(tǒng)的通用性,兼容中英文短消息的發(fā)送接收,本系統(tǒng)使用pdu模式來處理短消息。

          在進(jìn)行系統(tǒng)設(shè)置前,先簡(jiǎn)要說明一下短消息類(class)的概念:根據(jù)指定存儲(chǔ)的位置,短消息分為class0-3四個(gè)類,也可以不指定類別(no class),由移動(dòng)設(shè)備按默認(rèn)設(shè)置進(jìn)行處理,存儲(chǔ)到內(nèi)存或者sim卡中。在tpdu的tp-dcs字節(jié)中,當(dāng)bit7-bit4為00x1、1111時(shí),bit1-bit0指示消息所屬類。

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

          01——class 1,默認(rèn)儲(chǔ)存在me內(nèi)存中。

          02——class 2,儲(chǔ)存在sim卡中。

          03——class 3,可直接傳輸?shù)浇K端設(shè)備te。

          默認(rèn)的短消息存在sim卡中,無類別的短消息通常也存在sim卡中。

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

          “at+cnmi”指令語法為:

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

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

          0——先將通知緩存起來,再按照<mt>的值進(jìn)行發(fā)送。

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

          2——數(shù)據(jù)線空閑時(shí),直接通知te;否則先將通知緩存起來,待數(shù)據(jù)線空閑時(shí)再行發(fā)送。

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

          (2)<mt>設(shè)置短消息存儲(chǔ)和通知te的內(nèi)容。

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

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

          +cmti:”sm”,<index>

          2——對(duì)于class 2短消息,儲(chǔ)存到sim卡,并且向te發(fā)出通知;對(duì)于其他class,直接將短消息轉(zhuǎn)發(fā)到te:

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

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

          3——對(duì)于class 3短消息,直接轉(zhuǎn)發(fā)到te,同<mt>=2;對(duì)于其他class,同<mt>=1。

          (3)bm、ds、bfr的含義,請(qǐng)參考相關(guān)標(biāo)準(zhǔn)文檔。一般不需要去關(guān)心它們,設(shè)置為0即可。

          綜合以上分析,若使短消息不經(jīng)過sim卡,直接發(fā)送至te,可以設(shè)置:

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

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

          通信時(shí),發(fā)送接收雙方要統(tǒng)一短信格式。在發(fā)送方設(shè)置at+cmgf=0,確定短信發(fā)送格式為pdu方式。

          在接收方設(shè)置:

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

          at+csms=0

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

          3 pdu模式下的中英文通信接收實(shí)現(xiàn)

          系統(tǒng)參數(shù)設(shè)置好以后,當(dāng)接收到新的短信時(shí),gsm模塊直接轉(zhuǎn)發(fā)至te的格式如下所示:

          +cmt:,23

          0891683108200105f0040ba13119388742f5000850802251739120044f60597d

          “+cmt:”為短消息指示標(biāo)識(shí),由at+cnmi的值確定?!?3”指明該短消息pdu數(shù)據(jù)包長(zhǎng)度為23字節(jié)。第2行為十六進(jìn)制數(shù)據(jù),總長(zhǎng)度為32字節(jié),其中smsc地址占用9字節(jié),其余23字節(jié)為tpdu數(shù)據(jù)。

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

          設(shè)a為接收的ascii碼,b為轉(zhuǎn)換后的十六進(jìn)制數(shù)。如果a<39h,則b=a-30h;如果a>39h,則b=a-30h-07h,最后把前后2個(gè)數(shù)合并為1個(gè)字節(jié)。

          pdu數(shù)據(jù)包有著嚴(yán)格的定義,現(xiàn)簡(jiǎn)單介紹如下:

          pdu的這種格式,層次清楚,結(jié)構(gòu)清晰,方便接收。在本系統(tǒng)中,采用usart中斷方式接收短信,充分利用了avr系列單片機(jī)指令執(zhí)行速度塊的特點(diǎn),并在接收過程中運(yùn)用狀態(tài)機(jī)的思想,解析出短信中的發(fā)送源號(hào)碼、日期時(shí)間、數(shù)據(jù)編碼方案和用戶短信數(shù)據(jù)。接收到一個(gè)完整的pdu數(shù)據(jù)包后,中斷程序中設(shè)置接收完成標(biāo)志為1。在主程序中,檢測(cè)到接收完成標(biāo)志為1時(shí),就根據(jù)數(shù)據(jù)編碼方案,對(duì)接收到的短信解碼并保存,并準(zhǔn)備下一條段短信的接收。如果短信到來時(shí)ta與te的數(shù)據(jù)線忙,則短信會(huì)暫時(shí)保存在ta的緩存中,等數(shù)據(jù)線空閑時(shí)再轉(zhuǎn)發(fā)至te。

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

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

          3.1 7-bit用戶數(shù)據(jù)解碼

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

          3.2 中文字符解碼

          短消息的中文字符采用unicode 編碼,占用2字節(jié),不是目前國內(nèi)常用的gb-2312編碼,為了能夠在帶有g(shù)b-2312漢字庫的液晶上顯示,還需要進(jìn)行中文編碼的轉(zhuǎn)換。

          基本思想就是建立unicode和gb-2312兩個(gè)中文編碼表,通過查找實(shí)現(xiàn)相互轉(zhuǎn)換。具體過程這里不再敘述。請(qǐng)參考文獻(xiàn)[1]。

          結(jié)語

          上述介紹的在嵌入式系統(tǒng)中,實(shí)時(shí)接收處理短消息的設(shè)計(jì)方案,已在車載gsm-gps系統(tǒng)上應(yīng)用。經(jīng)過長(zhǎng)時(shí)間的操作使用,系統(tǒng)工作穩(wěn)定,用戶反映良好。



          關(guān)鍵詞:

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();