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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 單片機給手機發(fā)短信

          單片機給手機發(fā)短信

          作者: 時間:2013-02-21 來源:網(wǎng)絡(luò) 收藏

          1 串口控制SMS的工作原理

          與手機一般采用串行異步通信接口,具有紅外和通信電纜兩種連接方式,通信速度可設(shè)定,通常為19200bps。采用紅外接口的優(yōu)點是系統(tǒng)與手機電氣隔離,相互不干擾,接口各自獨立,使用方便;缺點是通信距離較短,紅外傳播的方向性對接口相對位置有要求。采用電纜連接時,數(shù)據(jù)傳輸?shù)目煽啃暂^好;其主要缺點是接口的電氣參數(shù)不兼容,設(shè)計不當(dāng)時會對手機的通信質(zhì)量產(chǎn)生影響。筆者經(jīng)過實踐設(shè)計的接口電平轉(zhuǎn)換電路如圖1。

          GSM的短信息業(yè)務(wù)SMS利用信令信道傳輸,這是GSM通信網(wǎng)所特有的。它不用撥號建立連接,把要發(fā)的信息加上目的地址發(fā)送到短信息服務(wù)中心,經(jīng)短消息服務(wù)中心完成存儲后再發(fā)送給最終的信宿。所以當(dāng)目的GSM終端沒開機時信息不會丟失。每個短消息的信息量限制為160字節(jié)。

          現(xiàn)在市場上大多數(shù)手機均支持GSM07.05規(guī)定的AT指令集。該指令集是ETSI(歐洲通信技術(shù)委員會)發(fā)布的,其中包含了對SMS的控制。利用GSM手機的串行接口,向手機收發(fā)一系列的AT命令,就能達到控制手機收發(fā)SMS的目的。ETSI的GSM07.05中用于SMS收發(fā)控制的主要AT命令見表1。

          表1 常用AT指令GSM07.05Function(功能)ATE0RESETAT+CSMS選擇短信息服務(wù)AT+CPMS選擇短信息內(nèi)存AT+CMGF選擇短信息格式AT+CSCA短信息中心地址AT+CNMI顯示新收到的短信息AT+CMGR讀短信息AT+CMGS發(fā)送短信息AT+CMGL列出SIM卡中短信息AT+CMSS從SIM內(nèi)存中息AT+CMGW向SIM內(nèi)存中寫入待息AT+CMGD刪除SIM內(nèi)存中的短信息AT+CSCB選擇蜂窩廣播信息

          GSM手機通過異步通信接口實現(xiàn)對SMS的控制共有三種接入?yún)f(xié)議:Block Mode;基于AT命令的TextMode;基于AT命令的PDU Mode。PDU模式是發(fā)送或接收手機SMS信息的一種方法,短信息正文經(jīng)過十六進制編碼后被傳送。目前,PDU Mode應(yīng)用最為廣泛,基本上全國所有的電信局都提供支持PDU Mode的短消息業(yè)務(wù)。有些地址則不支持Text Mode和Block Mode,這就限制了這兩種接入?yún)f(xié)議的應(yīng)用,而且PDU Mode已有取代Block Mode的趨勢。為了保證系統(tǒng)具有廣泛的適用性,本文采用PDU模式收發(fā)SMS。

          PDU相當(dāng)于一個數(shù)據(jù)包,它由構(gòu)成消息(SMS)的信息組成。作為一種數(shù)據(jù)單元,它必須包含源/目的地址、保護(有效)時間、數(shù)據(jù)格式、協(xié)議類型和正文,正文長度可達140字節(jié),它們都以十六進制表示。PDU結(jié)構(gòu)根據(jù)短消息由移動終端發(fā)起或以移動終端為目的而不同。

          當(dāng)由移動終端發(fā)起時,PDU的格式為:
          SMSCPDU類型MRDAPIDDCSVPUDLUD(0~140octed)

          當(dāng)以移動終端為目的時,PDU的格式為:
          SMSCPDU類型OAPIDDCSSCTSUDLUD(0~140octed)

          其中,SMSC為短消息業(yè)務(wù)中心地址,DA/OA為源/目的地址,PID為協(xié)議識別,DCS為數(shù)據(jù)編碼,UDL為用戶數(shù)據(jù)長度,UD為用戶數(shù)據(jù),VP為有效時間,MR指明是發(fā)出信息,SCTS指明短消息到達業(yè)務(wù)中心的時間。

          2 PDU格式下短信息的接收

          根據(jù)設(shè)置不同,手機將收到的短消息保存在緩存單元或存入SIM卡,單片機從手機中接收短消息實質(zhì)上就是從SIM或緩存中讀出信息。這主要利用AT+CMGR和AT+CMGL兩條指令來完成,其工作過程見圖2。

          由于不同的廠商對AT指令集的解釋代碼和響應(yīng)信息不一樣,所以單片機首先要確認能否與手機建立起通信,一般用ATE指令完成此確認;然后用AT+CMGF指令選定短消息的數(shù)據(jù)格式;在收到手機的正確回答反以AT指令完成讀出功能。一般用AT+CMGL讀取以前的信息,在收到手機的RING(振鈴)數(shù)據(jù)時,用AT+CMGR讀取實時信息。

          以下是筆者設(shè)計的物流數(shù)據(jù)采集系統(tǒng)中用到的接收SMS的一個實例,它說明了PDU模式的應(yīng)用。單片機發(fā)送和接收(手機回答)均為ASCII碼。所用手機為SIEMENS S3508i。

          操作過程如下({}內(nèi)為注釋):

          發(fā)送:ATE

          手機回答:OK {已建立聯(lián)接}

          發(fā)送:AT+CMGF=0 {選用PDU格式}

          手機回答:OK {允許選擇PDU格式}

          發(fā)送:AT+CMGL=2 {列出已有的短信息}

          手機回答:+CMGL:1,2,,24{1表示信息個數(shù),2表示未發(fā)信息,24表示信息總?cè)萘縸

          以上這組PDU格式的十六進制字符串,不但包含了短消息的內(nèi)容,同時包含了發(fā)送者的手機號碼、短信息中心號碼、短消息發(fā)送時間等。

          下面對信息內(nèi)容進行分析:

          0D:短信息中心地址(號碼)長度。

          91:短信息中心號碼類型,91是TON/NPI。TON/NPI遵守International/E.164標(biāo)準,指在號碼前需加'+'號;此外還可直有其他數(shù)值,但91最常用。

          683108370105F0:SMSC 短信息所使用的服務(wù)中心號碼13807310500。它經(jīng)過十六進制以字節(jié)為單位的高低半字節(jié)換位處理,號碼是奇數(shù)的添F,構(gòu)成一個HEX字節(jié)。

          04:PDU類型,文件頭字節(jié)。

          0B:主叫號碼長度。

          81:主叫號碼類型。

          3179133208F1:0A主叫號碼,也經(jīng)過了處理,實際號碼為13973123801。

          00:PID,為協(xié)議標(biāo)識。

          00:DCS短信息編碼類型是GSM Default Alphabet,即由7位ASCII碼移位組成8位十六進制碼(octet)。

          26:UDL經(jīng)處理后的8位碼(octet)短信息字節(jié)長度,它小于消息ASCII碼的長度。

          單片機相關(guān)文章:單片機教程


          單片機相關(guān)文章:單片機視頻教程


          單片機相關(guān)文章:單片機工作原理




          評論


          相關(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); })();