📄 sgip.cs
字号:
/// 状态报告标记 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 + -