⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 u_ctdeliver.pas

📁 电信网关平台(V3.0)
💻 PAS
📖 第 1 页 / 共 3 页
字号:
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 + -