📄 smg_interface.pas
字号:
unit SMG_Interface;
interface
uses
Windows, Forms, SysUtils, Classes, WinSock;
//Deliver包结构
type
DeliverStr = record
SrcNum : DWord;
DateTime : DWord;
Seq : DWord;
UserNumber : array[0..21] of Char;
SPNumber : array[0..21] of Char;
Tp_Pid : Char;
Tp_Udhi : Char;
MsgCoding : Char;
MsgContent : array[0..159] of Char;
end;
//Report包结构
type
ReportStr = record
SrcNum : DWord;
DateTime : DWord;
Seq : DWord;
UserNumber : array[0..21] of Char;
State : Char;
ErrorCode : Char;
SubmitSeq : DWord;
end;
//MT Response结构
type
MTRespStr = record
SrcNum : DWord;
DateTime : DWord;
Seq : DWord;
Result : Char;
end;
//Submit错误结构,当Submit发送不成功时,返回该结构
type
MTErrorStr = record
SrcNum : DWord;
DateTime : DWord;
Seq : DWord;
ErrorType : DWord; //1:因为连接不上SMG网关系统 2:登录网关失败 3:包发送失败且超过重发次数 4.超时无应答 5.消息长度为零
end;
type
SGIP_SeqID = record
SrcNodeNum: Integer; //源节点编号
DateTime : Integer; //日期时间,如:1120203225
SeqId : Integer; //流水号
end;
//消息头
type
SGIP_Head = record
TotalLength : Integer; //信息总长度
CommandID : DWord; //命令ID号
SequenceID : SGIP_SeqID;
end;
//登录包消息体
type
SGIP_Connect = record
LoginType : Char; //1-sp连接smg;2-smg连接sp
LoginName : array[0..15] of Char;
LoginPwd : array[0..15] of Char;
Reserved : array[0..7] of Char;
end;
//SGIP1.2应答包
type
SGIP_Resp = record
Result : Char; //0:成功;1:等待发送;2:发送失败
Reserved : array[0..7] of Char;
end;
//SGIP1.1 Head数据体
//SGIP1.1 Submit数据体
type
SGIP_Submits = record
SPNumber : array[0..20] of Char; //sp的接入号码
ChargeNumber : array[0..20] of Char; //付费号码
UserCount : byte; //接收短消息的手机数量
UserNumber : array[0..20] of Char; //接收该短消息的手机号
CorpID : array[0..4] of Char; //企业代码,0-99999
ServiceType : array[0..9] of Char; //业务代码,由sp定义
FeeType : byte; //计费类型:
//0:短消息类型为”发送“对”计费用户号码“不计费,此类话单仅用于核减SP对称的信道费。
//1:对计费号码免费
//2:对计费号码按条计信息费
//3:对计费号码按包月收取信息费
//4:对计费号码的收费是由SP实现
FeeValue : array[0..5] of Char; //该条短消息的收费值,单位为分
GivenValue : array[0..5] of Char; //赠送用户的话费,0-99999
AgentFlag : byte; //代收费标志,0:应收;1:实收
MorelatetoMTFlag : byte; //引起MT消息的原因
Priority : byte; //优先级0-9,从低到高
ExpireTime : array[0..15] of Char; //短消息寿命的终止时间,"yymmddhhmmsstnnp","tnnp"取固定值"032+"
ScheduleTime : array[0..15] of Char; //定时发送时间
ReportFlag : byte; //状态报告标志,0-出错返回状态报告;1-总返回状态报告;2-不要状态报告;3...
TpPid : byte;
Udhi : byte;
MessageCoding: byte; //编码方式,0:Ascii;3:Write card;4:binary;8:ucs2;15:GBK
MessageType : byte; //0:短消息信息
MsgLen : Integer; //短消息长度
MsgContent : array of Char; //短消息内容
Reserved : array[0..7] of Char; //保留
end;
//DELIVER消息体
type
SGIP_Delivers = record
UserNumber : array[0..20] of Char; //发送短消息的用户手机号
SPNumber :array[0..20] of Char; //sp的接入号码
TpPid : Char;
Udhi : Char;
MsgCoding : Char;
MsgLen : Integer;
MsgContent : array[0..159] of Char;
Reserved : array[0..7] of Char;
end;
//REPORT消息体
type
SGIP_Reports = Record
SubmitSeqNum : SGIP_SeqID; //该命令所涉及的Submit或Deliver命令的序列号
ReportType : Char; //Report命令类型.0,1.
UserNumber : array[0..20] of Char; //接收短消息的手机号,手机号码前加"86"国别标志.
State : Char; //该命令所涉及的短消息的当前执行状态.0:发送成功.1:等待发送.2:发送失败.
ErrorCode : Char; //当State==2时为错误码值,否则为0.
Reserved : array[0..7] of Char; //保留,扩展用.
end;
//sgip_packet接收时用到的消息包.
type
SGIP_Packet = Record
pk_head : SGIP_Head; //信息头
pk_login : SGIP_Connect; //登录包
pk_resp : SGIP_Resp; //应答消息包
pk_submit : SGIP_Submits; //Submit消息包
pk_deliver : SGIP_Delivers; //Deliver消息包
pk_report : SGIP_Reports; //Report消息包
end;
type
SGIP_Conn = record
hSocket : TSocket;
SrcNum : DWord;
Binded : Boolean;
end;
const
{错误代码定义}
SGIP_SUCCESS = 0; //*success*/
SGIP_ERROR_START = 0x40000000;
SGIP_EINVALSOCK = SGIP_ERROR_START+1; //Create Socket Fail//
SGIP_EINVAL = SGIP_ERROR_START+2; //Illegal Server Address//
SGIP_HOST_UNREACHABLE= SGIP_ERROR_START+3; //Fail to Connect ISC//
SGIP_TIMEOUT = SGIP_ERROR_START+4; //Send Or Recv TimeOut//
SGIP_USERINVAL = SGIP_ERROR_START+5; //User Or Pwd Illegal//
SGIP_DISCONNECT = SGIP_ERROR_START+6; //Connection end//
SGIP_TOOHIGH_VERSION = SGIP_ERROR_START+9; //Too High Version//
//客户端向服务端请求消息
SGIP_BIND = $00000001; //客户端向服务器请求连接
SGIP_UNBIND = $00000002; //客户端向服务器端通知短开当前的连接
SGIP_SUBMIT = $00000003; //客户端向服务器端发送一条MT短消息
SGIP_DELIVER = $00000004; //客户端向服务端发送一条MO短消息
SGIP_REPORT = $00000005; //客户端向服务器端发送一条MT或MO的发送结果
//服务器返回请求消息1
SGIP_BIND_RESP = $80000001; //服务器端对接收到的Bind,命令的响应
SGIP_UNBIND_RESP = $80000002; //服务器端对接收的Unbind命令的响应
SGIP_SUBMIT_RESP = $80000003; //服务器端向从客户端接收到的Submit命令发送的应答消息
SGIP_DELIVER_RESP = $80000004; //服务器端向从客户端接收到的Deliver命令发送的应答消息
SGIP_REPORT_RESP = $80000005; //服务器端向从客户端接收到的Report命令发送应答消息]
{消息格式的定义}
MSG_FMT_ASCII = $0; //纯ASCII字符串
MSG_FMT_WRITE_CARD= $3; //写卡操作
MSG_FMT_BINARY = $4; //二进制编码
MSG_FMT_UCS2 = $8; //UCS2编码
MSG_FMT_GB = $0F; //GBK编码
MSG_FMT_OTA = $F6; //OTA操作时的编码方式
{网络套接字错误定义}
SGIP_SOCKET_CREATEFAIL = SGIP_ERROR_START+100;
SGIP_SOCKET_CONNECTFAIL= SGIP_ERROR_START+101;
SGIP_SOCKET_SENDTIMEOUT= SGIP_ERROR_START+102;
SGIP_SOCKET_SENDERROR = SGIP_ERROR_START+103;
SGIP_SOCKET_CLOSED = SGIP_ERROR_START+104;
SGIP_SOCKET_RECVTIMEOUT= SGIP_ERROR_START+105;
SGIP_SOCKET_RECVERROR = SGIP_ERROR_START+106;
SGIP_CLOSESOCKET_ERROR = SGIP_ERROR_START+107;
SGIP_UNSENDALL = SGIP_ERROR_START+108;
SGIP_SOCKET_SIZE_ERROR = SGIP_ERROR_START+109;
SGIP_ILLEGAL_CMD = SGIP_ERROR_START+110;
SGIP_LOGINFAIL = SGIP_ERROR_START+111;
SGIP_SOCKET_BINDFAIL = SGIP_ERROR_START+112;
SGIP_SOCKET_ACCEPTFAIL = SGIP_ERROR_START+113;
SGIP_API_EXCEPTION = SGIP_ERROR_START+200;
SGIP_SOCKET_EXCEPTION = SGIP_ERROR_START+300;
SGIP_API_INVALPARAM = SGIP_ERROR_START+400;
SGIP_SOCKET_INVALPARAM = SGIP_ERROR_START+500;
//消息包的长度定义
SGIP_HEADLEN = SizeOf(SGIP_Head); //消息头的长度
SGIP_LOGINLEN = SizeOf(SGIP_Connect); //登录消息包体的长度
SGIP_RESPLEN = SizeOf(SGIP_Resp); //应答包体的长度
SGIP_SUBMITLEN = SizeOf(SGIP_Submits); //MT消息体的长度
SGIP_DELIVERLEN= SizeOf(SGIP_Delivers); //MO消息体的长度
SGIP_REPORTLEN = SizeOf(SGIP_Reports); //Report消息体的长度
implementation
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -