⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sms.cs

📁 这是2005年6月云南移动短信网关升级到3.0时写的
💻 CS
📖 第 1 页 / 共 5 页
字号:
            }
        }
        public string LinkId
        {
            get
            {
                return _LinkID;
            }
        }
        private ulong _Msg_Id;        // 8 Unsigned Integer 信息标识。
        //   生成算法如下:
        //   采用64位(8字节)的整数:
        //   (1)????????? 时间(格式为MMDDHHMMSS,即月日时分秒):bit64~bit39,其中
        //   bit64~bit61:月份的二进制表示;
        //   bit60~bit56:日的二进制表示;
        //   bit55~bit51:小时的二进制表示;
        //   bit50~bit45:分的二进制表示;
        //   bit44~bit39:秒的二进制表示;
        //   (2)????????? 短信网关代码:bit38~bit17,把短信网关的代码转换为整数填写到该字段中;
        //   (3)????????? 序列号:bit16~bit1,顺序增加,步长为1,循环使用。
        //   各部分如不能填满,左补零,右对齐。
        private string _Dest_Id;       // 21 Octet String 目的号码。
        //   SP的服务代码,一般4--6位,或者是前缀为服务代码的长号码;该号码是手机用户短消息的被叫号码。
        private string _Service_Id;       // 10 Octet String 业务标识,是数字、字母和符号的组合。
        private uint _TP_pid;        // 1 Unsigned Integer GSM协议类型。详细解释请参考GSM03.40中的9.2.3.9。
        private uint _TP_udhi;        // 1 Unsigned Integer GSM协议类型。详细解释请参考GSM03.40中的9.2.3.23,仅使用1位,右对齐。
        private uint _Msg_Fmt;        // 1 Unsigned Integer 信息格式:
        //   0:ASCII串;
        //   3:短信写卡操作;
        //   4:二进制信息;
        //   8:UCS2编码;
        //   15:含GB汉字。
        private string _Src_terminal_Id;     // 32 Octet String 源终端MSISDN号码(状态报告时填为CMPP_SUBMIT消息的目的终端号码)。
        private uint _Src_terminal_type;     // 1 Unsigned Integer 源终端号码类型,0:真实号码;1:伪码。
        private uint _Registered_Delivery;     // 1 Unsigned Integer 是否为状态报告:
        //   0:非状态报告;
        //   1:状态报告。
        private uint _Msg_Length;       // 1 Unsigned Integer 消息长度,取值大于或等于0。
        private string _Msg_Content;      // Msg_length Octet String 消息内容。
        private string _LinkID;        // 20 Octet String 点播业务使用的LinkID,非点播类业务的MT流程不使用该字段。
        private MessageHeader _Header;
        public MessageHeader Header
        {
            get
            {
                return _Header;
            }
        }
        public const int FixedBodyLength = 8    // Msg_Id Unsigned Integer 信息标识。
            //   生成算法如下:
            //   采用64位(8字节)的整数:
            //   (1)????????? 时间(格式为MMDDHHMMSS,即月日时分秒):bit64~bit39,其中
            //   bit64~bit61:月份的二进制表示;
            //   bit60~bit56:日的二进制表示;
            //   bit55~bit51:小时的二进制表示;
            //   bit50~bit45:分的二进制表示;
            //   bit44~bit39:秒的二进制表示;
            //   (2)????????? 短信网关代码:bit38~bit17,把短信网关的代码转换为整数填写到该字段中;
            //   (3)????????? 序列号:bit16~bit1,顺序增加,步长为1,循环使用。
            //   各部分如不能填满,左补零,右对齐。
                 + 21   // Dest_Id Octet String 目的号码。
            //   SP的服务代码,一般4--6位,或者是前缀为服务代码的长号码;该号码是手机用户短消息的被叫号码。
                 + 10   // Service_Id Octet String 业务标识,是数字、字母和符号的组合。
                 + 1    // TP_pid Unsigned Integer GSM协议类型。详细解释请参考GSM03.40中的9.2.3.9。
                 + 1    // TP_udhi Unsigned Integer GSM协议类型。详细解释请参考GSM03.40中的9.2.3.23,仅使用1位,右对齐。
                 + 1    // Msg_Fmt Unsigned Integer 信息格式:
            //   0:ASCII串;
            //   3:短信写卡操作;
            //   4:二进制信息;
            //   8:UCS2编码;
            //   15:含GB汉字。
                 + 32   // Src_terminal_Id Octet String 源终端MSISDN号码(状态报告时填为CMPP_SUBMIT消息的目的终端号码)。
                 + 1    // Src_terminal_type Unsigned Integer 源终端号码类型,0:真实号码;1:伪码。
                 + 1    // Registered_Delivery Unsigned Integer 是否为状态报告:
            //   0:非状态报告;
            //   1:状态报告。
                 + 1    // Msg_Length Unsigned Integer 消息长度,取值大于或等于0。
            //Msg_length // Msg_Content Octet String 消息内容。
                 + 20;   // LinkID Octet String 点播业务使用的LinkID,非点播类业务的MT流程不使用该字段。
        private int _BodyLength;
        public int BodyLength
        {
            get
            {
                return _BodyLength;
            }
        }
        public CMPP_DELIVER(byte[] bytes)
        {
            int i = 0;
            byte[] buffer = new byte[MessageHeader.Length];
            Buffer.BlockCopy(bytes, 0, buffer, 0, MessageHeader.Length);
            _Header = new MessageHeader(buffer);
            //Msg_Id 8
            i += MessageHeader.Length;
            buffer = new byte[8];
            Buffer.BlockCopy(bytes, i, buffer, 0, buffer.Length);
            Array.Reverse(buffer);
            _Msg_Id = BitConverter.ToUInt64(buffer, 0);
            string s = null;
            //Dest_Id 21
            i += 8;
            buffer = new byte[21];
            Buffer.BlockCopy(bytes, i, buffer, 0, buffer.Length);
            s = Encoding.ASCII.GetString(buffer).Trim();
            s = s.Substring(0, s.IndexOf('\0'));
            _Dest_Id = s;
            //Service_Id 20
            i += 21;
            buffer = new byte[10];
            Buffer.BlockCopy(bytes, i, buffer, 0, buffer.Length);
            s = Encoding.ASCII.GetString(buffer).Trim();
            s = s.Substring(0, s.IndexOf('\0'));
            _Service_Id = s;
            //TP_pid 1
            i += 10;
            _TP_pid = (uint)bytes[i++];
            _TP_udhi = (uint)bytes[i++];
            _Msg_Fmt = (uint)bytes[i++];
            //Src_terminal_Id 32
            buffer = new byte[32];
            Buffer.BlockCopy(bytes, i, buffer, 0, buffer.Length);
            s = Encoding.ASCII.GetString(buffer).Trim();
            s = s.Substring(0, s.IndexOf('\0'));
            _Src_terminal_Id = s;
            //Src_terminal_type 1
            i += 32;
            _Src_terminal_type = (uint)bytes[i++];
            _Registered_Delivery = (uint)bytes[i++];
            _Msg_Length = (uint)bytes[i++];
            //Msg_Content
            buffer = new byte[_Msg_Length];
            Buffer.BlockCopy(bytes, i, buffer, 0, buffer.Length);
            switch (_Msg_Fmt)
            {
                case 8:
                    _Msg_Content = Encoding.BigEndianUnicode.GetString(buffer).Trim();
                    break;
                case 15: //gb2312
                    _Msg_Content = Encoding.GetEncoding("gb2312").GetString(buffer).Trim();
                    break;
                case 0: //ascii
                case 3: //短信写卡操作
                case 4: //二进制信息
                default:
                    _Msg_Content = Encoding.ASCII.GetString(buffer).ToString();
                    break;
            }
            //Linkid 20
            i += (int)_Msg_Length;
            buffer = new byte[20];
            Buffer.BlockCopy(bytes, i, buffer, 0, buffer.Length);
            s = Encoding.ASCII.GetString(buffer).Trim();
            s = s.Substring(0, s.IndexOf('\0'));
            _LinkID = s;
        }
        public byte[] ToBytes()
        {
            //Msg_Length Msg_Content
            byte[] buf;
            switch (_Msg_Fmt)
            {
                case 8:
                    buf = Encoding.BigEndianUnicode.GetBytes(_Msg_Content);
                    break;
                case 15: //gb2312
                    buf = Encoding.GetEncoding("gb2312").GetBytes(_Msg_Content);
                    break;
                case 0: //ascii
                case 3: //短信写卡操作
                case 4: //二进制信息
                default:
                    buf = Encoding.ASCII.GetBytes(_Msg_Content);
                    break;
            }
            _Msg_Length = (uint)buf.Length;
            _BodyLength = FixedBodyLength + (int)_Msg_Length;
            byte[] bytes = new byte[MessageHeader.Length + _BodyLength];
            int i = 0;
            byte[] buffer = null;
            //header 12
            _Header = new MessageHeader
                 (
                  (uint)(MessageHeader.Length + _BodyLength)
                  , CMPP_Command_Id.CMPP_DELIVER
                  , 0
                 );
            //Msg_Id 8
            i += MessageHeader.Length;
            buffer = new Byte[8];
            buffer = BitConverter.GetBytes(_Msg_Id);
            Array.Reverse(buffer);
            Buffer.BlockCopy(buffer, 0, bytes, i, buffer.Length);
            //Dest_Id 21
            i += 8;
            buffer = new byte[21];
            buffer = Encoding.ASCII.GetBytes(_Dest_Id);
            Buffer.BlockCopy(buffer, 0, bytes, i, buffer.Length);
            //Service_Id 10
            i += 21;
            buffer = new byte[10];
            buffer = Encoding.ASCII.GetBytes(_Service_Id);
            Buffer.BlockCopy(buffer, 0, bytes, i, buffer.Length);
            //TP_pid 1
            i += 10;
            bytes[i++] = (byte)_TP_pid;
            bytes[i++] = (byte)_TP_udhi;
            bytes[i++] = (byte)_Msg_Fmt;
            //Src_terminal_Id 32
            buffer = new byte[32];
            buffer = Encoding.ASCII.GetBytes(_Src_terminal_Id);
            Buffer.BlockCopy(buffer, 0, bytes, i, buffer.Length);
            //Src_terminal_type 1
            i += 32;
            bytes[i++] = (byte)_Src_terminal_type;
            bytes[i++] = (byte)_Registered_Delivery;
            bytes[i++] = (byte)_Msg_Length;
            //Msg_Content
            Buffer.BlockCopy(buf, 0, bytes, i, buf.Length);
            //LinkID
            i += (int)_Msg_Length;
            return bytes;
        }
        public override string ToString()
        {
            return "[\r\n"
              + _Header.ToString() + "\r\n"
              + "\t"
              + string.Format
                 (
                  "MessageBody:"
                  + "{0}BodyLength: {1}"
                  + "{0}Dest_Id: {2}"
                  + "{0}LinkID: {3}"
                  + "{0}Msg_Content: {4}"
                  + "{0}Msg_Fmt: {5}"
                  + "{0}Msg_Id: {6}"
                  + "{0}Msg_Length: {7}"
                  + "{0}Registered_Delivery: {8}"
                  + "{0}Service_Id: {9}"
                  + "{0}Src_terminal_Id: {10}"
                  + "{0}Src_terminal_type: {11}"
                  + "{0}TP_pid: {12}"
                  + "{0}TP_udhi: {13}"
                  , "\r\n\t\t"
                  , _BodyLength
                  , _Dest_Id
                  , _LinkID
                  , _Msg_Content
                  , _Msg_Fmt
                  , _Msg_Id
                  , _Msg_Length
                  , _Registered_Delivery
                  , _Service_Id
                  , _Src_terminal_Id
                  , _Src_terminal_type
                  , _TP_pid
                  , _TP_udhi
                 )
              + "\r\n]";
        }
    }
    public class CMPP_DELIVER_RESP //: CMPP_Response
    {
        private MessageHeader _Header;
        private ulong _Msg_Id;
        private uint _Result;
        public const int Bodylength = 8 + 4;
        public CMPP_DELIVER_RESP(ulong Msg_Id, uint Result)
        {
            _Msg_Id = Msg_Id;
            _Result = Result;
        }
        public byte[] ToBytes()
        {
            int i = 0;
            byte[] bytes = new byte[MessageHeader.Length + Bodylength];
            byte[] buffer = new byte[MessageHeader.Length];
            //header
            _Header = new MessageHeader
                 (
                  MessageHeader.Length + Bodylength
                  , CMPP_Command_Id.CMPP_DELIVER_RESP
                  , 0
                 );
            buffer = _Header.ToBytes();
            Buffer.BlockCopy(buffer, 0, bytes, 0, buffer.Length);
            i += MessageHeader.Length;
            //msg_id 8
            buffer = BitConverter.GetBytes(_Msg_Id);
            Array.Reverse(buffer);
            buffer.CopyTo(bytes, i);
            //result 4
            i += 8;
            buffer = BitConverter.GetBytes(_Result);
            Array.Reverse(buffer);
            buffer.CopyTo(bytes, i);
            return bytes;
        }
        public override string ToString()
        {
            return _Header.ToString() + "\r\n"
              + string.Format
                 (
                  "[\r\nMessageBody:"
                  + "\r\n\tMsg_Id: {0}"
                  + "\r\n\tResult: {1}"
                  + "\r\n]"
                  , _Msg_Id
                  , _Result
                 );
        }
    }
    public class CMPP_Msg_Content        //状态报告
    {
        public const int BodyLength = 8
                + 7
                + 10
                + 10
                + 32
                + 4;
        private uint _Msg_Id;         // 8 Unsigned Integer 信息标识。SP提交短信(CMPP_SUBMIT)操作时,与SP相连的ISMG产生的Msg_Id。
        private string _Stat;         // 7 Octet String 发送短信的应答结果,含义详见表一。SP根据该字段确定CMPP_SUBMIT消息的处理状态。
        private string _Submit_time;       // 10 Octet String YYMMDDHHMM(YY为年的后两位00-99,MM:01-12,DD:01-31,HH:00-23,MM:00-59)。
        private string _Done_time;        // 10 Octet String YYMMDDHHMM。
        public CMPP_Msg_Content(byte[] bytes)
        {
            if (bytes.Length == BodyLength)
            {
                int i = 0;
                //_Msg_Id 8
                byte[] buffer = new byte[8];
                Buffer.BlockCopy(bytes, i, buffer, 0, buffer.Length);
                Array.Reverse(buffer);
                _Msg_Id = BitConverter.ToUInt32(buffer, 0);
                //_Stat 7
                i += 8;
                buffer = new byte[7];
                Buffer.BlockCopy(bytes, i, buffer, 0, buffer.Length);
                _Stat = Encoding.ASCII.GetString(buffer);
                //_Submit_time 10
                i += 7;
                buffer = new byte[10];
                Buffer.BlockCopy(bytes, i, buffer, 0, buffer.Length);
                _Submit_time = Encoding.ASCII.GetString(buffer);
                //_Done_time 10
                i += 10;
                buffer = new byte[10];
                Buffer.BlockCopy(bytes, i, buffer, 0, buffer.Length);
                _Submit_time = Encoding.ASCII.GetString(buffer);
                //Dest_terminal_Id 32
                i += 10;
                buffer = new byte[32];
                Buffer.BlockCopy(bytes, i, buffer, 0, buffer.Length);
                _Dest_terminal_Id = Encoding.ASCII.GetString(buffer);
                //SMSC_sequence 4
                i += 32;
                buffer = new byte[4];
                Buffer.BlockCopy(bytes, i, buffer, 0, buffer.Length);
                Array.Reverse(buffer);
                _SMSC_sequence = BitConverter.ToUInt32(buffer, 0);
            }
        }
        public uint Msg_Id
        {
            get
            {
                return _Msg_Id;
            }
            set
            {
                _Msg_Id = value;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -