咱們都知道在國內,有3家運營商(中國聯通,中國移動,中國電信),而這三家運營商也是各自使用的本身的協議,不過倒是大同小異,它們都是基於咱們前兩篇(白話短信協議,白話彩信協議)介紹的短彩信協議,不過是擴展了一些運營商特有信息而已git
那接下我咱們就挑兩個介紹一下,移動的CMPP協議,以及聯通的SGIP協議github
CMPP也有多種版本,這裏咱們以CMPP2.0爲例來介紹,CMPP協議中定義了多種消息類型,主要包括鏈接消息(Connect Message)、提交消息(Submit Message)、送達消息(Deliver Message)、終端消息(Terminate Message)、心跳消息(Active Test Message)post
這裏咱們主要介紹兩個較複雜的Submit Message以及Deliver Message,由於這兩個消息是和咱們短彩信內容相關的,其它的消息類型看名稱就能看得出,是一些功能性的消息,咱們這裏就略過了編碼
CMPP協議也有信息頭和信息體netty
信息頭裏包含兩個信息command_id和sequece_id,它們各佔4個字節,咱們這裏特別解釋一下command_id,command_id表明了消息類型,好比0x00000004
表示是一個Submit Message, 0x00000005
表示一個Deliver Message,其它消息也有一個command_id對應,咱們就不一一列舉了;sequence_id表示流水號,咱們能夠先不用關心code
咱們接着說信息體,先給你列出信息體裏包含的信息:msg_id, pk_total, pk_number, registered_delivery, msg_level, service_id, fee_user_type, fee_terminal_id, tp_pid, tp_udhi, msg_fmt, msg_src, fee_type, fee_code, val_id_time, at_time, src_id, dest_terminal_id, msg_length, msg_content, reservecdn
咱們開始的時候提到過,CMPP是基於短信協議擴展的,那這是怎麼體現的呢?blog
老樣子,咱們先來回顧一下短信協議是什麼樣子的:terminal
那咱們上面那麼多信息是放到PDU哪一個部分的呢?其實咱們上面的信息並非放到PDU中間的,而是放到PDU前面的,那咱們一個CMPP協議組成(這裏列舉的是Submit Message)就是這樣的:get
知道了CMPP的樣子,咱們回過來看一下上面有不少信息,咱們先不用關心全部的值,咱們來看一下和咱們短彩信內容有關的:pk_total, pk_number, tp_pid, tp_udhi, msg_fmt, msg_length, msg_content,其中,msg_content看名稱就知道是咱們的消息內容了,也就是咱們PDU的內容
接着咱們來看剩下的值表示什麼
pk_total, pk_number:還記得咱們講短信協議的時候有提到,長短信會拆分紅多條嗎?咱們當時講到,若是是長短信,UDH中會帶有短信的分段信息(refNr,totalNumberOfSms,seqNr),咱們CMPP協議中也須要指定,其pk_total=totalNumberOfSms,pk_number=seqNr
tp_pid:在短信協議中用來表示上層協議類型,在咱們CMPP協議裏的的值爲0,咱們能夠先不用關心
tp_udhi:若是咱們PDU中UDH有值,該值爲1,反之則爲0
msg_fmt:咱們在講短信協議時有提到過DCS,用來指示如何處理UD,就是這個值了
msg_length:看名稱就知道是PDU的長度
接着咱們來看一下Deliver Message
Deliver Message和Submit Message同樣,包含的內容少了計費相關的信息:msg_id, dest_id, service_id, tp_pid, tp_udhi, msg_fmt, src_terminal_id, registered_delivery, msg_length, msg_content, reserve,和Submit Message的組成同樣,咱們這裏就不重複了
這裏補充一點,咱們能夠看到,Deliver Message中少了pk_total, pk_number,因此在Deliver Message中,咱們的長短信信息就須要從UDH中提取了
好了,Submit Message和Deliver Message中全部和短彩信消息內容相關的信息咱們就介紹完了
SGIP也有多種版本,這裏咱們以SGIP1.2爲例來介紹,SGIP協議中也定義了多種消息類型,主要包括鏈接消息(Bind Message)、提交消息(Submit Message)、送達消息(Deliver Message)、終端消息(Unbind Message)、報告消息(Report Message)
和CMPP同樣,咱們也是主要介紹Submit Message以及Deliver Message,那咱們來看協議的信息頭和信息體
信息頭裏也包含兩個信息command_id和sequece_number,command_id佔4個字節,command_id一樣表明了消息類型,好比0x00000003
表示是一個Submit Message, 0x00000004
表示一個Deliver Message,其它消息也有一個command_id對應,咱們也就不一一列舉了;sequece_number和CMPP不一樣,sequece_number也表示流水號,不過佔用12個字節,咱們也先不用關心
咱們接着說信息體,一樣列出信息體裏包含的信息:sp_number, charge_number, user_number, crop_id, service_type, fee_type, fee_value, given_type, agent_flag, more_late_to_mt_flag, priority, expire_time, schedule_time, report_flag, tp_pid, tp_udhi, message_coding, message_type, message_length, message_content, reserve
一樣咱們仍是看一下SGIP協議組成(這裏也是Submit Message)是什麼樣子:
咱們來看一下和咱們短彩信內容有關的:tp_pid, tp_udhi, message_coding, message_length, message_content
相比於CMPP,SGIP沒有pk_total, pk_number,因此咱們長短信信息只在UDH中,tp_pid, tp_udhi同CMPP同樣,message_coding同CMPP的msg_fmt同樣,message_length, message_content一樣與CMPP同樣
能夠看出,SGIP和CMPP大同小異,固然,它們的編碼順序上會有些前後不一樣,這裏就不詳細介紹了
一樣,接着咱們再來看一下Deliver Message
Deliver Message和Submit Message同樣,包含的信息:sp_number, user_number, tp_pid, tp_udhi, message_coding, msg_length, msg_content, reserve,和Submit Message的組成同樣,咱們這裏也就不重複了
這裏咱們沒有解釋全部的值,也沒沒有具體列出每一個字段佔用的字節和編碼方式,由於這些相比於短彩信的編碼會簡單不少,而且咱們主要是目的是介紹CMPP、SGIP包含的信息,以及瞭解其與短信協議的關係。
固然,若是你對詳細的編碼有興趣,能夠到SMSSP查看