`

CMPP协议对长短信的支持

阅读更多

CMPP协议对长短信的支持

导航定位 2010-08-28 13:56:00 阅读42 评论0   字号: 订阅

1。CMPP3.0 超长短信
http://59905.blog.spforum.net/26058.html
1、长短信息:是指超过70个汉字,140个字节的信息内容。      

        最近在做一个某地市公司运营商的GPRS导引项目的时候,运营商要求将对用户的提示短信息(超过140个字节)发送到用户手机,在用户的手机上一次全显示。

        上网搜索了一些相关的资料,现在将实现总结如下:

一、CMPP协议相关字段分析(在此只讲发长短信相关的cmpp_submit消息,cmpp的其他内容的请参考《中国移动互联网短信网关接口协议(V3.0.0).doc》

1.1.1.1      CMPP_SUBMIT消息定义(SP--->SMG)

 

字段名
字节数
属性
描述
Msg_Id
8
Unsigned Integer
信息标识。
Pk_total
1
Unsigned Integer
相同Msg_Id的信息总条数,从1开始。
Pk_number
1
Unsigned Integer
相同Msg_Id的信息序号,从1开始。
Registered_Delivery
1
Unsigned Integer
是否要求返回状态确认报告:
0:不需要;
1:需要。
Msg_level
1
Unsigned Integer
信息级别。
Service_Id
10
Octet String
业务标识,是数字、字母和符号的组合。
Fee_UserType
1
Unsigned Integer
计费用户类型字段:
0:对目的终端MSISDN计费;
1:对源终端MSISDN计费;
2:对SP计费;
3:表示本字段无效,对谁计费参见Fee_terminal_Id字 段。
Fee_terminal_Id
32
Octet String
被计费用户的号码,当Fee_UserType为3时该值有效,当Fee_UserType为0、1、2时该值无意义。
Fee_terminal_type
1
Unsigned Integer
被计费用户的号码类型,0:真实号码;1:伪码。
TP_pId
1
Unsigned Integer
GSM协议类型。详细是解释请参考GSM03.40中的9.2.3.9。
TP_udhi
1
Unsigned Integer
GSM协议类型。详细是解释请参考 GSM03.40中的9.2.3.23,仅使用1位,右对齐。
Msg_Fmt
1
Unsigned Integer
信息格式:
0:ASCII串;
3:短信写卡操作;
4:二进制信息;
8:UCS2编码;
15:含GB汉字。。。。。。
Msg_src
6
Octet String
信息内容来源(SP_Id)。
FeeType
2
Octet String
资费类别:
01:对“计费用户号码”免费;
02:对“计费用户号码”按条计信息费;
03:对“计费用户号码”按包月收取信息费。
FeeCode
6
Octet String
资费代码(以分为单位)。
ValId_Time
17
Octet String
存活有效期,格式遵循SMPP3.3协议。
At_Time
17
Octet String
定时发送时间,格式遵循SMPP3.3协议。
Src_Id
21
Octet String
源号码。SP的服务代码或前缀为服务代码的长号码, 网关将该号码完整的填到SMPP协议Submit_SM消息相应的source_addr字段,该号码最终在用户手机上显示为短消息的主叫号码。
DestUsr_tl
1
Unsigned Integer
接收信息的用户数量(小于100个用户)。
Dest_terminal_Id
32*DestUsr_tl
Octet String
接收短信的MSISDN号码。
Dest_terminal_type
1
Unsigned Integer
接收短信的用户的号码类型,0:真实号码;1:伪码。
Msg_Length
1
Unsigned Integer
信息长度(Msg_Fmt值为0时:<160个字节;其它<=140个字节),取值大于或等于0。
Msg_Content
Msg_length
Octet String
信息内容。
LinkID
20
Octet String
点播业务使用的LinkID,非点播类业务的MT流程不使用该字段。

 

红 色部分表示发长短信要更改的字段

洋红色部分表示发长短信可以更改或者不更改的字段

(以下资料参考:http://publishblog.blogdriver.com/zeroliu/1234594.html

在cmpp协议里,CMPP­_SUBMIT消息定义中有相应的参数配置:   
 
TP_udhi :0代表内容体里不含有协议头信息 1代表内容含有协议头信息(长短信,push短信等都是在内容体上含有头内容的)当设置内容体包含协议头,需要根据协议写入相应的信息,长短信协议头有两种:
               
6位协议头格式:05 00 03 XX MM NN
                     byte 1 : 05, 表示剩余协议头的长度
                     byte 2 : 00, 这个值在GSM 03.40规范9.2.3.24.1中规定,表示随后的这批超长短信的标识位长度为1(格式中的XX值)。
                     byte 3 : 03, 这个值表示剩下短信标识的长度
                     byte 4 : XX,这批短信的唯一标志,事实上,SME(手机或者SP)把消息合并完之后,就重新记录,所以这个标志是否唯
                                 一并不是很 重要。
                     byte 5 : MM, 这批短信的数量。如果一个超长短信总共5条,这里的值就是5。
                     byte 6 : NN, 这批短信的数量。如果当前短信是这批短信中的第一条的值是1,第二条的值是2。
                     例如:05 00 03 39 02 01 

               
7 位的协议头格式:06 08 04 XX XX MM NN
                     byte 1 : 06, 表示剩余协议头的长度
                     byte 2 : 08, 这个值在GSM 03.40规范9.2.3.24.1中规定,表示随后的这批超长短信的标识位长度为2(格式中的XX值)。
                     byte 3 : 04, 这个值表示剩下短信标识的长度
                     byte 4-5 : XX XX,这批短信的唯一标志,事实上,SME(手机或者SP)把消息合并完之后,就重新记录,所以这个标志是否唯一并不是很重要。
                     byte 6 : MM, 这批短信的数量。如果一个超长短信总共5条,这里的值就是5。
                     byte 7 : NN, 这批短信的数量。如果当前短信是这批短信中的第一条的值是1,第二条的值是2。
                     例如:06 08 04 00 39 02 01    

二. 实现代码(C#)

            byte[] messageUCS2 = Encoding.BigEndianUnicode.GetBytes(MtMsg);
            int messageUCS2Len = messageUCS2.Length;
            int maxMessageLen = 140;
            if (messageUCS2Len > maxMessageLen)
            {             
                int messageUCS2Count = messageUCS2Len / (maxMessageLen - 6) + 1;
                //长短信分为多少条发送
                byte[] tp_udhiHead = new byte[6];
                tp_udhiHead[0] = 0x05;
                tp_udhiHead[1] = 0x00;
                tp_udhiHead[2] = 0x03;
                tp_udhiHead[3] =//0x0A;
                tp_udhiHead[4] = (byte)messageUCS2Count;
                tp_udhiHead[5] = 0x01;
                //默认为第一条
                for (int i = 0; i < messageUCS2Count; i++)
                {
                    tp_udhiHead[5] = (byte)(i + 1);
                    byte[] msgContent;
                    if (i != messageUCS2Count - 1)
                    {
                        //不为最后一条
                        msgContent =BIConvert.byteAdd(tp_udhiHead, messageUCS2, i * (maxMessageLen - 6), (i + 1) * (maxMessageLen - 6));
                    }
                    else
                    {
                        msgContent = BIConvert.byteAdd(tp_udhiHead, messageUCS2, i * (maxMessageLen - 6), messageUCS2Len);
                    }
                 

                }

            }

 

三、总结。

cmpp发长短信

1、TP_udhi设置为  0x01

2、Msg_Content    按TP_udhi协议填写6字节或者7字节的TP_udhi协议头然后加上经过USC2编码的消息内容。由TP_udhi协议头和消息内容体组成的 Msg_Content总长度不能超过140个字节

3、 Msg_Fmt   设置为    0x08    UCS2编码;

4、Pk_total和Pk_number 可以不设置,如果要设置,就要分别跟TP_udhi的MM和NN字段一致

 

本文转载自:http://oldbc.blog.163.com/blog/static/858697020107281560293/

分享到:
评论
1 楼 playboyb 2013-08-06  
非常感谢你。我做长短信就是看了你的文章,才将问题搞定的。不胜感激!

相关推荐

    利用CMPP\SGIP协议发送长短信发送格式说明

    利用 CMPP/SGIP 协议发送长短信发送格式说明 本资源摘要信息旨在详细解释利用 CMPP/SGIP 协议发送长短信的格式说明。长短信是一种特殊的短信格式,它允许发送超过 70 个汉字的信息内容,但需要将其拆分成多条短信,...

    java实现CMPP协议

    CMPP协议主要用于短信中心(SMSC)与短信网关之间的通信,支持大量并发的短信发送和接收操作,是移动运营商内部的重要通信协议。本文将详细介绍Java实现CMPP协议的相关知识点。 首先,CMPP协议主要由一系列的命令...

    java实现cmpp协议开发代码

    Java实现CMPP协议开发代码主要涉及的是中国移动通信的CMPP(China Mobile Packet Protocol)协议,该协议主要用于短信中心(SMSC)与短信网关(SP)之间的数据传输,包括发送短消息、接收短消息以及相关的控制功能。...

    CMPP协议客户端测试工具

    这个测试工具简化了对CMPP协议的调试和验证过程,确保服务提供商能够正确、高效地与移动网络进行交互。 CMPP协议分为三个主要部分:CMPP_CONNECT、CMPP_SUBMIT和CMPP_DELIVER。CMPP_CONNECT是建立连接的命令,用于...

    CMPP3.0 短信发送

    4. **消息分片**:对于超过单条短信长度限制的长消息,CMPP3.0支持消息分片,即将一条长消息拆分成多条短消息发送。 5. **消息状态报告**:MC在短信成功送达或失败时,会通过CMPP_DELIVER或CMPP_DELIVER_RESP向SP...

    中国移动短信网关模拟器支持cmpp2.0

    4. 支持日志记录,便于分析和调试应用在处理CMPP协议时的行为。 在使用"cmpp2smg"这个压缩包文件时,开发者可以期待找到以下内容: 1. 模拟器软件:可能包含一个可执行文件或一组脚本,用于启动和配置模拟器。 2. ...

    中国移动短信cmpp协议

    CMPP协议定义了短信网关与SP(Service Provider,服务提供商)系统之间的接口,支持点对点、群发等多种短信服务类型,涵盖了短信提交、短信查询、短信退订等业务功能。 2. **引用标准** 该协议可能参照了电信行业...

    华为cmpp协议短信网关Delphi源码

    华为CMPP协议短信网关Delphi源码是一个用于实现与华为短信网关通信的应用程序,主要涉及网络通信类技术。CMPP(China Mobile Protocol for Short Message Peer-to-Peer)是中国移动制定的一种短消息协议,旨在高效、...

    cmpp3 长短信拆分

    CMPP3(China Mobile Short Message Peer-to-Peer Protocol Version 3)是中国移动的一种短消息传输协议,它支持长短信的发送。本文将详细探讨CMPP3协议中的长短信拆分机制,以及如何在Java环境中实现这一功能。 长...

    中国移动通信CMPP协议规范文档

    7. **性能优化**:CMPP协议支持多连接并发,可以有效地提高短信处理速率,满足大规模短信发送的需求。 8. **安全性考虑**:协议中虽未明确提及加密措施,但实际应用中,SP通常会结合SSL/TLS等安全协议来保证数据...

    基于中国移动cmpp3协议开发的短信网关源码

    而"cmpp3"标签则明确指出了该源码与CMPP3.0协议的紧密关系,开发者可以借此深入了解如何使用CMPP协议进行实际的短信业务开发。 【压缩包子文件的文件名称列表】揭示了项目的基本结构: 1. `.depend`:通常是一个...

    用java实现cmpp协议

    CMPP协议支持状态报告功能,当短信发送成功或失败时,服务器会发送状态报告给客户端。客户端需要解析并处理这些报告,以便了解短信发送的状态。 11. **测试与调试** 实现CMPP协议后,需要进行详尽的单元测试和...

    CMPP协议介绍

    4. **分包与重组**:由于TCP的单个报文大小有限,CMPP协议支持对长消息进行分包发送,每个分包都有一个标识,接收方可以根据标识进行重组,恢复原始消息。 5. **确认机制**:CMPP协议采用了三次握手和四次挥手来...

    基于中国移动cmpp3协议开发的短信网关

    开发这样一个网关需要对TCP/IP协议栈有深入理解,熟悉C语言编程,并能准确理解和应用CMPP3协议规范。同时,为了确保服务的稳定性和高可用性,还需要考虑负载均衡、故障恢复、性能优化等多方面的问题。此外,良好的...

    cmpp协议开发

    CMPP协议是基于TCP/IP的通信协议,它支持长连接和短连接,可以处理大量并发请求,适应大规模短信发送需求。协议包含多个命令类型,如提交短信(CMPP_SUBMIT)、查询短信状态(CMPP_QUERY)、接收短信(CMPP_DELIVER...

    基于PHP swoole扩展短信通道cmpp接入

    CMPP协议是基于TCP/IP协议的,主要用于短信中心(SMSC)与业务系统之间的数据传输。它定义了多种消息类型,如提交短信(CMPP_SUBMIT)、查询短信状态(CMPP_QUERY)和接收短信(CMPP_DELIVER)等,覆盖了短信服务的...

Global site tag (gtag.js) - Google Analytics