白话CMPP、SGIP

白话CMPP、SGIP

我们都知道在国内,有3家运营商(中国联通,中国移动,中国电信),而这三家运营商也是各自使用的自己的协议,不过却是大同小异,它们都是基于我们前两篇(白话短信协议,白话彩信协议)介绍的短彩信协议,不过是扩展了一些运营商特有信息而已

那接下我我们就挑两个介绍一下,移动的CMPP协议,以及联通的SGIP协议

CMPP协议

CMPP也有多种版本,这里我们以CMPP2.0为例来介绍,CMPP协议中定义了多种消息类型,主要包括连接消息(Connect Message)、提交消息(Submit Message)、送达消息(Deliver Message)、终端消息(Terminate Message)、心跳消息(Active Test Message)

这里我们主要介绍两个较复杂的Submit Message以及Deliver Message,因为这两个消息是和我们短彩信内容相关的,其它的消息类型看名称就能看得出,是一些功能性的消息,我们这里就略过了

CMPP协议也有信息头和信息体

信息头里包含两个信息command_id和sequece_id,它们各占4个字节,我们这里特别解释一下command_id,command_id代表了消息类型,比如0x00000004表示是一个Submit Message, 0x00000005表示一个Deliver Message,其它消息也有一个command_id对应,我们就不一一列举了;sequence_id表示流水号,我们可以先不用关心

我们接着说信息体,先给你列出信息体里包含的信息: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, reserve

我们开始的时候提到过,CMPP是基于短信协议扩展的,那这是怎么体现的呢?

老样子,我们先来回顾一下短信协议是什么样子的:

那我们上面那么多信息是放到PDU哪个部分的呢?其实我们上面的信息并不是放到PDU中间的,而是放到PDU前面的,那我们一个CMPP协议组成(这里列举的是Submit Message)就是这样的:

知道了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协议

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查看

后面的内容我们就会介绍基于netty的短彩信网关SMSSP

你可能感兴趣的:(java,后端,sms平台,短信)