📄 u_ctdeliver.pas
字号:
begin
Error := SocketError;
SocketError := 0;
DCanExit := True;
StatuTxt := '【' + datetimetostr(now) + '】(MO)上行链路发生网络故障' + inttostr(Error) + ',等待' + inttostr(RetryTime div 1000) + '秒再次登陆...';
synchronize(showstatu);
LogList.AddLog('10' + StatuTxt);
inc(MO_Warnning);
if MO_Warnning > 10 then ErrWarnning := TWarnning.create;
HadLogin := False;
sleep(RetryTime);
end;
procedure TCPCTDeliver.MO_ActiveTest_Resp(CTsequence: Longword);
var
spActiveTest_Resp: TSMGPHead;
begin
FillChar(spActiveTest_Resp, sizeof(TSMGPHead), 0);
spActiveTest_Resp.SequenceID := HostToNet(CTsequence);
spActiveTest_Resp.PacketLength := HostToNet(sizeof(TSMGPHead));
spActiveTest_Resp.RequestID := HostToNet(Active_test_resp);
if CTDeliver.Active then
if sizeof(TSMGPHead) = CTDeliver.SendBuf(spActiveTest_Resp, sizeof(TSMGPHead)) then
begin
StatuTxt := '【' + datetimetostr(now()) + '】SP-->CT(MO)ActiveTest_Resp SP回复上行链路正常... ' + inttostr(CTsequence);
synchronize(showstatu);
end;
end;
procedure TCPCTDeliver.upmemo;
begin
if SMGPGateWay.MeMO1.Lines.count > 500 then SMGPGateWay.MeMO1.Clear;
if SMGPGateWay.N3.Checked then
SMGPGateWay.MeMO1.Lines.Add(Statustr + #13#10);
SMGPGateWay.StatusBar1.Panels[1].Text := 'T: ' + inttostr(CTD_cou);
SMGPGateWay.StatusBar1.Refresh;
end;
procedure TCPCTDeliver.showError;
begin
if SMGPGateWay.MeMO1.Lines.count > 500 then SMGPGateWay.MeMO1.Clear;
if SMGPGateWay.N2.Checked then
SMGPGateWay.MeMO1.Lines.Add(StatustrE + #13#10);
end;
procedure TCPCTDeliver.showstatu;
begin
if SMGPGateWay.MeMO3.Lines.count > 1000 then SMGPGateWay.MeMO3.Clear;
SMGPGateWay.MeMO3.Lines.Add(StatuTxt);
end;
procedure TCPCTDeliver.AddCou;
begin
if CTD_cou > 2147483600 then CTD_cou := 1;
inc(CTD_cou);
end;
procedure TCPCTDeliver.AddsSeq;
begin
if dSequence >= 4294967200 then dSequence := 1;
dSequence := dSequence + 1;
end;
procedure TCPCTDeliver.WriteReport(const Msgid: array of char; const Source: array of char);
var
CTReport: PReport;
buff: array[0..19] of char;
//temp: string;
begin
FillChar(buff, sizeof(buff), 0);
new(CTReport);
move(Source[3], buff, 10);
CTReport^.id := BCDToHex(buff, 10); // 状态报告对应原短消息回馈报告中的MsgID
FillChar(buff, sizeof(buff), 0);
move(Source[18], buff, 3);
CTReport^.sub := buff; // sub
FillChar(buff, sizeof(buff), 0);
move(Source[28], buff, 3);
CTReport^.dlvrd := buff; // dlvrd
FillChar(buff, sizeof(buff), 0);
move(Source[44], buff, 10);
CTReport^.Submit_date := buff; // Submit_date
FillChar(buff, sizeof(buff), 0);
move(Source[65], buff, 10);
CTReport^.done_date := buff; // done_date
FillChar(buff, sizeof(buff), 0);
move(Source[81], buff, 7);
CTReport^.Stat := buff; // Stat
FillChar(buff, sizeof(buff), 0);
move(Source[93], buff, 3);
CTReport^.Err := buff; // Err
FillChar(buff, sizeof(buff), 0);
{move(Source[101], buff, 3); // Txt前3个byte
temp := buff;
FillChar(buff, sizeof(buff), 0);
move(Source[108], buff, 12); //后12个BYTE
temp := temp + buff;
CTReport^.Txt := temp; }
move(Source[102], buff, 20);
CTReport^.Txt := buff;
ReportList.Add(CTReport);
Statustr := '[' + datetimetostr(now) + ']Report:';
Statustr := Statustr +'<MsgID>'+CTReport^.id + #32;
Statustr := Statustr +'<Stat>'+ CTReport^.Stat + #32;
Statustr := Statustr +'<Err>'+ CTReport^.Err;
Statustr := Statustr +'<Submit_date>'+CTReport^.Submit_date + #32;
Statustr := Statustr +'<done_date>'+ CTReport^.done_date + #32;
LogList.AddLog('04' + Statustr);
synchronize(upmemo);
end;
//===============================================================================
procedure TCPCTDeliver.showDeliver(aDeliver: TCTDeliver;const LinkID:string);
begin
Statustr := '[' + datetimetostr(now) + ']Deliver:';
Statustr := Statustr +'<Msgid>' +BCDToHex(aDeliver.Msgid, sizeof(aDeliver.Msgid)) + #32;
//Statustr := Statustr + inttostr(aDeliver.IsReport) + #32;
Statustr := Statustr +'<SrcTermID>' + aDeliver.SrcTermID + #32;
Statustr := Statustr +'<DestTermID>' +aDeliver.DestTermID + #32;
Statustr := Statustr +'<MsgFormat>' + inttostr(aDeliver.MsgFormat) + #13#10;
Statustr := Statustr +'<LinkID>' +LinkID + #32;
Statustr := Statustr +'<MsgContent>' + aDeliver.MsgContent;
LogList.AddLog('00' + Statustr);
synchronize(upmemo);
end;
//===========================================================================
procedure TCPCTDeliver.SaveToDeliverList(aDeliver: TCTDeliver;const LinkID:string); //短信
var
pDeliver: PCTDeliver;
begin
new(pDeliver);
pDeliver^.Msgid := BCDToHex(aDeliver.Msgid, sizeof(aDeliver.Msgid));
pDeliver^.IsReport := aDeliver.IsReport;
pDeliver^.MsgFormat := aDeliver.MsgFormat;
pDeliver^.RecvTime := aDeliver.RecvTime;
pDeliver^.SrcTermID := aDeliver.SrcTermID;
pDeliver^.DestTermID := aDeliver.DestTermID;
pDeliver^.MsgLength := aDeliver.MsgLength;
if aDeliver.MsgFormat = 8 then {Unicode}
pDeliver.MsgContent := Ucs2ToString(aDeliver.MsgContent)
else if (aDeliver.MsgFormat = 15) or (aDeliver.MsgFormat = 0) then
pDeliver^.MsgContent := aDeliver.MsgContent
else if aDeliver.IsReport = 9 then
begin {用户拆机、停机消息}
pDeliver^.MsgContent := copy(aDeliver.MsgContent, 1, 12);
pDeliver^.MsgContent := pDeliver^.MsgContent + aDeliver.MsgContent[17];
end;
pDeliver^.LinkID := LinkID;
DeliverList.Add(pDeliver); //放入DELIVER队列中
end;
//=================================================================================
procedure TCPCTDeliver.SP_Deliver_Resp(MSg_id: array of char; SequenceID: Longword);
var
SPDeliver_Resp: TDeliver_Resp; // 上行回馈
Msgid: string;
begin
FillChar(SPDeliver_Resp, sizeof(TDeliver_Resp), 0);
SPDeliver_Resp.Head.PacketLength := HostToNet(sizeof(TDeliver_Resp));
SPDeliver_Resp.Head.RequestID := HostToNet(Deliver_resp);
SPDeliver_Resp.Head.SequenceID := HostToNet(SequenceID);
move(MSg_id, SPDeliver_Resp.body.Msgid, 10);
Msgid := BCDToHex(MSg_id, 10);
SPDeliver_Resp.body.Status := HostToNet(0);
if CTDeliver.Connected then
if sizeof(TDeliver_Resp) = CTDeliver.SendBuf(SPDeliver_Resp, sizeof(TDeliver_Resp)) then
begin
Statustr := '[' + datetimetostr(now()) + ']Deliver_Resp:' + Msgid;
synchronize(upmemo);
end;
end;
procedure TCPCTDeliver.ReceiveHead;
var
Head: TSMGPHead;
CTRequestID: Longword;
CTsequence: Longword;
Len: Longword;
begin
FillChar(Head, sizeof(TSMGPHead), 0);
if CTDeliver.Connected then
if CTDeliver.WaitForData(timeout) then
if sizeof(TSMGPHead) = CTDeliver.ReceiveBuf(Head, sizeof(TSMGPHead)) then
begin
Active_test_time := now;
CTRequestID := winsock.Htonl(Head.RequestID); //请求命令
Len := winsock.Htonl(Head.PacketLength); //消息长度
CTsequence := winsock.Htonl(Head.SequenceID); //序列号
ReceiveBody(CTRequestID, CTsequence, Len);
end;
end;
procedure TCPCTDeliver.ReceiveDeliver(CTsequence,
Len: Longword);
var
xDeliver: TCTDeliver;
isRep: byte;
LinkID, aStr:string;
SubmitMsgType,DealResult:byte;
Msg:string;
pos1,pos2:integer;
begin
FillChar(xDeliver, sizeof(TCTDeliver), 0);
ReceiveDeliverTime := now;
Counter := 0;
if 69 = CTDeliver.ReceiveBuf(xDeliver, 69) then
if xDeliver.MsgLength = CTDeliver.ReceiveBuf(xDeliver.MsgContent, xDeliver.MsgLength) then
if 8 = CTDeliver.ReceiveBuf(xDeliver.Reserve, 8) then
begin //再收可选参数
if (len - sizeof(CTSMSHeader) > 77+ xDeliver.MsgLength) then
begin //接收可选参数,输入参数是 可选参数总长度, LinkID, DealResult==处理结果
SubmitMsgType := ReceiveTLVMsg(len - (89 + xDeliver.MsgLength), LinkID, DealResult);
end;
SP_Deliver_Resp(xDeliver.Msgid, CTsequence); //上行短信回馈CP-->CT
isRep := xDeliver.IsReport;
if isRep = 1 then {//状态报告}
WriteReport(xDeliver.Msgid, xDeliver.MsgContent)
else
begin {//正常的上行短信/或用户拆机停机 信息}
case SubmitMsgType of
13://需要回复下行, SubmitMsgType = 15,LinkID也需要, 内容体为"DG+空格+业务代码+双空格+受惠用户的终端号码
//还需要再把短信内容只取用户输入的内容部分
begin //正向 定制,取消回复
AddSyncOrdCelMsg(xDeliver, LinkID);//写入submit队列,
//上行短信内容改为用户输入内容
msg:=Copy(xDeliver.MsgContent,0, xDeliver.MsgLength);
FillChar(xDeliver.MsgContent,sizeof(xDeliver.MsgContent),0);
StrpCopy(xDeliver.MsgContent, GetInstruct(msg));
if (FServiceID<>'') and (FServiceID<>'00000') then
begin
aStr := GetAccessNoByServiceID(FServiceID);
StrpCopy(xDeliver.DestTermID, aStr);
end;
end;
15://反向--定制,取消回复,
begin //重新整理格式 ReSyc+1个空格+上内容+1个空格+DealReslt
msg:=Copy(xDeliver.MsgContent,0, xDeliver.MsgLength);
FillChar(xDeliver.MsgContent,sizeof(xDeliver.MsgContent),0);
StrpCopy(xDeliver.MsgContent, 'RESYC '+ msg + #32 + inttostr(DealResult));
end;
end;
SaveToDeliverList(xDeliver, LinkID);
synchronize(AddCou);
showDeliver(xDeliver,LinkID);
end;
{try
fs:=Tfilestream.create( 'd:\Stream\D'+formatdatetime('ddhhnnss',now)+'.txt',fmCreate );
fs.WriteBuffer(xDeliver,sizeof(xDeliver));
finally
fs.free;
end;}
end;
end;
function TCPCTDeliver.GetAccessNoByServiceID(aServiceID: String): String;
var
i, iPos : Integer;
aStr : String;
begin
Result := '';
if aServiceID='' then Exit;
if (AccessNoStrList=nil) or (AccessNoStrList.Count<1) then Exit;
For i := 0 to AccessNoStrList.Count - 1 do
begin
aStr := AccessNoStrList.Strings[i];
if AnsiPos(UpperCase(aServiceID), UpperCase(aStr))>0 then
begin
iPos := AnsiPos(':',aStr);
Result := MidStr(aStr,iPos+1,Length(aStr)-iPos);
Exit;
end;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -