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

📄 deliverunit.pas

📁 联通短信平台,1,3版稳定版400条/s
💻 PAS
📖 第 1 页 / 共 2 页
字号:
  end;
end;

function  TDeliverForm.PackBadWord(Msg:String):String;
var
  i :integer;
begin
  for i:=0 to BadWordList.Count - 1 do
  begin
    Msg := StringReplace(Msg,BadWordList[i],'#',[rfReplaceAll]);
  end;
  Result := Msg;
end;

function TDeliverForm.ConnectToDB():boolean;
var
  ini :TIniFile;
begin
  try
    ini := TIniFile.Create(self.GetIniConfigFile);
    try
    
      self.ADOConn.Close;
      self.ADOConn.ConnectionString := ini.ReadString('Option','AdoConn','');
      self.ADOConn.Open;
      self.MainStatusBar.Panels.Items[0].Text := '数据库:已连接';
      self.WriteInfo('数据库连接成功.');

      //init DB StoredProc
      Result := true;
    except
      self.MainStatusBar.Panels.Items[0].Text := '数据库:连接失败';
      self.WriteInfo('数据库连接失败.');
      Result := false;
    end;
  finally
    FreeAndNil(Ini);
  end;
end;

function TDeliverForm.GetIniConfigFile():String;
begin
  Result := ExtractFilePath(Application.ExeName) + 'SGIP12.ini';
end;

procedure TDeliverForm.FormCreate(Sender: TObject);
begin
  Application.Title := '杭州亚大通讯--联通发送通讯平台 V2.1 0119';
  self.Caption := Application.Title;
  self.LoadParameters;
  F_Sequence_Number := 1;

  BadWordList := TStringList.Create;

  F_DeliverCount := 0 ;
  F_ReportCount := 0 ;
end;

procedure TDeliverForm.Button_StartClick(Sender: TObject);
begin
  if self.SGIPServerSocket.Active then
  begin
    self.CloseSocket;
  end;

  if self.ADOConn.Connected then  self.ADOConn.Close;
  self.InfoMemo.Clear;
  if not self.ConnectToDB() then Abort;
  if not self.OpenSocket() then Abort;
end;

procedure TDeliverForm.Button_ShutClick(Sender: TObject);
begin
  if self.SGIPServerSocket.Active then
  begin
    self.CloseSocket;
    self.MainStatusBar.Panels.Items[1].Text := '服务:未启动';
  end;  
  self.ADOConn.Close;
end;

function TDeliverForm.ConvertMsgID(Msg_ID: PChar):string;
var
  High4, Low4: Cardinal;
  Month, Day, Hour, Minute, Second, GateWayID, SID: Word;
begin
  CopyMemory(@High4, @Msg_ID[0], 4);
  CopyMemory(@Low4, @Msg_ID[4], 4);
  High4 := ntohl(High4);
  Low4 := ntohl(Low4);
  Month := (High4 shr 28) and $0F;
  Day :=   (High4 shr 23) and $1F;
  Hour :=   (High4 shr 18) and $1F;
  Minute := (High4 shr 12) and $3F;
  Second := (High4 shr 6) and $3F;
  SID := Low4  and $FF;
  GateWayID := (Low4 shr 16) and $FF + (((High4) and $3F) * 65536);
  Result := Format('%.2d.%.2d.%.2d.%.2d.%.2d.%d.%d', [Month, Day, Hour, Minute,
    Second, GateWayID, SID]);
end;

procedure TDeliverForm.SpeedButton3Click(Sender: TObject);
begin
  WinExec(PChar('notepad.exe ' + self.GetIniConfigFile),SW_SHOW);
end;

procedure TDeliverForm.InfoMemoChange(Sender: TObject);
begin
  if self.InfoMemo.Lines.Count > F_ClearInfoLineCount then
  begin
    self.InfoMemo.Clear;
  end;
end;

procedure TDeliverForm.ADOConnAfterConnect(Sender: TObject);
begin
  self.MainStatusBar.Panels.Items[0].Text := '数据库:已连接';
  self.MainStatusBar.Update;
end;

procedure TDeliverForm.ADOConnAfterDisconnect(Sender: TObject);
begin
  self.MainStatusBar.Panels.Items[0].Text := '数据库:已断开';
  self.MainStatusBar.Update;
end;

procedure TDeliverForm.ADOConnBeforeConnect(Sender: TObject);
begin
  self.MainStatusBar.Panels.Items[0].Text := '数据库:正在连接,请稍候...';
  self.MainStatusBar.Update;
end;

procedure TDeliverForm.ADOConnBeforeDisconnect(Sender: TObject);
begin
  self.MainStatusBar.Panels.Items[0].Text := '数据库:正在断开,请稍候...';
  self.MainStatusBar.Update;
end;

procedure TDeliverForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  self.Button_Shut.Click;
end;

procedure TDeliverForm.ApplicationEvents_XException(Sender: TObject;
  E: Exception);
begin
  if E Is ESocketError then
  begin
    ApplicationEvents_X.CancelDispatch;
  end;

end;

procedure TDeliverForm.SGIPServerSocketClientError(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
  ErrorCode := -1;
end;

procedure TDeliverForm.SGIPServerSocketListen(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  self.MainStatusBar.Panels.Items[1].Text := '接收服务已启动...';
end;

procedure TDeliverForm.SGIPServerSocketClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  self.MainStatusBar.Panels.Items[2].Text := '网关:' + Socket.RemoteAddress + ' 已连接';
end;

procedure TDeliverForm.SGIPServerSocketClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  self.MainStatusBar.Panels.Items[2].Text := '网关:' + Socket.RemoteAddress + ' 已断开';
end;

procedure TDeliverForm.SGIPServerSocketClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  SGIPHead : TSGIPHead;
  SGIPBind_Resp : TSGIPBind_Resp;
  SGIPUnBind_Resp : TSGIPUnBind_Resp;
  Deliver : TDeliver;
  DeliverHeaderSection : TDeliverHeaderSection;
  SGIPDeliver_Resp : TSGIPDeliver_Resp;
  Report : TReport;
  SGIPReport_Resp : TSGIPReport_Resp;
  StrInfo :String;
begin
  try
    FillChar(SGIPHead,SizeOf(TSGIPHead),0);
    if  Socket.ReceiveBuf(SGIPHead,SizeOf(SGIPHead)) <> SizeOf(SGIPHead)  then
    begin
      Exit;
    end;
  except
    On E: Exception do
    begin
      self.WriteInfo(E.Message);
    end;
  end;

  try
    case WinSock.ntohl(SGIPHead.CommandId) of
      SGIP12_Protocol.SGIP_BIND :
      begin
        FillChar(SGIPBind_Resp,SizeOf(SGIPBind_Resp),0);
        SGIPBind_Resp.Head.MessageLength := WinSock.htonl(SizeOf(SGIPBind_Resp));
        SGIPBind_Resp.Head.CommandId := WinSock.htonl(SGIP12_Protocol.SGIP_BIND_RESP);
        SGIPBind_Resp.Head.SNumber1 := SGIPHead.SNumber1;
        SGIPBind_Resp.Head.SNumber2 := SGIPHead.SNumber2;
        SGIPBind_Resp.Head.SNumber3 := SGIPHead.SNumber3;
        SGIPBind_Resp.Bind_Resp.Result := 0;
        if Socket.SendBuf(SGIPBind_Resp,SizeOf(SGIPBind_Resp)) = SizeOf(SGIPBind_Resp) then
        begin
          //self.WriteInfo('网关' + Socket.RemoteAddress + '登陆本地短信接收服务成功。');
          ;
        end else
        begin
          self.WriteInfo('网关' + Socket.RemoteAddress + '登陆本地短信接收服务失败。');
        end;
        Exit;
      end;

      SGIP12_Protocol.SGIP_UNBIND :
      begin
        FillChar(SGIPUnBind_Resp,SizeOf(SGIPUnBind_Resp),0);
        SGIPUnBind_Resp.Head.MessageLength := WinSock.htonl(SizeOf(SGIPUnBind_Resp));
        SGIPUnBind_Resp.Head.CommandId := WinSock.htonl(SGIP12_Protocol.SGIP_UNBIND_RESP);
        SGIPUnBind_Resp.Head.SNumber1 := SGIPHead.SNumber1;
        SGIPUnBind_Resp.Head.SNumber2 := SGIPHead.SNumber2;
        SGIPUnBind_Resp.Head.SNumber3 := SGIPHead.SNumber3;
        if Socket.SendBuf(SGIPUnBind_Resp,SizeOf(SGIPUnBind_Resp)) = SizeOf(SGIPUnBind_Resp) then
        begin
          self.WriteInfo('网关' + Socket.RemoteAddress + '退出本地短信接收服务成功。');
          ;
        end else
        begin
          self.WriteInfo('网关' + Socket.RemoteAddress + '退出本地短信接收服务失败。');
        end;
        Exit;
      end;

      SGIP12_Protocol.SGIP_DELIVER :
      begin
        FillChar(Deliver,SizeOf(Deliver),0);
        FillChar(SGIPDeliver_Resp,SizeOf(SGIPDeliver_Resp),0);
        FillChar(DeliverHeaderSection,Sizeof(DeliverHeaderSection),0);

        //Socket.ReceiveBuf(Deliver,WinSock.htonl(SGIPHead.MessageLength) - SizeOf(SGIPHead));

        Socket.ReceiveBuf(DeliverHeaderSection,SizeOf(DeliverHeaderSection));
        Socket.ReceiveBuf(Deliver.MessageContent,WinSock.ntohl(DeliverHeaderSection.MessageLength));
        Socket.ReceiveBuf(Deliver.Reserver,SizeOf(Deliver.Reserver));



        StrPCopy(Deliver.UserNumber,DeliverHeaderSection.UserNumber);
        StrPCopy(Deliver.SPNumber,DeliverHeaderSection.SPNumber);
        Deliver.TP_pid := DeliverHeaderSection.TP_pid;
        Deliver.TP_udhi := DeliverHeaderSection.TP_udhi;
        Deliver.MessageCoding := DeliverHeaderSection.MessageCoding;
        Deliver.MessageLength := DeliverHeaderSection.MessageLength;


        SGIPDeliver_Resp.Head.MessageLength := WinSock.htonl(SizeOf(SGIPDeliver_Resp));
        SGIPDeliver_Resp.Head.CommandId := WinSock.htonl(SGIP12_Protocol.SGIP_DELIVER_RESP);
        SGIPDeliver_Resp.Head.SNumber1 := SGIPHead.SNumber1;
        SGIPDeliver_Resp.Head.SNumber2 := SGIPHead.SNumber2;
        SGIPDeliver_Resp.Head.SNumber3 := SGIPHead.SNumber3;
        SGIPDeliver_Resp.Deliver_Resp.Result := 0;
        Socket.SendBuf(SGIPDeliver_Resp,SizeOf(SGIPDeliver_Resp));
      //  self.WriteInfo('手机:' + String(Deliver.UserNumber)+'回包');
        ReceiveThreadUnit.DeliverThread.Create(false,Deliver,self.ADOConn.ConnectionString);
        StrInfo := '手机:' + String(Deliver.UserNumber) + ' ';
        StrInfo := StrInfo + 'SP号:' + String(Deliver.SPNumber) + ' ';
        StrInfo := StrInfo + '短信长{' + IntToStr(WinSock.ntohl(Deliver.MessageLength)) + '}';
        self.WriteInfo(StrInfo);
        F_DeliverCount := F_DeliverCount + 1;
        self.MainStatusBar.Panels.Items[3].Text := '接收短信数 ' + IntToStr(F_DeliverCount) + ' 条';
      end;

      SGIP12_Protocol.SGIP_REPORT :
      begin
        FillChar(Report,SizeOf(Report),0);
        FillChar(SGIPReport_Resp,SizeOf(SGIPReport_Resp),0);
        Socket.ReceiveBuf(Report,WinSock.htonl(SGIPHead.MessageLength) - SizeOf(SGIPHead));

        SGIPReport_Resp.Head.MessageLength := WinSock.htonl(SizeOf(SGIPReport_Resp));
        SGIPReport_Resp.Head.CommandId := WinSock.htonl(SGIP12_Protocol.SGIP_REPORT_RESP);
        SGIPReport_Resp.Head.SNumber1 := SGIPHead.SNumber1;
        SGIPReport_Resp.Head.SNumber2 := SGIPHead.SNumber2;
        SGIPReport_Resp.Head.SNumber3 := SGIPHead.SNumber3;
        SGIPReport_Resp.Report_Resp.Result := 0;
        Socket.SendBuf(SGIPReport_Resp,SizeOf(SGIPReport_Resp));
        ReceiveThreadUnit.ReportThread.Create(false,Report,self.ADOConn.ConnectionString);

        StrInfo :=           '手机:' + String(Report.UserNumber) + ',';
        StrInfo := StrInfo + '状态:' + IntToStr(Report.State) + ',';
        StrInfo := StrInfo + '错误:' + IntToStr(Report.ErrorCode) +',';
        StrInfo := StrInfo + IntToStr(WinSock.ntohl(Report.SequenceNumber1)) + ',';
        StrInfo := StrInfo + IntToStr(WinSock.ntohl(Report.SequenceNumber2)) + ',';
        StrInfo := StrInfo + IntToStr(WinSock.ntohl(Report.SequenceNumber3)) + ' ';


        self.WriteInfo(StrInfo);
        F_ReportCount := F_ReportCount + 1;
        self.MainStatusBar.Panels.Items[4].Text := '接收状态报告 ' + IntToStr(F_ReportCount) + ' 条';
      end;

    end;
  except
    On E : Exception do
    begin
      self.WriteInfo(E.Message);
    end;
  end;
end;

procedure TDeliverForm.SpeedButton4Click(Sender: TObject);
begin
  Application.MessageBox('杭州亚大通讯--联通发送通讯平台 V2.1 0119', PChar(Application.Title), MB_OK+MB_ICONASTERISK+MB_DEFBUTTON1+MB_APPLMODAL);
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -