因为SMGP1.32协议有多个消息包,在这里我就用Login包进行示例
/// <summary>
/// 凳录包
/// </summary>
public class SMGP_MSG_Login
{
/// <summary>
/// SPCP编号或者SMGW编号
/// 编号规则参见总册第六6节
/// </summary>
string _ClientID;
/// <summary>
/// 客户端密码
/// 用于鉴别客户端的接入请求 。
/// 其值通过单向MD5 hash计算得出,
/// 表示如下:
/// AuthenticatorClient =MD5(ClientID+7 字节的0
/// +shared secret+timestamp)
/// Shared secret 由中国电信服务器端与ICP客户端
/// 事先商定,timestamp格式为:MMDDHHMMSS,
/// 即月日时分秒,10位。
/// </summary>
byte[] _AuthenticatorClient;
string _Password;
/// <summary>
/// 登录类型(0=发送短消息, 1=接收短消息,
/// 2=转发收发短消息,其他保留)
/// </summary>
uint _LoginMode;
/// <summary>
/// 时间戳的明文,由客户端产生,
/// 格式为MMDDHHMMSS,即月日时分秒,
/// 10位数字的整型,右对齐
/// </summary>
uint _TimeStamp;
/// <summary>
/// 客户端支持的版本号(高位4bit表示主版本号,
/// 低位4bit表示次版本号)
/// </summary>
byte _Version=0x13;
SMGP_MSG_Header header;
byte[] initValue;
byte[] body;
public SMGP_MSG_Login(uint sequenceid)
{
header=new SMGP.StateObject.SMGP_MSG_Header(SMGP.StateObject.SMGP_COMMAND_ID.SMGP_Login);
header.SequenceID =sequenceid;
header.PacketLength =(uint)(this.BodyLength
+SMGP_MSG_Header.HeaderLength);
body=new byte[this.BodyLength];
}
/// <summary>
/// 解析消息包
/// </summary>
/// <param name="bs"></param>
public SMGP_MSG_Login(byte[] bs)
{
initValue=new byte[bs.Length];
bs.CopyTo(initValue,0);
// byte [] tmp=new byte[SMGP_MSG_Header.HeaderLength];
// for(int i=0;i<tmp.Length;i++)
// {
// tmp[i]=initValue[i];
// }
body=new byte[initValue.Length-SMGP_MSG_Header.HeaderLength];
for(int i=0;i<body.Length;i++)
{
body[i]=initValue[SMGP_MSG_Header.HeaderLength+i];
}
this._ClientID=Encoding.ASCII.GetString(body,0,8);
for(int i=0;i<16;i++)
{
this._AuthenticatorClient[i]=body[8+i];
}
this._LoginMode=(uint)body[24];
this._TimeStamp=BIConvert.Bytes2UInt(body,25);
this._Version=body[29];
}
/// <summary>
/// 返回当前对象的字节数组对象
/// </summary>
/// <returns></returns>
public byte[] ToBytes()
{
byte[] reVal=new Byte[SMGP.StateObject.SMGP_MSG_Header.HeaderLength
+this.BodyLength];
header.ToBytes().CopyTo(reVal,0); //消息头
//加入登录编号
BIConvert.Str2byteLeft(this._ClientID,8).CopyTo(reVal,SMGP_MSG_Header.HeaderLength);
//加入登录密码
//BIConvert.Str2byte(this._AuthenticatorClient,16).CopyTo(reVal,SMGP_MSG_Header.HeaderLength+8);
//this._AuthenticatorClient.CopyTo(reVal,SMGP_MSG_Header.HeaderLength+8);
this._AuthenticatorClient=this.getmd5Authenticator();
this._AuthenticatorClient.CopyTo(reVal,SMGP_MSG_Header.HeaderLength+8);
//加入登录类型
byte [] l;
l=new byte [1];
l[0]=(byte)this._LoginMode;
l.CopyTo(reVal,SMGP_MSG_Header.HeaderLength+8+16);
//加入时间戳
BIConvert.Int2Bytes(this._TimeStamp).CopyTo(reVal,SMGP_MSG_Header.HeaderLength+8+16+1);
//加入版本号
l=new byte[1];
l[0]=this._Version;
l.CopyTo(reVal,SMGP_MSG_Header.HeaderLength+8+16+1+4);
return reVal;
}
/// <summary>
/// 登录用户密码
/// </summary>
public string Password
{
get
{
return this._Password;
}
set
{
this._Password=value;
}
}
/// <summary>
/// 消息体长度
/// </summary>
public int BodyLength
{
get
{
return (8+16+1+4+1);
}
}
/// <summary>
/// SPCP编号或者SMGW编号
/// 编号规则参见总册第六6节
/// </summary>
public string ClientID
{
get
{
return this._ClientID;
}
set
{
this._ClientID=value;
}
}
/// <summary>
/// 客户端密码
/// 用于鉴别客户端的接入请求 。
/// 其值通过单向MD5 hash计算得出,
/// 表示如下:
/// AuthenticatorClient =MD5(ClientID+7 字节的0
/// +shared secret+timestamp)
/// Shared secret 由中国电信服务器端与ICP客户端
/// 事先商定,timestamp格式为:MMDDHHMMSS,
/// 即月日时分秒,10位。
/// </summary>
public byte[] AuthenticatorClient
{
get
{
return this._AuthenticatorClient;
}
// set
// {
// this._AuthenticatorClient=value;
// }
}
/// <summary>
/// 登录类型(0=发送短消息, 1=接收短消息,
/// 2=转发收发短消息,其他保留)
/// </summary>
public uint LoginMode
{
get
{
return this._LoginMode;
}
set
{
this._LoginMode=value;
}
}
/// <summary>
/// 时间戳的明文,由客户端产生,
/// 格式为MMDDHHMMSS,即月日时分秒,
/// 10位数字的整型,右对齐
/// </summary>
public uint TimeStamp
{
get
{
return this._TimeStamp;
}
set
{
this._TimeStamp=value;
}
}
/// <summary>
/// 客户端支持的版本号(高位4bit表示主版本号,
/// 低位4bit表示次版本号)
/// </summary>
public byte Version
{
get
{
return this._Version;
}
set
{
this._Version=value;
}
}
//
/// <summary>
/// 取得客户端Authenticator
/// </summary>
/// <returns></returns>
private byte [] getmd5Authenticator()
{
byte [] buf=new byte[8+7+this._Password.Length+10];
byte [] a_id=Encoding.ASCII.GetBytes(this._ClientID);
byte [] a_0={0,0,0,0,0,0,0};
byte [] a_p=Encoding.ASCII.GetBytes(this._Password);
SMSAPI.Time.SMSDateTime sdt=new SMSAPI.Time.SMSDateTime();
byte [] a_t=Encoding.ASCII.GetBytes(sdt.getThisMinShortDateStr()+sdt.getThisLongTimeStr());
a_id.CopyTo(buf,0);
a_0.CopyTo(buf,8);
a_p.CopyTo(buf,15);
a_t.CopyTo(buf,15+a_p.Length);
MD5CryptoServiceProvider md5=new MD5CryptoServiceProvider();
return md5.ComputeHash(buf);
}
}