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

📄 sgip.cs

📁 用C#编写的的中国联通Sgip协议
💻 CS
📖 第 1 页 / 共 3 页
字号:
			AgentFlag agentFlag,
			MorelatetoMTFlag morelatetoMTFlag,

			byte tp_pid,
			byte tp_udhi
			)
		{
			_commandID = CommandID.SGIP_SUBMIT;

			_spNumber = new byte[21] {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
			_chargeNumber = new byte[21]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

			_corpId = new byte[5] {0,0,0,0,0};
			Encoding.ASCII.GetBytes( corpId, 0, corpId.Length, _corpId, 0 );
			_serviceType = new byte[10] {0,0,0,0,0,0,0,0,0,0};
			Encoding.ASCII.GetBytes( serviceType, 0, serviceType.Length, _serviceType, 0 );

			_feeType = feeType;
			
			_feeValue = new byte[6] { 0,0,0,0,0,0 };
			Encoding.ASCII.GetBytes( feeValue, 0, feeValue.Length, _feeValue, 0 );
			_givenValue = new byte[6] { 0,0,0,0,0,0 };
			Encoding.ASCII.GetBytes( givenValue, 0, givenValue.Length, _givenValue, 0 );

			_agentFlag = agentFlag;
			_morelatetoMTFlag = morelatetoMTFlag;

			_expireTime = new byte[16];
			_scheduleTime = new byte[16];

			_tp_pid = tp_pid;
			_tp_udhi = tp_udhi;

			_reserve = new byte[8] { 0,0,0,0,0,0,0,0 };
		}

		public override void Get
			(
			BinaryReader br
			)
		{
			GetHead( br );

			br.Read( _spNumber, 0, 21 );
			br.Read( _chargeNumber, 0, 21 );
			_userCount = br.ReadByte();
			_userNumber = new byte[ _userCount ][];

			for( int i = 0; i < _userCount; i ++ )
			{
				_userNumber[i] = new byte[21];
				br.Read( _userNumber[i], 0, 21 );
			}

			br.Read( _corpId, 0, 5 );
			br.Read( _serviceType, 0, 10 );

			_feeType = ( FeeType )br.ReadByte();
			br.Read( _feeValue, 0, 6 );
			br.Read( _givenValue, 0, 6 );

			_agentFlag = ( AgentFlag )br.ReadByte();
			_morelatetoMTFlag = (MorelatetoMTFlag) br.ReadByte();
			_priority = br.ReadByte();

			br.Read( _expireTime, 0, 16 );
			br.Read( _scheduleTime, 0, 16 );

			_reportFlag = ( ReportFlag )br.ReadByte();
			_tp_pid = br.ReadByte();
			_tp_udhi = br.ReadByte();
			_messageCoding = ( MessageCoding )br.ReadByte();
			_messageType = ( MessageType )br.ReadByte();

			int netValue;
			netValue = br.ReadInt32();
			_messageLength = IPAddress.NetworkToHostOrder( netValue );

			br.Read( _messageContent, 0, _messageLength );
			br.Read( _reserve, 0, 8 );
		}

		public void UpdateSms
			(
			string spNumber,
			string chargeNumber,
			string userNumbers,
			string messageContent,
			byte priority,
			DateTime expireTime,
			DateTime scheduleTime,
			ReportFlag reportFlag,
			MessageCoding messageCoding,
			MessageType messageType
			)
		{
			_priority = priority;
			_reportFlag = reportFlag;

			string[] numbers = userNumbers.Split( new char[] { ':',',',';','、',':',',',';',' ' } );

			for( int i =0; i < 21; i ++ )
			{
				_spNumber[i] = 0;
				_chargeNumber[i] = 0;
			}

			Encoding.ASCII.GetBytes( spNumber, 0, spNumber.Length, _spNumber, 0 );
			Encoding.ASCII.GetBytes( chargeNumber, 0, chargeNumber.Length, _chargeNumber, 0 );

			_userCount = 0;
			_userNumber = new byte[numbers.Length][];

			foreach( string s in numbers )
			{
				if( s.Length > 6 )
				{
					string number = "86" + s;

					_userNumber[ _userCount ] = new byte[21] {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
					Encoding.ASCII.GetBytes( number, 0, number.Length, _userNumber[ _userCount ], 0 );
					_userCount ++;
				}
			}


			string dateString;
			
			if( expireTime > DateTime.MinValue )
			{
				dateString = string.Format
					(
					"{0:00}{1:00}{2:00}{3:00}{4:00}{5:00}032+",
					expireTime.Year - 2000,
					expireTime.Month,
					expireTime.Day,
					expireTime.Hour,
					expireTime.Minute,
					expireTime.Second
					);
				Encoding.ASCII.GetBytes( dateString, 0, dateString.Length, _expireTime, 0 );
			}
			else
			{
				for( int i = 0; i < 16; i ++ )
					_expireTime[i] = 0;
			}
			

			if( scheduleTime > DateTime.MinValue )
			{
				dateString = string.Format
					(
					"{0:00}{1:00}{2:00}{3:00}{4:00}{5:00}032+",
					scheduleTime.Year - 2000,
					scheduleTime.Month,
					scheduleTime.Day,
					scheduleTime.Hour,
					scheduleTime.Minute,
					scheduleTime.Second
					);
				Encoding.ASCII.GetBytes( dateString, 0, dateString.Length, _scheduleTime, 0 );
			}
			else
			{
				for( int i = 0; i < 16; i ++ )
					_scheduleTime[i] = 0;

			}

			_reportFlag = reportFlag;
			_messageCoding = messageCoding;
			_messageType = messageType;

			Encoding msgCoding = Encoding.Default;
			switch( _messageCoding )
			{
				case MessageCoding.Ascii:
					msgCoding = Encoding.ASCII;
					_messageLength = messageContent.Length;
					break;

				case MessageCoding.Bin:
				case MessageCoding.Stk:
					msgCoding = Encoding.Default;
					_messageLength = messageContent.Length;
					break;

				case MessageCoding.Ucs2:
					msgCoding = Encoding.Unicode;
					_messageLength = 2 * messageContent.Length;
					break;

				case MessageCoding.Gbk:
					msgCoding = Encoding.GetEncoding( 936 );
					_messageLength = 2 * messageContent.Length;
					break;
			}

			_messageContent = new byte[ _messageLength ];
			msgCoding.GetBytes( messageContent, 0, messageContent.Length, _messageContent, 0 );

			_totalLength = 143 + _userCount*21 + _messageLength;

		}

		public void WakeSmg
			(
			BinaryWriter bw
			)
		{
			SendSameHead( bw );

			bw.Write( _spNumber, 0, 21 );
			bw.Write( _chargeNumber, 0, 21 );
			bw.Write( _userCount );
			for( int i = 0; i < _userCount; i ++ )
				bw.Write( _userNumber[i], 0, 21 );
			bw.Write( _corpId, 0, 5 );
			bw.Write( _serviceType, 0, 10 );
			bw.Write( (byte)_feeType );
			bw.Write( _feeValue, 0, 6 );
			bw.Write( _givenValue, 0, 6 );
			bw.Write( (byte)_agentFlag );
			bw.Write( (byte)_morelatetoMTFlag );
			bw.Write( _priority );
			bw.Write( _expireTime, 0, 16 );
			bw.Write( _scheduleTime, 0, 16 );
			bw.Write( (byte)_reportFlag );
			bw.Write( _tp_pid );
			bw.Write( _tp_udhi );
			bw.Write( (byte)_messageCoding );
			bw.Write( (byte)_messageType );

			int netValue;
			netValue = IPAddress.HostToNetworkOrder( unchecked( (int)_messageLength ) );
			bw.Write( netValue );

			bw.Write( _messageContent, 0, _messageLength );
			bw.Write( _reserve, 0, 8 );
		}

		public override void Send
			(
			BinaryWriter bw
			)
		{

			SendHead( bw );

			bw.Write( _spNumber, 0, 21 );
			bw.Write( _chargeNumber, 0, 21 );
			bw.Write( _userCount );
			for( int i = 0; i < _userCount; i ++ )
				bw.Write( _userNumber[i], 0, 21 );
			bw.Write( _corpId, 0, 5 );
			bw.Write( _serviceType, 0, 10 );
			bw.Write( (byte)_feeType );
			bw.Write( _feeValue, 0, 6 );
			bw.Write( _givenValue, 0, 6 );
			bw.Write( (byte)_agentFlag );
			bw.Write( (byte)_morelatetoMTFlag );
			bw.Write( _priority );
			bw.Write( _expireTime, 0, 16 );
			bw.Write( _scheduleTime, 0, 16 );
			bw.Write( (byte)_reportFlag );
			bw.Write( _tp_pid );
			bw.Write( _tp_udhi );
			bw.Write( (byte)_messageCoding );
			bw.Write( (byte)_messageType );

			int netValue;
			netValue = IPAddress.HostToNetworkOrder( unchecked( (int)_messageLength ) );
			bw.Write( netValue );

			bw.Write( _messageContent, 0, _messageLength );
			bw.Write( _reserve, 0, 8 );
		}


		public override void SendResponse( BinaryWriter bw, ErrorCode err )
		{
			SgipSubmitResp submitResp = new SgipSubmitResp( (byte)err );
			submitResp.Send( bw );
		}
	}

	class SgipSubmitResp : SgipBlock
	{
		byte _result;
		byte[] _reserve = new byte[8];

		public SgipSubmitResp()
		{
			_totalLength = 29;
			_commandID = CommandID.SGIP_SUBMIT_RESP;
		}

		public SgipSubmitResp( byte result )
		{
			_totalLength = 29;
			_commandID = CommandID.SGIP_SUBMIT_RESP;
			_result = result;
		}

		public override void Send
			(
			BinaryWriter bw
			)
		{
			SendHead( bw );
			bw.Write( _result );
			bw.Write( _reserve, 0, 8 );
		}

		public override void Get
			(
			BinaryReader br
			)
		{
			GetHead( br );
			_result = br.ReadByte();
			br.Read( _reserve, 0, 8 );
		}

		public ErrorCode Result
		{
			get 
			{
				return (ErrorCode)_result;
			}

			set
			{
				_result = (byte)value;
			}
		}
	}

	class SgipDeliver : SgipBlock
	{
		byte[] _userNumber;
		byte[] _spNumber;

		byte _tp_pid;
		byte _tp_udhi;

		MessageCoding _messageCoding;

		int _messageLength;
		byte[] _messageContent;
		byte[] _reserve;

		public SgipDeliver()
		{
			_reserve = new byte[8] {0,0,0,0,0,0,0,0};
			_commandID = CommandID.SGIP_DELIVER;
		}

		public string UserNumber 
		{
			get
			{ 
				return gbk.GetString( _userNumber, 0, BufferLength( _userNumber ) );
			}
		}

		public string SpNumber
		{
			get
			{
				return gbk.GetString( _spNumber, 0, BufferLength( _spNumber ) );
			}
		}

		public string MessageContent
		{
			get
			{
				Encoding msgCoding = Encoding.Default;

				switch( _messageCoding )
				{
					case MessageCoding.Ascii:
						msgCoding = Encoding.ASCII;
						break;

					case MessageCoding.Bin:
					case MessageCoding.Stk:
						msgCoding = Encoding.Default;
						break;

					case MessageCoding.Ucs2:
						msgCoding = Encoding.BigEndianUnicode;
						break;

					case MessageCoding.Gbk:
						msgCoding = gbk;
						break;
				}

				return msgCoding.GetString( _messageContent, 0, _messageLength );
			}
		}

		public void UpdateSms
			(
			string userNumber,
			string spNumber,
			byte tp_pid,
			byte tp_udhi,
			MessageCoding messageCoding,
			string messageContent 
			)
		{
			_userNumber = new byte[21] {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
			Encoding.ASCII.GetBytes( userNumber, 0, userNumber.Length, _userNumber, 0 );
			_spNumber = new byte[21] {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
			Encoding.ASCII.GetBytes( spNumber, 0, userNumber.Length, _spNumber, 0 );

			_tp_pid = tp_pid;
			_tp_udhi = tp_udhi;

			_messageCoding = messageCoding;

			Encoding msgCoding = Encoding.Default;
			switch( _messageCoding )
			{
				case MessageCoding.Ascii:
					msgCoding = Encoding.ASCII;
					_messageLength = messageContent.Length;
					break;

				case MessageCoding.Bin:
				case MessageCoding.Stk:
					msgCoding = Encoding.Default;
					_messageLength = messageContent.Length;
					break;

				case MessageCoding.Ucs2:
					msgCoding = Encoding.Unicode;
					_messageLength = 2 * messageContent.Length;
					break;

				case MessageCoding.Gbk:
					msgCoding = Encoding.GetEncoding( 936 );
					_messageLength = 2 * messageContent.Length;
					break;
			}

			_messageContent = new byte[ _messageLength ];
			msgCoding.GetBytes( messageContent, 0, messageContent.Length, _messageContent, 0 );

			_totalLength = 77 + _messageLength;
		}

		public override void Send
			(
			BinaryWriter bw
			)
		{
			SendHead( bw );

			bw.Write( _userNumber, 0, 21 );
			bw.Write( _spNumber, 0, 21 );
			bw.Write( _tp_pid );
			bw.Write( _tp_udhi );
			bw.Write( (byte)_messageCoding );

			int netValue;
			netValue = IPAddress.HostToNetworkOrder( _messageLength );

			bw.Write( netValue );
			bw.Write( _messageContent, 0, _messageLength );
			bw.Write( _reserve, 0, 8 );
		}

		public override void Get
			(
			BinaryReader br
			)
		{
			GetHead( br );

			_userNumber = new byte[21] {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
			br.Read( _userNumber, 0, 21 );
			_spNumber = new byte[21] {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
			br.Read( _spNumber, 0, 21 );

			_tp_pid = br.ReadByte();
			_tp_udhi = br.ReadByte();
			_messageCoding = (MessageCoding)br.ReadByte();

			_messageLength = IPAddress.NetworkToHostOrder( br.ReadInt32() );
			_messageContent = new byte[ _messageLength ];
			br.BaseStream.Read( _messageContent, 0, _messageLength );

			br.Read( _reserve, 0, 8 );
		}


		public override void SendResponse( BinaryWriter bw, ErrorCode err )
		{
			SgipDeliverResp deliverResp = new SgipDeliverResp
				(
				_sequenceNumberGot1,
				_sequenceNumberGot2,
				_sequenceNumberGot3,
				(byte)err
				);
			deliverResp.Send( bw );
		}
	}

	class SgipDeliverResp : SgipBlock
	{
		byte _result;
		byte[] _reserve = new byte[8];

		public SgipDeliverResp()
		{
			_totalLength = 29;
			_commandID = CommandID.SGIP_DELIVER_RESP;
		}

		public SgipDeliverResp( uint s1, uint s2, uint s3, byte result )
		{
			_totalLength = 29;

			_sequenceNumberGot1 = s1;
			_sequenceNumberGot2 = s2;
			_sequenceNumberGot3 = s3;

			_commandID = CommandID.SGIP_DELIVER_RESP;
			_result = result;
		}

		public override void Send
			(
			BinaryWriter bw
			)
		{
			byte[] data = new byte[ _totalLength ];
			MemoryStream ms = new MemoryStream( data );
			BinaryWriter bbw = new BinaryWriter( ms );

			SendHeadGot( bbw );
			bbw.Write( _result );
			bbw.Write( _reserve, 0, 8 );

			bw.Write( data, 0, data.Length );
		}

		public override void Get
			(
			BinaryReader br
			)
		{
			GetHead( br );
			_result = br.ReadByte();
			br.Read( _reserve, 0, 8 );
		}
	}

⌨️ 快捷键说明

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