📄 sms.cs
字号:
}
}
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 + -