CMPP协议之CMPP_DELIVER

    public class CMPP_DELIVER
    {

        /// <summary>
        /// 消息头
        /// </summary>
        private MessageHeader msgHeader;

        /// <summary>
        /// 消息头
        /// </summary>
        public MessageHeader MsgHeader
        {
            get { return msgHeader; }
            set { msgHeader = value; }
        }


        /// <summary>
        /// 消息标识
        /// </summary>
        private byte[] msg_Id;

        /// <summary>
        /// 消息标识
        /// </summary>
        public byte[] Msg_Id
        {
            get { return msg_Id; }
            set { msg_Id = value; }
        }

        /// <summary>
        /// 目的号码
        /// </summary>
        private string dest_Id;

        /// <summary>
        /// 目的号码属性
        /// </summary>
        public string Dest_Id
        {
            get { return dest_Id; }
            set { dest_Id = value; }
        }

        /// <summary>
        /// 业务标识
        /// </summary>
        private string service_Id;

        /// <summary>
        /// 业务标识属性
        /// </summary>
        public string Service_Id
        {
            get { return service_Id; }
            set { service_Id = value; }
        }

        /// <summary>
        /// GSM协议类型
        /// </summary>
        private uint tP_pid;

        /// <summary>
        /// GSM协议类型属性
        /// </summary>
        public uint TP_pid
        {
            get { return tP_pid; }
            set { tP_pid = value; }
        }

        /// <summary>
        /// GSM协议类型
        /// </summary>
        private uint tP_udhi;

        /// <summary>
        /// GSM协议类型属性
        /// </summary>
        public uint TP_udhi
        {
            get { return tP_udhi; }
            set { tP_udhi = value; }
        }

        /// <summary>
        /// 信息格式:
        /// 0:ASCII串;
        ///3:短信写卡操作;
        ///4:二进制信息;
        ///8:UCS2编码;
        ///15:含GB汉字。
        /// </summary>
        private uint msg_Fmt;

        /// <summary>
        /// 消息格式属性
        /// </summary>
        public uint Msg_Fmt
        {
            get { return msg_Fmt; }
            set { msg_Fmt = value; }
        }

        /// <summary>
        /// 源终端MSISDN号码(状态报告时填为CMPP_SUBMIT消息的目的终端号码)
        /// </summary>
        private string src_terminal_Id;


        /// <summary>
        /// 源终端MSISDN号码 属性
        /// </summary>
        public string Src_terminal_Id
        {
            get { return src_terminal_Id; }
            set { src_terminal_Id = value; }
        }

        /// <summary>
        /// 源终端号码类型,0:真实号码;1:伪码。
        /// </summary>
        private uint src_terminal_type;

        /// <summary>
        /// 源终端号码类型属性
        /// </summary>
        public uint Src_terminal_type
        {
            get { return src_terminal_type; }
            set { src_terminal_type = value; }
        }

        /// <summary>
        /// 是否为状态报告:0:非状态报告;1:状态报告。
        /// </summary>
        private uint registered_Delivery;

        /// <summary>
        /// 是否为状态报告:0:非状态报告;1:状态报告。
        /// </summary>
        public uint Registered_Delivery
        {
            get { return registered_Delivery; }
            set { registered_Delivery = value; }
        }

        /// <summary>
        /// 消息长度,取值大于或等于0。
        /// </summary>
        private uint msg_Length;

        /// <summary>
        /// 消息长度,取值大于或等于0。
        /// </summary>
        public uint Msg_Length
        {
            get { return msg_Length; }
            set { msg_Length = value; }
        }

        /// <summary>
        /// 消息内容
        /// </summary>
        private string msg_Content;

        /// <summary>
        /// 消息内容
        /// </summary>
        public string Msg_Content
        {
            get { return msg_Content; }
            set { msg_Content = value; }
        }

        /// <summary>
        /// 点播业务使用的LinkID
        /// </summary>
        private string linkID;

        /// <summary>
        /// 点播业务使用的LinkID
        /// </summary>
        public string LinkID
        {
            get { return linkID; }
            set { linkID = value; }
        }

        /// <summary>
        /// 状态报告
        /// </summary>
        private CMPP_REPORT cMPP_REPORT;

        /// <summary>
        /// 状态报告
        /// </summary>
        public CMPP_REPORT CMPP_REPORT
        {
            get { return cMPP_REPORT; }
            set { cMPP_REPORT = value; }
        }

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="bytes"></param>
        public CMPP_DELIVER(byte[] bytes)
        {
            int i = 0;

            byte[] buffer = new byte[MessageHeader.HeaderLength];
            Util.ByteCopyToByte(bytes, i, buffer, 0, buffer.Length);
            this.msgHeader = new MessageHeader(buffer);

            i += 12;

            buffer = new byte[8];
            Util.ByteCopyToByte(bytes, i, buffer, 0, buffer.Length);
            this.msg_Id = buffer;
            i = i + 8;

            buffer = new byte[21];
            Util.ByteCopyToByte(bytes, i, buffer, 0, buffer.Length);
            this.dest_Id = BIConvert.Byte2String(buffer);
            i = i + 21;

            buffer = new byte[10];
            Util.ByteCopyToByte(bytes, i, buffer, 0, buffer.Length);
            this.service_Id = BIConvert.Byte2String(buffer);
            i += 10;

            this.tP_pid = (uint)bytes[i++];
            this.tP_udhi = (uint)bytes[i++];
            this.msg_Fmt = (uint)bytes[i++];

            buffer = new byte[32];

            Util.ByteCopyToByte(bytes, i, buffer, 0, buffer.Length);
            this.src_terminal_Id = BIConvert.Byte2String(buffer);
            i = i + 32;

            this.src_terminal_type = (uint)bytes[i++];
            this.registered_Delivery = (uint)bytes[i++];
            this.msg_Length = (uint)bytes[i++];

            if (this.registered_Delivery.Equals(0))
            {
                //非状态报告
                buffer = new byte[this.msg_Length];
                Util.ByteCopyToByte(bytes, i, buffer, 0, buffer.Length);

                switch (this.msg_Fmt)
                {
                    case 8:
                        this.msg_Content = Encoding.BigEndianUnicode.GetString(buffer).Trim();
                        break;
                    case 15:
                        this.msg_Content = Encoding.GetEncoding("gb2312").GetString(buffer).Trim();
                        break;
                    case 0: //ascii
                    case 3://短信写卡操作
                    case 4://二进制信息
                    default:
                        this.msg_Content = Encoding.ASCII.GetString(buffer).ToString();
                        break;

                }
                i += (int)this.msg_Length;
            }
            else
            {
                if (this.registered_Delivery.Equals(1))
                {
                    //状态报告

                    this.cMPP_REPORT = new CMPP_REPORT();

                    buffer = new byte[8];
                    Util.ByteCopyToByte(bytes, i, buffer, 0, buffer.Length);
                    this.cMPP_REPORT.Msg_Id = buffer;
                    i = i + 8;

                    buffer = new byte[7];
                    Util.ByteCopyToByte(bytes, i, buffer, 0, buffer.Length);
                    this.cMPP_REPORT.Stat = BIConvert.Byte2String(buffer);

                    i = i + 7;

                    buffer = new byte[10];
                    Util.ByteCopyToByte(bytes, i, buffer, 0, buffer.Length);
                    this.cMPP_REPORT.Submit_time = BIConvert.Byte2String(buffer);
                    i = i + 10;

                    buffer = new byte[10];
                    Util.ByteCopyToByte(bytes, i, buffer, 0, buffer.Length);
                    this.cMPP_REPORT.Done_time = BIConvert.Byte2String(buffer);
                    i = i + 10;

                    buffer = new byte[21];

                    Util.ByteCopyToByte(bytes, i, buffer, 0, buffer.Length);
                    this.cMPP_REPORT.Dest_terminal_Id = BIConvert.Byte2String(buffer);
                    i = i + 21;

                    buffer = new byte[4];

                    Util.ByteCopyToByte(bytes, i, buffer, 0, buffer.Length);

                    this.cMPP_REPORT.SMSC_sequence = BIConvert.Bytes2UInt(buffer);

                    i = i + 4;

                }
            }
            buffer = new byte[20];
            Util.ByteCopyToByte(bytes, i, buffer, 0, buffer.Length);
            this.linkID = BIConvert.Byte2String(buffer);
            i = i + 20;

           


        }

 

  

    }

CMPP模拟器主要是模拟使用中国移动CMPP协议(版本1.x~3.x)的各种网关。此类型网关只使用一个收发连接(短信接收和发送在一个链接上进行)。 模拟器要求使用JDK1.4以上的Java运行环境,请确认相关环境已经安装妥当。如果还没有安装Java环境,请访问java.sun.com下载最新J2SE的SDK。 此模拟器已经使用了全新的核心设计,主要针对应用程序的稳定性、可靠性、效率以及配置、管理和监控方面做了很大的调整。基本界面风格和应用功能上没什么变化。 1.建立Socket连接与登陆 使用自己的CMPP客户端程序,与7890端口建立Socket连接。然后按照CMPP协议发送登陆数据包。模拟器会按照协议处理相关连接和登陆过程。 2.发送短信息 正确建立连接和登陆以后,可以按照CMPP协议的Submit过程提交相关数据并得到应答。模拟器在接收到数据以后,会进行解析并按照协议要求进行应答和回复。相关的处理信息会记录在日志文件中。 3.接收短信息 正确建立连接和登陆以后,在同一连接上等待模拟器的Deliver数据包即可,并且要求客户端按照协议给予应答。模拟器会对相关过程记录在日志信息当中。 4.模拟MT以及状态报告过程 发送submit时,请将registered_delivery设置为1即可。 模拟器收到相关数据包以后,会通过submit_response应答给出message_id;随后模拟出deliver数据包给出状态报告,其中registered_delivery为1。 5.模拟MO过程 发送submit时,请将registered_delivery设置为0即可。 模拟器收到相关数据包以后,会通过deliver请求发送模拟的MO。其中deliver的相关数据全部来自接收到的submit数据。包括来源号码、目标号码、业务代码以及信息内容。 6.模拟压力测试 如果需要进行模拟的完整压力测试过程,只需要以最大速度重复步骤5即可。 模拟器的监控 模拟器有一个基于Web监控后台,系统启动的时候同时启动。缺省端口建立在8081上。监控的URL地址、用户名和密码可以在配置文件中找到。 http://localhost:8081 forest_luo root
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值