• CMPP3.0 长短信实现方案


    长短信息:是指超过70个汉字,140个字节的信息内容

    一、CMPP协议相关字段分析

    CMPP协议具体部分请参考《中国移动互联网短信网关接口协议(V3.0.0.doc

    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_UserType3时该值有效,当Fee_UserType012时该值无意义。

    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

    信息格式:

    0ASCII串;

    3:短信写卡操作;

    4:二进制信息;

    8UCS2编码;

    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流程不使用该字段。

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

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

    cmpp协议里,CMPP­_SUBMIT消息定义中有相应的参数配置:   

    1. TP_udhi 0代表内容体里不含有协议头信息 1代表内容含有协议头信息(长短信,push短信等都是在内容体上含有头内容的)当设置内容体包含协议头,需要根据协议写入相应的信息,长短信协议头有两种:

     

    • 6位协议头格式:05 00 03 XX MM NN

    a) byte 1 : 05, 表示剩余协议头的长度

    b) byte 2 : 00, 这个值在GSM 03.40规范9.2.3.24.1中规定,表示随后的这批超长短信的标识位长度为1(格式中的XX值)。

    c) byte 3 : 03, 这个值表示剩下短信标识的长度

    d) byte 4 : XX,这批短信的唯一标志,事实上,SME(手机或者SP)把消息合并完之后,就重新记录,所以这个标志是否唯一并不是很 重要。

    e) byte 5 : MM, 这批短信的数量。如果一个超长短信总共5条,这里的值就是5

    f) byte 6 : NN, 这批短信的数量。如果当前短信是这批短信中的第一条的值是1,第二条的值是2

    例如:05 00 03 39 02 01

    • 7 位的协议头格式:06 08 04 XX XX MM NN

    a) byte 1 : 06, 表示剩余协议头的长度

    b) byte 2 : 08, 这个值在GSM 03.40规范9.2.3.24.1中规定,表示随后的这批超长短信的标识位长度为2(格式中的XX值)。

    c) byte 3 : 04, 这个值表示剩下短信标识的长度

    d) byte 4-5 : XX XX,这批短信的唯一标志,事实上,SME(手机或者SP)把消息合并完之后,就重新记录,所以这个标志是否唯一并不是很重要。

    e) byte 6 : MM, 这批短信的数量。如果一个超长短信总共5条,这里的值就是5

    f) 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中长短信的实现方法,在联通、电信短信协议中,实现方法一样。

    移动CMPP协议长短信方案:

    1. Msg_Fmt = 8 ; 
      Tp_Udhi = 1;
    2. 可采用6字节协议头,也可采用7字节协议头,实测都通过。 
      • 6字节协议头: 
        • MsgContent的前三个字节为:0x05, 0x00, 0x03(0x05表示后面还有5字节,0x03表示后面还有3字节)
        • 第四个字节为批号,合成同条长短信的小短信填一样的值即可。(同时给同个号码发多条长短信的要分不同长短信填写);
        • 第五个字节为Pk_total的值,即这批短信的总条数。
        • 第六个字节为Pk_number的值,即这条短信在长短信中的序号,从1开始。。
      • 7字节协议头: 
        • MsgContent的前三个字节为:0x06, 0x08, 0x04(0x06表示后面还有6字节,0x04表示后面还有4字节)
        • 第四、五个字节为批号,合成同条长短信的小短信填一样的值即可。(同时给同个号码发多条长短信的要分不同长短信填写);
        • 第六个字节为Pk_total的值
        • 第七个字节为Pk_number的值
    3. MsgContent 在第6或7字节后加上要发送的短信内容,记得要UCS2编码的哦。
    4. Pk_total和Pk_number 可以不设置,如果要设置,就要分别跟TP_udhi的MM和NN字段一致

    联通SGIP1.2协议长短信方案

    只测试了6字节协议头的,方法与以上移动使用的6字节协议头一样。 
    MessageCoding= 8 ; 
    Tp_Udhi = 1; 
    MessageContent前三个字节为:0x05, 0x00, 0x03 
    第四个字节为批号; 
    第五个字节为这批短信的总条数; 
    第六个字节这条短信在长短信中的序号,从1开始。 
    3、MessageContent在第6字节后加上要发送的短信内容的UCS2编码

    电信SMGP3协议长短信方案:

      1. 设置tlv字段TP_udhi为0x01,表示消息内容里面包含消息头(也就是说含长短信头)
      2. 内容前面需要增加6个字段

        • 字节一:包头长度,固定填写0x05;
        • 字节二:包头类型标识,固定填写0x00,表示长短信;
        • 字节三:子包长度,固定填写0x03,表示后面三个字节的长度;
        • 字节四到字节六:包内容:
        • 字节四:长消息参考号,每个SP给每个用户发送的每条参考号都应该不同,可以从0开始,每次加1,最大255,便于同一个终端对同一个SP的消息的不同的长短信进行识别;
        • 字节五:本条长消息的的总消息数,从1到255,一般取值应该大于2;
        • 字节六:本条消息在长消息中的位置或序号,从1到255,第一条为1,第二条为2,最后一条等于第四字节的值。
      3. 例子: 
        05 00 03 00 02 01 
        05 00 03 00 02 02

      4. 你还需要设置PkTotal和PkNumber 
        这个字段如果不设置并不影响用户手机对短信的拼装,但是会影响ismp的健权和计费,一组pktotal pknumber里面的数据ismp是当一条短信健权和计费。

    提纲

    1 物联网数据卡系统源码——前篇

    1.1 物联网技术架构图

    1.2 物联网的主要应用领域

    1.3 物联网传感器61个应用领域

    1.4 物联网常见通信协议梳理

    2 物联网数据卡系统源码——通信模块

    2.1 通信模块整体概述

    2.2 协议封装和实现

    2.3 长短信

    2.4 粘包的处理

    2.5 物联网通讯与普通短信通讯的区别和要注意的地方

    3 物联网数据卡系统源码——Windows服务模块

    3.1 Windows服务模块概述

    3.2 Windows服务模块实现

    3.3 高并发回调处理

    3.4 部署安装

  • 相关阅读:
    【洛谷P2860】冗余路径
    【CF1042D】Petya and Array 离散化+树状数组
    【洛谷P2127】序列排序
    【洛谷P4462】异或序列
    【SPOJ10707】COT2
    【CF1119D】Frets On Fire
    【CF1119E】Pavel and Triangles
    【洛谷P1903】数颜色
    hdu 3488(KM算法||最小费用最大流)
    hdu 1853(拆点判环+费用流)
  • 原文地址:https://www.cnblogs.com/tuyile006/p/5707271.html
Copyright © 2020-2023  润新知