📄 mainunit.pas
字号:
My_LoginFlag := true;
end else
begin
self.My_WriteInfo('网关回应:登陆失败,可能为:' + CMPP_Protocol2.GET_CMPP_CONNECT_RESP_ERRORINFO(PK_CMPP_CONNECT_RESP.Status) + ',错误代码:' + IntToStr(PK_CMPP_CONNECT_RESP.Status));
end;
end else
begin
self.My_WriteInfo('网关回应:登陆回应包出错!');
end;
Exit;
end;
//----------------------------------------------------------------------------
if PK_Head.Command_ID = CMPP_Protocol2.CMPP_TERMINATE_RESP then
begin
self.My_WriteInfo('网关回应:已断开连接.');
Exit;
end;
//----------------------------------------------------------------------------
if PK_Head.Command_ID = CMPP_Protocol2.CMPP_SUBMIT_RESP then
begin
FillChar(PK_CMPP_SUBMIT_RESP,SizeOf(PK_CMPP_SUBMIT_RESP),0);
if Socket.ReceiveBuf(PK_CMPP_SUBMIT_RESP,SizeOf(PK_CMPP_SUBMIT_RESP)) = SizeOf(PK_CMPP_SUBMIT_RESP) then
begin
PK_CMPP_SUBMIT_RESP.Result := WinSock.ntohl(PK_CMPP_SUBMIT_RESP.Result);
if PK_CMPP_SUBMIT_RESP.Result = 0 then
begin
// self.My_WriteInfo(inttostr(PK_CMPP_SUBMIT_RESP.Msg_Id));
self.My_WriteInfo('Submit OK,提交成功. ID:' + self.ConvertMsgID(@PK_CMPP_SUBMIT_RESP.Msg_Id));
try
Query2.Close ;
Query2.SQL.Text:='select * from SMS_SUBMIT where msgid= ' + ''''+'A'+IntToStr(PK_Head.Sequence_ID)+'''';
Query2.Open ;
ssdk:='';
ssdk:=Query2.FieldByName('SUBMITID').AsString;
// self.My_WriteInfo( IntToStr(PK_Head.Sequence_ID));
// self.My_WriteInfo( Query2.FieldByName('SUBMITID').AsString);
// if query2.RecordCount > 1 then
// begin
self.Command_Delete.CommandText := 'DELETE FROM SMS_SUBMIT where msgid= '+'''' +'A'+ IntToStr(PK_Head.Sequence_ID)+'''' ;
self.Command_Delete.Execute;
// self.My_WriteInfo('DELETE 成功');
Query3.Close;
// self.My_WriteInfo( IntToStr(PK_Head.Sequence_ID));
ssql:= 'Insert into sms_report(ReportType,Submit_Time,Done_Time,RawState,ErrorCode,State,SubmitID,MsgID,UserNumber) values(0,' + '''' + '''' + ',' + '''' + '''' + ',0,' + '''' + '''' + ',3,' +''''+ ssdk+''''+ ',' +''''+ inttostr(PK_CMPP_SUBMIT_RESP.Msg_Id) +'''' + ',' + Query2.FieldByName('UserNumber').AsString + ')'; //?
Query3.SQL.Text:=ssql;
// self.My_WriteInfo(ssql);
Query3.ExecSQL ;
// self.My_WriteInfo('写表成功');
// end;
except
query3.Free ;
end;
self.My_SendCount := self.My_SendCount + 1;
self.MainStatusBar.Panels.Items[2].Text := '发送短信数 ' + IntToStr(self.My_SendCount) + ' 条';
end else
begin
self.My_WriteInfo('发送短信失败,可能为:' + CMPP_Protocol2.GET_CMPP_SUBMIT_RESP_ERRORINFO(PK_CMPP_SUBMIT_RESP.Result) + ',错误代码:' + IntToStr(PK_CMPP_SUBMIT_RESP.Result));
// SubmitRespErrorProcUnit.SubmitRespErrorProc.Create(false,self.ADOConn,PK_Head.Sequence_ID,PK_CMPP_SUBMIT_RESP.Result);
try
Query2.Close ;
Query2.SQL.Text:='select * from SMS_SUBMIT where msgid= ' +'A'+IntToStr(PK_Head.Sequence_ID) ;
Query2.Open ;
ssdk:='';
ssdk:=Query2.FieldByName('SUBMITID').AsString;
Query3.Close ;
Query3.SQL.Text:= 'Insert into sms_report(ReportType,Submit_Time,Done_Time,RawState,ErrorCode,State,SubmitID,MsgID,UserNumber) values(0,' + '''' + '''' + ',' + '''' + '''' + ',0,' + '''' + '''' + ',c,' + ssdk+ ',' + ''''+inttostr(PK_CMPP_SUBMIT_RESP.Msg_Id)+'''' + ',' + Query2.FieldByName('UserNumber').AsString + ')';
Query3.ExecSQL ;
self.Command_Delete.CommandText := 'DELETE FROM SMS_SUBMIT where msgid= '+'''' +'A'+ IntToStr(PK_Head.Sequence_ID)+'''' ;
self.Command_Delete.Execute;
except
query3.Free ;
end;
end;
Exit;
end;
end;
//----------------------------------------------------------------------------
if PK_Head.Command_ID = CMPP_Protocol2.CMPP_DELIVER then
begin
FillChar(PK_CMPP_DELIVER_HEAD,SizeOf(PK_CMPP_DELIVER_HEAD),0);
if Socket.ReceiveBuf(PK_CMPP_DELIVER_HEAD,SizeOf(PK_CMPP_DELIVER_HEAD)) = SizeOf(PK_CMPP_DELIVER_HEAD) then
begin
//Receive Shortmessage
if PK_CMPP_DELIVER_HEAD.Registered_Delivery = 0 then
begin
FillChar(PK_CMPP_DELIVER_BODY,SizeOf(PK_CMPP_DELIVER_BODY),0);
Socket.ReceiveBuf(PK_CMPP_DELIVER_BODY,SizeOf(PK_CMPP_DELIVER_BODY));
if PK_CMPP_DELIVER_HEAD.Msg_Fmt in [0..4, 15..17, 210, 240, 242, 247] then //ASCII OR GB15
begin
SetString(ShortMessage,PK_CMPP_DELIVER_BODY.Msg_Content,PK_CMPP_DELIVER_HEAD.Msg_Length);
end;
if PK_CMPP_DELIVER_HEAD.Msg_Fmt in [8..11, 23..25, 27] then //UCS2
begin
ShortMessage := self.My_UniCodeArrayToString(PK_CMPP_DELIVER_BODY.Msg_Content,PK_CMPP_DELIVER_HEAD.Msg_Length);
end;
//self.My_UCS2toGB(@PK_CMPP_DELIVER_CONTENT.Msg_Content[0],70);
//delete enter key
MsgLen := Length(ShortMessage);
while (MsgLen > 0) and (ShortMessage[MsgLen] in [#13, #10]) do
begin
Delete(ShortMessage, MsgLen, 1);
MsgLen := Length(ShortMessage);
end;
WideShortMessage := trim(ShortMessage);
with ReceiveShortMessage do
begin
Msg_Id := PK_CMPP_DELIVER_HEAD.Msg_Id;
Dest_Id := PK_CMPP_DELIVER_HEAD.Dest_Id;
Service_Id := PK_CMPP_DELIVER_HEAD.Service_Id;
TP_pid := PK_CMPP_DELIVER_HEAD.TP_pid;
TP_udhi := PK_CMPP_DELIVER_HEAD.TP_udhi;
Msg_Fmt := PK_CMPP_DELIVER_HEAD.Msg_Fmt;
Src_terminal_Id := PK_CMPP_DELIVER_HEAD.Src_terminal_Id;
Registered_Delivery := PK_CMPP_DELIVER_HEAD.Registered_Delivery;
Msg_Length := PK_CMPP_DELIVER_HEAD.Msg_Length;
Msg_Content := WideShortMessage;
end;
self.My_ReceiveShortMessage(ReceiveShortMessage);
self.My_ReceiveCount := self.My_ReceiveCount + 1;
self.MainStatusBar.Panels.Items[3].Text := '收到短信数 ' + IntToStr(self.My_ReceiveCount) + ' 条';
end;
//Receive Report
if PK_CMPP_DELIVER_HEAD.Registered_Delivery = 1 then
begin
FillChar(PK_CMPP_REPORT_BODY,SizeOf(PK_CMPP_REPORT_BODY),0);
Socket.ReceiveBuf(PK_CMPP_REPORT_BODY,SizeOf(PK_CMPP_REPORT_BODY));
ReceiveReport.Msg_Id := PK_CMPP_DELIVER_HEAD.Msg_Id;
ReceiveReport.Dest_Id := String(PK_CMPP_DELIVER_HEAD.Dest_Id);
ReceiveReport.Service_Id := String(PK_CMPP_DELIVER_HEAD.Service_Id);
ReceiveReport.TP_pid := PK_CMPP_DELIVER_HEAD.TP_pid;
ReceiveReport.TP_udhi := PK_CMPP_DELIVER_HEAD.TP_udhi;
ReceiveReport.Msg_Fmt := PK_CMPP_DELIVER_HEAD.Msg_Fmt;
ReceiveReport.Src_terminal_Id := String(PK_CMPP_DELIVER_HEAD.Src_terminal_Id);
ReceiveReport.Registered_Delivery := PK_CMPP_DELIVER_HEAD.Registered_Delivery;
ReceiveReport.Msg_Length := PK_CMPP_DELIVER_HEAD.Msg_Length;
ReceiveReport.MT_Msg_ID := PK_CMPP_REPORT_BODY.Msg_ID;
ReceiveReport.Stat := String(PK_CMPP_REPORT_BODY.Stat);
ReceiveReport.Submit_time := String(PK_CMPP_REPORT_BODY.Submit_time);
ReceiveReport.Done_time := String(PK_CMPP_REPORT_BODY.Done_time);
ReceiveReport.Dest_Terminal_Id := String(PK_CMPP_REPORT_BODY.Dest_Terminal_Id);
ReceiveReport.SMSC_sequence := PK_CMPP_REPORT_BODY.SMSC_sequence;
self.My_ReveiveReport(ReceiveReport);
end;
end else
begin
self.My_WriteInfo('接收短信包失败.');
end;
//Reply To ISMG For Deliver Message
FillChar(PK_TCMPP_DELIVER_RESP,SizeOf(PK_TCMPP_DELIVER_RESP),0);
PK_TCMPP_DELIVER_RESP.Head.Total_Length := WinSock.htonl(SizeOf(PK_TCMPP_DELIVER_RESP));
PK_TCMPP_DELIVER_RESP.Head.Command_ID := WinSock.htonl(CMPP_Protocol2.CMPP_DELIVER_RESP);
PK_TCMPP_DELIVER_RESP.Head.Sequence_ID := WinSock.htonl(PK_Head.Sequence_ID);
PK_TCMPP_DELIVER_RESP.Body.Msg_Id := PK_CMPP_DELIVER_HEAD.Msg_Id;
PK_TCMPP_DELIVER_RESP.Body.Result := WinSock.htonl(0);
Socket.SendBuf(PK_TCMPP_DELIVER_RESP,SizeOf(PK_TCMPP_DELIVER_RESP));
Exit;
end;
//----------------------------------------------------------------------------
if PK_Head.Command_ID = CMPP_Protocol2.CMPP_ACTIVE_TEST_RESP then
begin
//FillChar(PK_CMPP_ACTIVE_TEST_RESP,SizeOf(PK_CMPP_ACTIVE_TEST_RESP),0);
//if Socket.ReceiveBuf(PK_CMPP_ACTIVE_TEST_RESP,SizeOf(PK_CMPP_ACTIVE_TEST_RESP)) = SizeOf(PK_CMPP_ACTIVE_TEST_RESP) then
//begin
self.My_WriteInfo('网关回应:收到网关的测试包回应.');
//end else
//begin
// self.My_WriteInfo('网关回应:接收网关测试包失败!');
//end;
Exit;
end;
if PK_Head.Command_ID = CMPP_Protocol2.CMPP_ACTIVE_TEST then
begin
FillChar(PK_TCMPP_ACTIVE_TEST_RESP,SizeOf(PK_TCMPP_ACTIVE_TEST_RESP),0);
PK_TCMPP_ACTIVE_TEST_RESP.Head.Total_Length := WinSock.htonl(SizeOf(PK_TCMPP_ACTIVE_TEST_RESP));
PK_TCMPP_ACTIVE_TEST_RESP.Head.Command_ID := WinSock.htonl(CMPP_Protocol2.CMPP_ACTIVE_TEST_RESP);
PK_TCMPP_ACTIVE_TEST_RESP.Head.Sequence_ID := WinSock.htonl(PK_Head.Sequence_ID);
Socket.SendBuf(PK_TCMPP_ACTIVE_TEST_RESP,SizeOf(PK_TCMPP_ACTIVE_TEST_RESP));
Exit;
end;
//----------------------------------------------------------------------------
end;
procedure TMainForm.My_ReceiveShortMessage(ReceiveShortMessage :TReceiveShortMessage);
var StoredProc :TADOStoredProc; id:string;
begin
self.My_WriteInfo('收到{' + ReceiveShortMessage.Src_terminal_Id + '}短信{' + IntToStr(ReceiveShortMessage.Msg_Length) + '}.');
try
Query5.Close ;
Query5.SQL.Text:='Select sms_id.nextval as id From dual' ;
Query5.Open ;
id:=Query5.FieldByName('ID').AsString ;
Query5.Close ;
Query5.SQL.Text:=' Insert into Sms_Deliver(USERNUMBER ,SPNUMBER,MESSAGECONTENT ,ID ) values('+''''+ReceiveShortMessage.Src_terminal_Id+''''+','+''''+ReceiveShortMessage.Dest_Id+''''+','+''''+ReceiveShortMessage.Msg_Content+''''+','+''''+id+''''+')' ;
Query5.ExecSQL ;
// self.My_WriteInfo('上行消息写表OK');
except
// self.My_WriteInfo('上行消息写表异常');
// Query5.Free ;
end;
end;
procedure TMainForm.My_ReveiveReport(ReceiveReport : TReceiveReport);
begin
//self.My_WriteInfo(inttostr(ReceiveReport.MT_Msg_ID));
self.My_WriteInfo('收到{' + ReceiveReport.Src_terminal_Id + '}状态报告:' + GET_CMPP_REPORT_STATUS(ReceiveReport.Stat));
// ReceiveReport.
// self.My_WriteInfo(ReceiveReport.Stat);
if ReceiveReport.Stat <>'DELIVRD' then
begin
try
Query4.Close ;
Query4.SQL.Text:='Update sms_report set rawstate='+''''+'0'+''''+',state='+''''+'c'+''''+' where msgid= '+'''' +inttostr(ReceiveReport.MT_Msg_ID)+'''' ;
Query4.ExecSQL ;
// self.My_WriteInfo('状态 OK');
except
Query4.Free ;
end;
end;
end;
procedure TMainForm.SpeedButton3Click(Sender: TObject);
begin
WinExec(PChar('notepad.exe ' + self.My_GetIniConfigFile),SW_SHOW);
end;
procedure TMainForm.CheckTimerTimer(Sender: TObject);
begin
if not self.My_LoginFlag then Exit;
self.CMPP2_ACTIVE_TEST;
end;
procedure TMainForm.InfoMemoChange(Sender: TObject);
begin
if self.InfoMemo.Lines.Count > My_ClearInfoLineCount then
begin
self.InfoMemo.Clear;
end;
end;
procedure TMainForm.LoopTimerTimer(Sender: TObject);
var
CMPP_SUBMIT : TCMPP_SUBMIT;
AShortMessage: string;
begin
if not self.CMPP2Socket.Active then Exit;;
if not My_LoginFlag then Exit;
try
(Sender AS TTimer).Enabled := false;
self.Query1.Close;
self.Query1.SQL.Text := 'select * from SMS_SUBMIT where sendstate='+''''+'0'+''''+' and (to_date(SCHEDULETIME,'+''''+'yyyy-mm-dd hh24:mi:ss'+''''+')<=sysdate or scheduletime is null ) and mobiletype=1 and mod(submitid,2)<>0 and rownum <= '+IntToStr(self.My_MaxRecCount)+'order by priority desc'; //
self.CDS1.Open;
self.CDS1.First;
while not self.CDS1.Eof do
begin
if not self.CMPP2Socket.Active then Break;
FillChar(CMPP_SUBMIT,SizeOf(CMPP_SUBMIT),0);
with CMPP_SUBMIT do
begin
Msg_Id := 0;//CDS1.FieldByName('Msg_Id').AsInteger; //信息标识,由SP侧短信网关本身产生,本处填空。
Pk_total := 0;//Byte(CDS1.FieldByName('Pk_total').AsInteger); //相同Msg_Id的信息总条数,从1开始
Pk_number := 0;// Byte(CDS1.FieldByName('Pk_number').AsInteger); //相同Msg_Id的信息序号,从1开始
Registered_Delivery :=1;// Byte(CDS1.FieldByName('Registered_Delivery').AsInteger); //是否要求返回状态确认报告:0:不需要1:需要 2:产生SMC话单 (该类型短信仅供网关计费使用,不发送给目的终端)
Msg_level :=0;// Byte(CDS1.FieldByName('Msg_level').AsInteger); //信息级别
My_StrCopy(trim(CDS1.FieldByName('ServiceType').AsString),Service_Id,Length(trim(CDS1.FieldByName('ServiceType').AsString))); //业务类型,是数字、字母和符号的组合。
Fee_UserType := 0;//Byte(CDS1.FieldByName('Fee_UserType').AsInteger); //计费用户类型字段 0:对目的终端MSISDN计费;1:对源终端MSISDN计费;2:对SP计费;3:表示本字段无效,对谁计费参见Fee_terminal_Id字段。
My_StrCopy(trim(CDS1.FieldByName('CHARGENUMBER').AsString),Fee_terminal_Id,Length(trim(CDS1.FieldByName('CHARGENUMBER').AsString))); //被计费用户的号码(如本字节填空,则表示本字段无效,对谁计费参见Fee_UserType字段,本字段与Fee_UserType字段互斥)
TP_pId := 0;//Byte(CDS1.FieldByName('TP_pId').AsInteger) ; // GSM协议类型。详细是解释请参考GSM03.40中的9.2.3.9
TP_udhi :=0;// Byte(CDS1.FieldByName('TP_udhi').AsInteger); //GSM协议类型。详细是解释请参考GSM03.40中的9.2.3.23,仅使用1位,右对齐
Msg_Fmt := 15;//Byte(CDS1.FieldByName('Msg_Fmt').AsInteger); //信息格式 0:ASCII串 3:短信写卡操作 4:二进制信息 8:UCS2编码 15:含GB汉字 。。。。。。
My_StrCopy(My_SPCorpID,Msg_src,Length(My_SPCorpID));
My_StrCopy(trim(CDS1.FieldByName('FeeType').AsString),FeeType,Length(trim(CDS1.FieldByName('FeeType').AsString))); //资费类别01:对"计费用户号码"免费02:对"计费用户号码"按条计信息费03:对"计费用户号码"按包月收取信息费04:对"计费用户号码"的信息费封顶05:对"计费用户号码"的收费是由SP实现
My_StrCopy(trim(CDS1.FieldByName('servicetype').AsString),FeeCode,Length(trim(CDS1.FieldByName('servicetype').AsString))); //资费代码(以分为单位)
{if trim(CDS1.FieldByName('ValId_Time').AsString) <> '' then
begin
My_StrCopy(trim(CDS1.FieldByName('ValId_Time').AsString),ValId_Time,SizeOf(CMPP_SUBMIT.ValId_Time));
end;
if trim(CDS1.FieldByName('At_Time').AsString) <> '' then
begin
My_StrCopy(trim(CDS1.FieldByName('At_Time').AsString),At_Time,SizeOf(CMPP_SUBMIT.At_Time));
end; }
My_StrCopy(trim(CDS1.FieldByName('SPNUMBER').AsString),Src_Id,Length(trim(CDS1.FieldByName('SPNUMBER').AsString)));
DestUsr_tl := 1;
My_StrCopy(trim(CDS1.FieldByName('UserNumber').AsString),Dest_terminal_Id,Length(trim(CDS1.FieldByName('UserNumber').AsString)));
AShortMessage := trim(self.CDS1.FieldByName('MESSAGE').AsString);
if CMPP_SUBMIT.Msg_Fmt = 0 then AShortMessage := Copy(AShortMessage,1,159)
else AShortMessage := Copy(AShortMessage,1,140);
if My_CanPackBadWord = '1' then AShortMessage := self.My_PackBadWord(AShortMessage);
Msg_Length := Length(AShortMessage);
My_StrCopy(AShortMessage,Msg_Content,Length(AShortMessage));
end;
self.CMPP2_SUBMIT(CMPP_SUBMIT,CDS1.FieldByName('SUBMITID').AsString);
self.CDS1.Delete;
Application.ProcessMessages;
self.My_DelayTime;
end;
finally
self.CDS1.Close;
self.Query1.Close;
(Sender AS TTimer).Enabled := true;
end;
end;
procedure TMainForm.ADOConnAfterConnect(Sender: TObject);
begin
self.MainStatusBar.Panels.Items[0].Text := '数据库:已连接';
self.MainStatusBar.Update;
end;
procedure TMainForm.ADOConnAfterDisconnect(Sender: TObject);
begin
self.MainStatusBar.Panels.Items[0].Text := '数据库:已断开';
self.MainStatusBar.Update;
end;
procedure TMainForm.ADOConnBeforeConnect(Sender: TObject);
begin
self.MainStatusBar.Panels.Items[0].Text := '数据库:正在连接,请稍候...';
self.MainStatusBar.Update;
end;
procedure TMainForm.ADOConnBeforeDisconnect(Sender: TObject);
begin
self.MainStatusBar.Panels.Items[0].Text := '数据库:正在断开,请稍候...';
self.MainStatusBar.Update;
end;
procedure TMainForm.SpeedButton4Click(Sender: TObject);
begin
self.InfoMemo.Lines.Add('');
My_WriteInfo('-------------A:中国移动通讯CMPP2.0 SP客户端------------');
My_WriteInfo(' 当前版本 : 2.1 0119');
My_WriteInfo('-----------------------------------------------------');
self.InfoMemo.Lines.Add('');
end;
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
self.Button_Shut.Click;
end;
procedure TMainForm.ApplicationEvents_XException(Sender: TObject;
E: Exception);
begin
if E Is ESocketError then
begin
ApplicationEvents_X.CancelDispatch;
end;
end;
procedure TMainForm.Timer_CheckNetTimer(Sender: TObject);
begin
if (not self.My_LoginFlag) OR (not self.CMPP2Socket.Active) then
//if (not self.CMPP2Socket.Active) then
begin
self.Button_Start.Click;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -