`

CMPP协议对长短信的支持(C#版)

    博客分类:
  • CMPP
 
阅读更多

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字段一致

 

 

 

分享到:
评论

相关推荐

    cmpp3.0移动短信网关c#源代码

    该源代码实现了CMPP协议的上行和下行指令,使得开发者能够方便地在C#环境中与移动运营商的短信网关进行交互,实现短信的发送、接收和管理功能。 CMPP协议是专门为移动数据通信设计的,主要用于短信中心(SMSC)与...

    CMPP.rar_CSharp cmpp_cmpp_cmpp 2.0 C#_短信网关_网关

    本项目"CMPP.rar"是一个基于C#实现的CMPP协议版本2.0的短信网关程序。CMPP 2.0相较于早期版本,进行了优化和增强,提供了更稳定和高效的数据交换机制。开发者通过这个程序可以实现与移动运营商的短信平台进行交互,...

    CMPP3.0 短信发送

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

    Csharp开发的CMPP协议SP端平台.rar_c# cmpp_cmpp_c# cmpp_短信 csharp_短信 c#

    C#开发的CMPP协议SP端平台 1.Sample为示例解决方案 2.GateWaySample是示例项目 3.CMSMGWCenter为短信应用接口,为调用CMSMIF.DLL的示例代码,同时其被GateSample调用. 4.GateWaySample\bin\Debug\GateWaySample.exe为...

    短信网关通信协议库源码(C++实现)——支持CMPP、EMPP及SMGP的众多版本

    首先,CMPP协议是中国移动为SP(Service Provider)提供的标准接口,分为CMPP2.0和CMPP3.0两个版本。CMPP2.0主要处理单条短信提交、查询、接收等功能,而CMPP3.0在2.0的基础上增加了群发、长短信拆分与合并、上行...

    CMPP2.0协议技术

    1. CMPP_SUBMIT:提交短信,将短信内容从SP发送到SMSC,支持长短信分割和编码转换。 2. CMPP_DELIVER:接收短信,SMSC将接收到的短信转发给SP。 3. CMPP_QUERY:查询短信状态,SP可以查询已发送短信的接收情况。 4. ...

    C# 版cmpp3.0短信程序

    CMPP协议基于TCP/IP,确保了短信发送的稳定性和可靠性。 3. **CMPP3.0协议详解**: - **连接建立**:CMPP3.0使用TCP连接到中国移动的短信中心(SMSC),并进行身份验证。 - **消息类型**:包括CMPP_SUBMIT(提交...

    cmpp3.0 c#开发

    6. **数据编码与解码**:CMPP协议使用GBK编码,开发者需掌握GBK编码规则,并能正确地在C#代码中进行字符串与字节流之间的转换。 7. **日志记录**:为了便于调试和问题排查,开发过程中会集成日志系统,记录关键操作...

    CMPP 2.0 C# 源码

    - 支持长短信:通过分段技术,能够发送超过160个字符的短信。 - 提供丰富的状态报告:如短信发送结果报告,便于监控短信服务质量。 3. C#源码实现: - CMPP连接类:通常包含建立TCP连接、心跳检测、断线重连等...

    中国移动CMPP2.0短信接口开发

    总的来说,CMPP2.0短信接口开发涉及到网络编程、协议解析等多个技术领域,C#作为一种强大的.NET开发语言,提供了丰富的类库支持,使得开发者能够方便地实现与移动运营商的接口对接,实现高效、稳定的短信服务。

    CMPP3.0协议源码下载

    5. **数据编码与解码**:CMPP协议中,短信内容可能需要进行7位、8位或16位编码,以适应不同字符集。源码中应该有相应的编码解码函数,以确保在不同平台和网络环境下的兼容性。 6. **错误处理与重试机制**:在实际...

    cmpp3.0开发接口c#

    6. **事务管理**:CMPP协议支持事务处理,即一组相关操作作为一个整体提交或回滚。C#接口需维护这些事务,确保数据的一致性。 7. **多线程与异步编程**:为了提高效率,通常会使用多线程或异步编程来处理并发请求,...

    基于C#开发的中国移动CMPP30短信网关

    在C#中开发CMPP30短信网关,可以实现快速、可靠的短信服务,为各种企业应用提供后台支持。 首先,CMPP30协议主要包括连接建立、消息发送、消息接收、心跳检测和断开连接等几个关键步骤。在C#中,这些功能通常通过...

    用C#调用的,符合CMPP协议的短信接口Demo

    与短信接口对接,可用来测试短信是否能接通,其中的地址根据实际填写。

    cmpp2.0开发接口c#

    3. 报文结构:CMPP协议的报文由消息头和消息体两部分组成。消息头包含消息ID、命令ID、序列号等信息,消息体则包含具体的业务数据。C#开发者需要理解这些字段的意义,并能够正确构造和解析报文。 4. 事务处理:CMPP...

    最新华为3.0协议 SMPP/SGIP/SMGP短信网关封装专用包,支持最新3.0协议,长短信、短短信协议。

    华为短信网关平台、中兴短信网关平台,根据两大主流平台提供的接入信息封装接口,里面包含有一下文件:SMGPLoginRespMessage.java,SMGPLoginMessage.java,SGIPConnection.java,CMPP30Connection.java,CMPP30...

    CMPP SGMP SGIP 短信平台

    1. CMPP(China Mobile Short Message Peer-to-Peer)是中国移动制定的一种高效、可靠的短信传输协议,用于短信中心(SMSC)与短信网关之间或者短信网关之间的数据交换。CMPP2.0是其常用版本,提供了连接管理、消息...

    CMPP3.0 C# SP端实现代码

    2. **TCP连接与心跳维持**:CMPP协议基于TCP/IP进行通信,因此你需要使用C#的System.Net.Sockets命名空间中的TcpClient类建立到中国移动CMPP服务器的连接,并通过定时发送心跳包来保持连接状态。 3. **数据编码与...

    短信协议(包括CMPP,SGIP,SMGP,SMPP)

    以下是对四种主要短信协议——CMPP、SGIP、SMGP和SMPP的详细说明: 1. CMPP (China Mobile Short Message Peer-to-Peer):由中国移动设计并推广,是一种基于TCP/IP的点对点短消息传输协议。CMPP支持多种业务模式,...

    CMPP3.0短信网关.netcore(c#)源代码(亲测可用)

    1.遵照CMPP3.0协议实现,模拟了短信网关,支持CONNECT,SUBMIT,DELIVER,QUERY,CANCEL,TERMINATE消息; 2.net5.0开发支持windows/liunx系统; 3.支持长短信; 4.支持心跳协议; 5.支持多线程; 6.支持收/发短信; 7....

Global site tag (gtag.js) - Google Analytics