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

📄 sgip.cs

📁 SMGP协议对象
💻 CS
📖 第 1 页 / 共 4 页
字号:
		/// 状态报告标记 0-该条消息只有最后出错时要返回状态报告 1-该条消息无论最后是否成功都要返回状态报告 2-该条消息不需要返回状态报告 3-该条消息仅携带包月计费信息,不下发给用户,要返回状态报告其它-保留缺省设置为0
		/// </summary>
		public byte ReportFlag
		{
			get 
			{
				return _reportFlag;
			}
			set
			{
				_reportFlag = value;
			}
		}

		/// <summary>
		/// GSM协议类型。详细解释请参考GSM03.40中的9.2.3.9
		/// </summary>
		public byte TP_pid
		{
			get
			{
				return _TP_pid;
			}
			set
			{
				_TP_pid = value;
			}
		}

		/// <summary>
		/// GSM协议类型。详细解释请参考GSM03.40中的9.2.3.23,仅使用1位,右对齐
		/// </summary>
		public byte TP_udhi
		{
			get
			{
				return _TP_udhi;
			}
			set
			{
				_TP_udhi = value;
			}
		}

		/// <summary>
		/// 短消息的编码格式。0:纯ASCII字符串 3:写卡操作 4:二进制编码 8:UCS2编码 15: GBK编码 其它参见GSM3.38第4节:SMS Data Coding Scheme
		/// </summary>
		public byte MessageCoding
		{
			get
			{
				return _messageCoding;
			}
			set
			{
				_messageCoding = value;
			}
		}

		/// <summary>
		/// 信息类型:0-短消息信息,其它:待定
		/// </summary>
		public byte MessageType
		{
			get
			{
				return _messageType;
			}
			set
			{
				_messageType = value;
			}
		}

		/// <summary>
		/// 默认为140,短消息的长度
		/// </summary>
		public uint MessageLength
		{
			get
			{
				return (uint)IPAddress.NetworkToHostOrder((int)_messageLength);
			}
			set
			{
				_messageLength = (uint)IPAddress.HostToNetworkOrder((int)value);
				//_messageLength = 
			}
		}

		/// <summary>
		/// 短消息的内容
		/// </summary>
		public string MessageContent
		{
			get { return _messageContent; }
			set
			{
				_messageContent = value;
			}
		}

		/// <summary>
		/// 保留,最多8个字节
		/// </summary>
		public byte[] Reserved
		{
			get { return _reserved; }
			set
			{
				apiHelper.CheckMaxBytes(value, 8);
				_reserved = value;
			}
		}

		#endregion

		public override byte[] GetBytes()
		{
			byte[] result = new byte[this.GetLength()];
			int nIndex = 0;
			Encoding.ASCII.GetBytes(_spNumber).CopyTo(result, nIndex);
			nIndex += 21;
			Encoding.ASCII.GetBytes(_chargeNumber).CopyTo(result, nIndex);
			nIndex += 21;
			result[nIndex++] = _userCount;
			for (int i = 0; i < UserCount; i++) //注意:UserCount是主机顺序的,而_userCount是网络序列的!
			{
				Encoding.ASCII.GetBytes(_userNumber[i].ToString()).CopyTo(result, nIndex);
				nIndex += 21;
			}
			Encoding.ASCII.GetBytes(_corpID).CopyTo(result, nIndex);
			nIndex += 5;
			Encoding.ASCII.GetBytes(_serviceType).CopyTo(result, nIndex);
			nIndex += 10;
			result[nIndex++] = _feeType;
			Encoding.ASCII.GetBytes(_feeValue).CopyTo(result, nIndex);
			nIndex += 6;
			Encoding.ASCII.GetBytes(_givenValue).CopyTo(result, nIndex); //_givenValue
			nIndex += 6;
			result[nIndex++] = _agentFlag;
			result[nIndex++] = _morelatetoMTFlag;
			result[nIndex++] = _priority;
			Encoding.ASCII.GetBytes(_expireTime).CopyTo(result, nIndex); 
			nIndex += 16;
			Encoding.ASCII.GetBytes(_scheduleTime).CopyTo(result, nIndex); 
			nIndex += 16;
			result[nIndex++] = _reportFlag;
			result[nIndex++] = _TP_pid;
			result[nIndex++] = _TP_udhi;
			result[nIndex++] = _messageCoding;
			result[nIndex++] = _messageType;
			BitConverter.GetBytes(_messageLength).CopyTo(result, nIndex);
			nIndex += 4;
			Encoding.Default.GetBytes(_messageContent).CopyTo(result, nIndex); 
			byte[] xxx=apiHelper.StringToXCoding(_messageContent,_messageCoding);
			xxx.CopyTo(result, nIndex); 
			
			nIndex += (int)MessageLength; //注意, MessageLength属性才是主机顺序
			_reserved.CopyTo(result, nIndex);
			return result;
		}

		public override int GetLength()
		{
			return (int)(21 * UserCount + MessageLength + 123);
		}

		internal override void ReadFromBytes(byte[] buffer, int startIndex)
		{
			int nIndex = startIndex;
			_spNumber = apiHelper.GetASCIIString(buffer, nIndex, 21);
			nIndex += 21;
			_chargeNumber = apiHelper.GetASCIIString(buffer, nIndex, 21);
			nIndex += 21;

			_userCount = buffer[nIndex++];
			_userNumber.Clear();
			for (int i = 0; i < UserCount; i++)
			{
				_userNumber.Add(apiHelper.GetASCIIString(buffer, nIndex, 21));
				nIndex += 21;
			}

			_corpID = apiHelper.GetASCIIString(buffer, nIndex, 5);
			nIndex += 5;
			_serviceType = apiHelper.GetASCIIString(buffer, nIndex, 10);
			nIndex += 10;
			_feeType = buffer[nIndex++];
			_feeValue = apiHelper.GetASCIIString(buffer, nIndex, 6);
			nIndex += 6;
			_givenValue = apiHelper.GetASCIIString(buffer, nIndex, 6);
			nIndex += 6;
			_agentFlag = buffer[nIndex++];
			_morelatetoMTFlag = buffer[nIndex++];
			_priority = buffer[nIndex++];
			_expireTime = apiHelper.GetASCIIString(buffer, nIndex, 16);
			nIndex += 16;
			_scheduleTime = apiHelper.GetASCIIString(buffer, nIndex, 16);
			nIndex += 16;

			_reportFlag = buffer[nIndex++];    
			_TP_pid = buffer[nIndex++];
			_TP_udhi = buffer[nIndex++];
			_messageCoding = buffer[nIndex++];
			_messageType = buffer[nIndex++];
			_messageLength = BitConverter.ToUInt32(buffer, nIndex);
			nIndex += 4;
//			_messageContent = apiHelper.GetASCIIString(buffer, nIndex, (int)MessageLength); //注意, MessageLength属性才是主机顺序的
			_messageContent= apiHelper.XCodingtoString(buffer,nIndex,(int)MessageLength,_messageCoding);
			nIndex += (int)MessageLength;
			Buffer.BlockCopy(buffer, nIndex, _reserved, 0, 8);
		}
	}

	public class Submit_Resp : ResponseBody
	{
		public override uint GetCommandID()
		{
			return Command.SGIP_SUBMIT_RESP;
		}
	}

	public class Deliver: Body
	{
		#region private member's
		private string _userNumber = ""; //21, 发送短消息的用户手机号,手机号码前加“86”国别标志
		private string _spNumber = ""; //21, SP的接入号码
		private byte _TP_pid; //1, GSM协议类型。详细解释请参考GSM03.40中的9.2.3.9
		private byte _TP_udhi; //1, GSM协议类型。详细解释请参考GSM03.40中的9.2.3.23,仅使用1位,右对齐
		private byte _messageCoding; //1,  短消息的编码格式。0:纯ASCII字符串 3:写卡操作 4:二进制编码 8:UCS2编码 15: GBK编码 其它参见GSM3.38第4节:SMS Data Coding Scheme
		private uint _messageLength; //4, 短消息的长度
		private string _messageContent = ""; //_messageLength, 短消息的内容
		private byte[] _reserved = new byte[8]; //保留,扩展用
		#endregion

		#region  public property's

		/// <summary>
		/// 发送短消息的用户手机号,手机号码前加“86”国别标志
		/// </summary>
		public string UserNumber
		{
			get { return _userNumber; }
			set
			{
				apiHelper.CheckMaxBytes(value, 21);
				_userNumber = apiHelper.Prefix86ForMobilbeNumber(value);
			}
		}

		/// <summary>
		/// SP的接入号码
		/// </summary>
		public string SPNumber
		{
			get { return _spNumber; }
			set
			{
				apiHelper.CheckMaxBytes(value, 21);
				_spNumber = value;
			}
		}

		/// <summary>
		/// GSM协议类型。详细解释请参考GSM03.40中的9.2.3.9
		/// </summary>
		public byte TP_pid
		{
			get
			{
				return _TP_pid;
			}
			set
			{
				_TP_pid = value;
			}
		}

		/// <summary>
		/// GSM协议类型。详细解释请参考GSM03.40中的9.2.3.23,仅使用1位,右对齐
		/// </summary>
		public byte TP_udhi
		{
			get
			{
				return _TP_udhi;
			}
			set
			{
				_TP_udhi = value;
			}
		}

		/// <summary>
		/// 短消息的编码格式。0:纯ASCII字符串 3:写卡操作 4:二进制编码 8:UCS2编码 15: GBK编码 其它参见GSM3.38第4节:SMS Data Coding Scheme
		/// </summary>
		public byte MessageCoding
		{
			get
			{
				return _messageCoding;
			}
			set
			{
				_messageCoding = value;
			}
		}

		/// <summary>
		/// 短消息的长度
		/// </summary>
		public uint MessageLength
		{
			get
			{
				return (uint)IPAddress.NetworkToHostOrder((int)_messageLength);
			}
			set
			{
				_messageLength = (uint)IPAddress.HostToNetworkOrder((int)value);
			}
		}

		/// <summary>
		/// 短消息的内容
		/// </summary>
		public string MessageContent
		{
			get { return _messageContent; }
			set
			{
				_messageContent = value;
			}
		}

		/// <summary>
		/// 保留,最多8个字节
		/// </summary>
		public byte[] Reserved
		{
			get { return _reserved; }
			set
			{
				apiHelper.CheckMaxBytes(value, 8);
				_reserved = value;
			}
		}

		#endregion

		public override uint GetCommandID()
		{
			return Command.SGIP_DELIVER;
		}

		public override int GetLength()
		{
			return (int)(MessageLength + 57);
		}

		public override byte[] GetBytes()
		{
			byte[] result = new byte[this.GetLength()];
			int nIndex = 0;
			Encoding.ASCII.GetBytes(_userNumber).CopyTo(result, nIndex);
			nIndex += 21;
			Encoding.ASCII.GetBytes(_spNumber).CopyTo(result, nIndex);
			nIndex += 21;

			result[nIndex++] = _TP_pid;
			result[nIndex++] = _TP_udhi;
			result[nIndex++] = _messageCoding;
			BitConverter.GetBytes(_messageLength).CopyTo(result, nIndex);
			nIndex += 4;
//			Encoding.Default.GetBytes(_messageContent).CopyTo(result, nIndex);
			apiHelper.StringToXCoding(_messageContent,_messageCoding).CopyTo(result, nIndex); 
			nIndex += (int)MessageLength; //注意,是MessageLength而不是_messageLength
			_reserved.CopyTo(result, nIndex);

			return result;
		}

		internal override void ReadFromBytes(byte[] buffer, int startIndex)
		{
			int nIndex = startIndex;
			_userNumber = apiHelper.GetASCIIString(buffer, nIndex, 21);
			nIndex += 21;
			_spNumber = apiHelper.GetASCIIString(buffer, nIndex, 21);
			nIndex += 21;
			_TP_pid = buffer[nIndex++];
			_TP_udhi = buffer[nIndex++];
			_messageCoding = buffer[nIndex++];
			_messageLength = BitConverter.ToUInt32(buffer, nIndex);
			nIndex += 4;
//			UnicodeEncoding usc2code = new UnicodeEncoding();
//			if (_messageCoding==8)
//				_messageContent=usc2code.GetString(buffer, nIndex, (int)MessageLength);
//			else
//			_messageContent = Encoding.Default.GetString(buffer, nIndex, (int)MessageLength); //注意是MessageLength而非_messageLength
			_messageContent= apiHelper.XCodingtoString(buffer,nIndex,(int)MessageLength,_messageCoding);

			nIndex += (int)MessageLength;
			Buffer.BlockCopy(buffer, nIndex, _reserved, 0, 8);
		}
	}

	public class Deliver_Resp: ResponseBody
	{
		public override uint GetCommandID()
		{
			return Command.SGIP_DELIVER_RESP;
		}
	}

	public class Report: Body
	{
		#region private members
		private SequenceNumber _sequenceNumber = new SequenceNumber(); //12, 该命令所涉及的Submit或deliver命令的序列号
		private byte _reportType; //1, Report命令类型  0:对先前一条Submit命令的状态报告 1:对先前一条前转Deliver命令的状态报告
		private string _userNumber = ""; //21, 接收短消息的手机号,手机号码前加“86”国别标志
		private byte _state;      //1, 该命令所涉及的短消息的当前执行状态  0:发送成功  1:等待发送 2:发送失败
		private byte _errorCode; //1, 当State=2时为错误码值,否则为0
		private byte[] _reserved = new byte[8]; // 保留,最多8个字节
		#endregion 

		#region public propertys
		/// <summary>
		/// 该命令所涉及的Submit或deliver命令的序列号
		/// </summary>
		public SequenceNumber SequenceNumber
		{
			get { return _sequenceNumber; }
			set { _sequenceNumber = value; }
		}

		/// <summary>
		/// Report命令类型  0:对先前一条Submit命令的状态报告 1:对先前一条前转Deliver命令的状态报告
		/// </summary>
		public byte ReportType
		{
			get
			{
				return _reportType;
			}
			set
			{
				_reportType = value;
			}
		}

		/// <summary>
		/// 接收短消息的手机号,手机号码前加“86”国别标志
		/// </summary>
		public string UserNumber
		{

⌨️ 快捷键说明

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