📄 main.pas
字号:
function TfrmMain.CmppSubmit( CmppSocket: TCustomWinSocket ): boolean;
var
cSubmit1: TSubmit1;
cSubmit2: TSubmit2;
cSubmit3: TSubmit3;
MemStream: TMemoryStream;
int1, int2, StreamLength: integer;
buffer1: array of char;
begin
Result := False;
FillChar( cSubmit1, sizeof( TSubmit1 ), 0 );
FillChar( cSubmit2, sizeof( TSubmit2 ), 0 );
FillChar( cSubmit3, sizeof( TSubmit3 ), 0 );
MemStream := TMemoryStream.Create;
try
try
strpcopy( cSubmit1.SP_ID, eSpid.Text );
int1 := length( trim( eSpid.Text ) );
strpcopy( cSubmit1.ServiceType, CMPP_SERVICE_TYPE );
int2 := length( CMPP_SERVICE_TYPE );
MemStream.WriteBuffer( cSubmit1.SP_ID, int1 + 1 );
MemStream.WriteBuffer( cSubmit1.ServiceType, int2 + 1 );
with cSubmit2 do
begin
FeeType := 1; //byte; //资费类型
FeeCode := htonl( 10 ); // LongWord; //资费代码,单位为分,cmpp2.0里面应该定义为,array[0..5] of char;
ProtocolID := 1; //byte; //DEMO例子里面设为1,TP_pid???Protocol ID协议标识 ,东软协议里面说的不详细
MessageMode := 1; //byte; //DEMO例子里面设为1,???消息模式
Priority := 5; //byte; //优先级别,0--9,默认填0,9最高级别
//Vallid_Time:= byte; //array[0..16] of char; //信息存活有效期 17 or 1
//ScheduleTime: byte; //array[0..16] of char; //消息定时发送时间 17 or 1
FeeUserType := 3; //byte; //计费用户类型,
end;
MemStream.WriteBuffer( cSubmit2, SizeOf( TSubmit2 ) );
with cSubmit3 do
begin
StrPCopy( FeeUser, eTel.Text ); // :array[0..20] of char; //计费用户,如果计费类型为3,则本参数必须填写 Var.Max 21
MemStream.WriteBuffer( FeeUser, 21 );
StrPCopy( SourceAddress, eTel.Text ); // : array[0..20] of char; //源终端号码. Var.Max 21
MemStream.WriteBuffer( SourceAddress, 21 );
UserCount := 1; // byte; //接收用户数量,1-255(Cmpp里面定义小于100)
MemStream.WriteBuffer( UserCount, 1 );
StrPCopy( UserNumber, eTel.Text ); //: array[0..20] of char; //:TelCount;接收信息的用户号码; //长度为UserCount
MemStream.WriteBuffer( UserNumber, 20 );
//UserNumberQF: array[0..5334] of char; //根据UserCount 来定 Var.Max 21 Var.Max 5334
Data_Msg_Fmt := 15; // byte; //数据编码,信息格式
MemStream.WriteBuffer( Data_Msg_Fmt, 1 );
Message_Length := 13; // 短消息内容长度
MemStream.WriteBuffer( Message_Length, 1 );
StrPCopy( Msg_Content, 'test message' ); //: array[0..160] of char; //长度为 MessageLength; Var.Max 161
MemStream.WriteBuffer( Msg_Content, Message_Length );
end;
StreamLength := Memstream.Size;
SetLength( buffer1, StreamLength );
MemStream.Seek( 0, soFromBeginning );
//SizeOf( @buffer1[0] );
MemStream.ReadBuffer( buffer1[0], StreamLength );
if CmppSocket.SendBuf( buffer1[0], StreamLength ) <> StreamLength then
memo1.Lines.Add( 'submit提交失败' )
else
memo1.Lines.Add( 'submit提交成功,等待响应信息' );
except
on e: exception do
begin
memo1.Lines.Add( 'submit提交异常:' + e.Message );
end;
end;
finally
buffer1 := nil;
MemStream.Free;
end; //try-finally
end;
function TfrmMain.CmppLSH: integer;
begin
Result := Sequence_Number;
inc( Sequence_Number );
end;
procedure TfrmMain.Cmpp_ClientRead( Sender: TObject;
Socket: TCustomWinSocket );
var
CMPPHead: TCMPPHead;
CSubmit_Resp: TSubmit_Resp;
Login_Resp: TLogin_Resp;
buffer1: array[0..2048] of char;
//tempCommand: longword;
str1: string;
deliver_file: TFileStream;
timestr: string;
Read_File: TFileStream;
begin
DateTimeToString( timestr, 'yyyymmddhhss', now );
try
if Socket.ReceiveBuf( CMPPHead, SizeOf( TCMPPHead ) ) <> SizeOf( TCMPPHead ) then
begin
memo1.Lines.Add( '收到错误包' );
exit;
end;
CMPPHead.MessageLength := ntohl( CMPPHead.MessageLength );
CMPPHead.CommandId := ntohl( CMPPHead.CommandId );
CMPPHead.CommandStauts := ntohl( CMPPHead.CommandStauts );
CMPPHead.SequenceNumber := ntohl( CMPPHead.SequenceNumber );
memo1.Lines.Add( '收到数据包,内容:。。。。。。。。。。。。。。。。。。。' );
memo1.Lines.Add( 'CMPPHead.MessageLength: ' + inttostr( CMPPHead.MessageLength ) );
memo1.Lines.Add( 'CMPPHead.CommandId: ' + inttostr( CMPPHead.CommandId ) );
memo1.Lines.Add( 'CMPPHead.CommandStauts: ' + inttostr( CMPPHead.CommandStauts ) );
memo1.Lines.Add( 'CMPPHead.SequenceNumber: ' + inttostr( CMPPHead.SequenceNumber ) );
case CMPPHead.CommandId of
CMPPE_LOGIN_RESP:
begin
FillChar( Login_Resp, SizeOf( TLogin_Resp ), 0 );
if socket.ReceiveBuf( Login_Resp, SizeOf( TLogin_Resp ) ) <> SizeOf( TLogin_Resp ) then
memo1.Lines.Add( '收包体错:Login_Resp' )
else
begin
str1 := Login_Resp.Ismg_Auth;
Memo1.Lines.Add( '收到CMPPE_LOGIN_RESP响应包-------------------------' );
Memo1.Lines.Add( 'IF_Ver:' + IntToStr( Login_Resp.IF_Ver ) );
Memo1.Lines.Add( 'Ismg_Auth:' + str1 );
if length( str1 ) = 16 then
begin
Memo1.Lines.Add( 'login成功........' );
frmMain.Caption := FRMMAIN_CAPTION + 'login成功........';
end
else if ( length( str1 ) < 16 ) then
begin
Memo1.Lines.Add( 'login不成功........' );
frmMain.Caption := FRMMAIN_CAPTION + 'login不成功';
end;
end;
end;
CMPPE_LOGOUT_RESP:
begin
Memo1.Lines.Add( 'Logout成功........' );
frmMain.Caption := FRMMAIN_CAPTION + 'logout成功';
end;
CMPPE_SUBMIT_RESP:
begin
FillChar( CSubmit_Resp, SizeOf( TSubmit_Resp ), 0 );
if socket.ReceiveBuf( CSubmit_Resp, CMPPHead.MessageLength - 16 ) <> ( CMPPHead.MessageLength - 16 ) then
begin
memo1.Lines.Add( '收包体错CSubmit_Resp' );
exit;
end;
if CMPPHead.CommandStauts = CMPPE_RSP_SUCCESS then
begin
memo1.Lines.Add( '发送到手机号成功,收到的返回值是' );
memo1.Lines.Add( '内容标识码是:' + CSubmit_Resp.MessageID );
end
else
begin
memo1.Lines.Add( '发送到手机号失败,错误号是' + inttostr( CMPPHead.CommandStauts ) );
memo1.Lines.Add( '内容标识码是:' + CSubmit_Resp.MessageID );
end;
end;
CMPPE_DELIVER:
begin
FillChar( buffer1, 2048, 0 );
DateTimeToString( str1, 'yyyymmddhhss', now );
deliver_file := TFileStream.Create( '.\Deliver' + str1 + '.del', fmCreate );
try
socket.ReceiveBuf( buffer1, CMPPHead.MessageLength - 16 );
deliver_file.WriteBuffer( buffer1, CMPPHead.MessageLength - 16 );
memo1.Lines.Add( '收到短信息,已装信息存入' + '.\Deliver' + str1 + '.del' + '文件中' );
with CMPPHead do
begin
MessageLength := htonl( 16 ); //longword; //消息的总长度(字节)
CommandId := htonl( CMPPE_DELIVER_RESP ); //longword; //命令ID
CommandStauts := htonl( 0 ); //longword; //命令状态,仅在应答请求包里有效
SequenceNumber := htonl( SequenceNumber ); //longword; //序列号,循环使用,步长为1,范围1-0x7fffffff
end;
socket.SendBuf( CMPPHead, 16 );
finally
deliver_file.Free;
end; //try-finally
end;
CMPPE_ACTIVE_RESP:
begin
memo1.Lines.Add( '收到测试包响应信息' );
end;
CMPPE_ACTIVE:
begin
memo1.Lines.Add( '收到测试包' );
with CMPPHead do
begin
MessageLength := htonl( 16 ); //longword; //消息的总长度(字节)
CommandId := htonl( CMPPE_ACTIVE_RESP ); //longword; //命令ID
CommandStauts := htonl( 0 ); //longword; //命令状态,仅在应答请求包里有效
SequenceNumber := htonl( SequenceNumber ); //longword; //序列号,循环使用,步长为1,范围1-0x7fffffff
end;
socket.SendBuf( CMPPHead, 16 );
end;
else
begin
memo1.Lines.Add( '收到其它包,命令: ' + inttostr( CMPPHead.CommandId ) );
end;
end;
except
on e: exception do
begin
memo1.Lines.Add( '收包错误,请logout后再login:' + e.Message );
end;
end;
end;
procedure TfrmMain.bActiveTestClick( Sender: TObject );
begin
CmppActive( Cmpp_Client.Socket );
end;
procedure TfrmMain.bLogoutClick( Sender: TObject );
begin
CmppLogout( Cmpp_Client.Socket );
CMPP_Client.Close;
end;
procedure TfrmMain.Cmpp_ClientError( Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer );
begin
errorcode := 0;
end;
procedure TfrmMain.setCursorDef;
begin
screen.Cursor := crDefault;
end;
procedure TfrmMain.SetCursorHour;
begin
screen.Cursor := crHourGlass;
end;
procedure TfrmMain.bSubmitClick( Sender: TObject );
begin
CmppSubmit( Cmpp_Client.Socket );
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -