2018-05-04 心血來(lái)潮的筆記

隨筆篇1--短信模塊

很久沒有寫點(diǎn)技術(shù)筆記了财著,今天隨筆記錄和回憶一下之前短信模塊,以防被如今重復(fù)無(wú)積累的事情所遺忘撑碴。


正題 關(guān)于 GSM SMS && MMS 封裝篇


首先要理解一些基本的常見縮寫名詞

GSM Global System for MobileCommunication 全球移動(dòng)通信系統(tǒng)撑教,一種2G網(wǎng)絡(luò)標(biāo)準(zhǔn)

SMS Short Message Service 短消息服務(wù)

EMS Enhanced Message Service 增強(qiáng)型短消息服務(wù)

CBS Cell Broadcast Service 小區(qū)廣播服務(wù)

MMS Multimedia Message Service 多媒體消息服務(wù)

PDU Protocol Data Unit 協(xié)議數(shù)據(jù)單元,由Header和Data部分組成

TPDU Transfer Protocol Data Unit 傳輸協(xié)議數(shù)據(jù)單元醉拓,是傳輸層的PDU

MO Mobile Originated 消息的發(fā)送方

MT Mobile Terminal 消息的接收方

MS Mobile Station 移動(dòng)臺(tái)伟姐,在業(yè)務(wù)流程中可能是MO或者M(jìn)T

SMSC Short Message Service Centre 短消息服務(wù)中心

MMSC Multimedia Message Service Centre 多媒體消息服務(wù)中心

3GPP 3rd GenerationPartnership Project 第三代合作伙伴計(jì)劃,GSM核心的技術(shù)規(guī)范

OMA Open Mobile Alliance 開放移動(dòng)聯(lián)盟亿卤,一個(gè)標(biāo)準(zhǔn)化組織

RIL Radio Interface Layer 無(wú)線接口層愤兵,可以看做是modem的HAL層

SM-TL ShortMessage Transfer Layer 短消息傳輸過程中的傳輸層

OTA OverThe Air 空中接口

WAP Wireless Application Protocol 無(wú)線應(yīng)用協(xié)議,將HTML轉(zhuǎn)成WML以便傳輸

WSP Wireless Session Protocol 無(wú)線會(huì)話協(xié)議

SI Service Indication 服務(wù)通知排吴,讓用戶主動(dòng)打開的PUSH消息

SL Service Load 服務(wù)加載秆乳,PUSH消息到來(lái)會(huì)自動(dòng)打開鏈接

2.短信發(fā)送接口

短彩信的接口文件:frameworks\opt\telephony\src\java\android\telephony\SmsManager.java

 ?  void sendTextMessage(
        String destinationAddress, String scAddress, String text,
        PendingIntent sentIntent, PendingIntent deliveryIntent);

?   void sendTextMessage(String destinationAddress, String scAddress, String text,
        PendingIntent sentIntent, PendingIntent deliveryIntent, int priority,
        boolean isExpectMore, int validityPeriod);

?   void sendMultimediaMessage(Context context, Uri contentUri, String locationUrl,
        Bundle configOverrides, PendingIntent sentIntent);
.....還有很多不一一粘貼,可具體到類中查看

2 短消息類型

短消息服務(wù)分為:

  1. 普通短信:
    單條短信最多160個(gè)7-BIT字符/140個(gè)8-BIT字符/70個(gè)16-BIT字符,多條普通短信將組成串接短信(SMS Concatenation)

  2. EMS:
    Enhanced Message Service屹堰,歷史的產(chǎn)物肛冶,現(xiàn)在已經(jīng)見不到了,增強(qiáng)型短信双藕,可以發(fā)送少量的音頻淑趾,是多媒體彩信的前身,大小不能超過1KB

  3. CBS:
    Cell Broadcast Service忧陪,小區(qū)廣播,國(guó)內(nèi)沒有這玩意

3 普通短信四種類型PDU

根據(jù)MTI(Message Type Indicator)類型可以將普通短信分成四種類型:SMS-SUBMIT近范,SMS-DELIVERY嘶摊,SMS-STATUS-REPORT,SMS-COMMAND评矩,其中SMS-COMMAND目前不支持叶堆。

3.1 First Byte

每個(gè)PDU的第一個(gè)字節(jié)包含了豐富的意義,

bit7: TP-Reply-Path

1 有

0 無(wú)

bit6: 指示是否有userdata header (UDH)

1 有

0 無(wú)

bit4.bit3: TP-Validity-Period (submit類型的PDU才有意義)

00: len=0

10: len=1

01/11: len=7

bit1.bit0: MTI – Message Type Indicator

00 Delevery (MT 短信:SC 》 MS)

01 Submit (MO短信:MS 》 SC)

10 Status Report (短信發(fā)送之后由SC反饋給發(fā)送方的狀態(tài)報(bào)告:SC 》 MS)

3.2 SMS-SUBMIT

MO類型短信斥杜,從MS 》 SMSC

解析方法在:

frameworks\opt\telephony\src\java\com\android\internal\telephony\gsm\ SmsMessage.java

void parseSmsSubmit(PduParser p, int firstByte)虱颗;

4 短信發(fā)送流程

QQ截圖20180504103055.png

短信發(fā)送需要destinationAddress(收件人號(hào)碼)、scAddress(短信中心蔗喂,可為null)忘渔、messages(消息內(nèi)容,是一個(gè)ArrayList缰儿,每條消息不能超出單條短信的長(zhǎng)度)畦粮、sentIntents(PendingIntent,短信發(fā)送到SMSC之后通知發(fā)送方)乖阵、deliveryIntents(PendingIntent宣赔,短信中心返回狀態(tài)報(bào)告之后通知發(fā)送方這條短信的狀態(tài))。

發(fā)送前需要構(gòu)造SMS-SUBMIT類型的PDU瞪浸。

4.2 GSM SmsMessage的解碼接口

frameworks\opt\telephony\src\java\com\android\internal\telephony\gsm\ SmsMessage.java提供了對(duì)短信內(nèi)容進(jìn)行編碼以及對(duì)短信PDU進(jìn)行解碼的操作儒将,這是GSM短信的最核心的內(nèi)容。

TextEncodingDetails calculateLength(CharSequence msgBody,
        boolean use7bitOnly)对蒲;
2)   SubmitPdu getSubmitPdu(String scAddress,
        String destinationAddress, String message,
        boolean statusReportRequested, byte[] header, int encoding,
        int languageTable, int languageShiftTable, int validityPeriod)
3)  SmsMessage newFromCMT(String[] lines)钩蚊;

4.3 計(jì)算長(zhǎng)度以確定編碼方式

最開始需要計(jì)算短信長(zhǎng)度,用以確定短信內(nèi)容的編碼方式齐蔽,調(diào)用的就是上面的接口calculateLength

  1. 7-BIT編碼規(guī)則在3GPP 23.038 clause 6.2中有詳細(xì)規(guī)定两疚,下面的這張表是GSM標(biāo)準(zhǔn)編碼表


    QQ截圖hh.png

默認(rèn)的短信長(zhǎng)度是140個(gè)8-BIT字符,經(jīng)過7-BIT轉(zhuǎn)換之后得到 140 * 8 / 7 = 160個(gè)7-BIT字符

強(qiáng)制7bit 重要::這種需要在海外的項(xiàng)目中是有要求的含滴。因?yàn)橛行﹪?guó)外的運(yùn)營(yíng)商并沒有提供網(wǎng)絡(luò)側(cè)的轉(zhuǎn)換诱渤,比如德語(yǔ)?通常來(lái)說會(huì)要求轉(zhuǎn)成英文字母a,而這些一般是由運(yùn)營(yíng)商來(lái)做的谈况。

  1. 8-BIT勺美,這種編碼方式很少使用

  2. 16-BIT递胧,當(dāng)無(wú)法使用7-BIT進(jìn)行編碼時(shí),就會(huì)使用UCS2進(jìn)行編碼赡茸,這種編碼方式基本可以滿足我們的要求

4.4 構(gòu)造串接短信頭部

從應(yīng)用層傳過來(lái)的消息內(nèi)容條數(shù)可以知道這條短信是否是串接短信缎脾,如果是串接短信,需要構(gòu)造短信頭(SmsHeader占卧,即PDU中的UDH)來(lái)進(jìn)行組織遗菠。如下圖。
concatRef.refNumber標(biāo)識(shí)當(dāng)前的短信片段ID华蜒,這是從第一條短信片段開始逐一遞增的辙纬;
concatRef.seqNumber標(biāo)識(shí)這條短信片段在整條串接短信中的位置,這是用來(lái)標(biāo)識(shí)拼接順序的
concatRef.msgCount標(biāo)識(shí)這條串接短信的片段數(shù)

QQ截圖20180504112926.png

4.5 構(gòu)造PDU

有了足夠的元素叭喜,開始構(gòu)造SMS-SUBMIT PDU贺拣,還是調(diào)用SmsMessage中的getSubmitPdu方法。
1)構(gòu)造FisrtByte捂蕴,


QQ截圖123.png

2)填充UserData和UserDataLength


QQ截圖MMMMMMM.png

4.6 發(fā)送過程

SMS-SUBMIT 類型的PDU構(gòu)造完成譬涡,準(zhǔn)備調(diào)用RIL接口發(fā)送。

1)發(fā)送之前檢查當(dāng)時(shí)是否允許發(fā)送啥辨。

SmsUsageMonitor這個(gè)類是用來(lái)檢查某個(gè)APK短時(shí)間內(nèi)發(fā)送短信數(shù)量是否超標(biāo)涡匀。

有時(shí)候我們測(cè)試群發(fā)短信會(huì)彈出“在發(fā)送大量短信。是否允許該應(yīng)用繼續(xù)發(fā)送短信?”就是這個(gè)限制在起作用


QQ截圖22222222222222222222.png

2)RIL的處理方式是異步的委可,因此調(diào)用RIL接口發(fā)送之前悬荣,需要有Message來(lái)接收RIL的結(jié)果村怪。


QQ截圖JK.png

。。宫补。凛剥。步淹。贾富。。崇决。材诽。。恒傻。脸侥。。盈厘。睁枕。。。外遇。注簿。未完待續(xù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市跳仿,隨后出現(xiàn)的幾起案子诡渴,更是在濱河造成了極大的恐慌,老刑警劉巖菲语,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妄辩,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡山上,警方通過查閱死者的電腦和手機(jī)恩袱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)胶哲,“玉大人,你說我怎么就攤上這事潭辈⊙煊欤” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵把敢,是天一觀的道長(zhǎng)寄摆。 經(jīng)常有香客問我,道長(zhǎng)修赞,這世上最難降的妖魔是什么婶恼? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮柏副,結(jié)果婚禮上勾邦,老公的妹妹穿的比我還像新娘。我一直安慰自己割择,他們只是感情好眷篇,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著荔泳,像睡著了一般蕉饼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上玛歌,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天昧港,我揣著相機(jī)與錄音,去河邊找鬼支子。 笑死创肥,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瓤的,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼休弃,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了圈膏?” 一聲冷哼從身側(cè)響起塔猾,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎稽坤,沒想到半個(gè)月后丈甸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡尿褪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年睦擂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杖玲。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡顿仇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出摆马,到底是詐尸還是另有隱情臼闻,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布囤采,位于F島的核電站述呐,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蕉毯。R本人自食惡果不足惜乓搬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望代虾。 院中可真熱鬧进肯,春花似錦、人聲如沸褐着。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)含蓉。三九已至频敛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間馅扣,已是汗流浹背斟赚。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留差油,地道東北人拗军。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓任洞,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親发侵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子交掏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361