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

📄 mainunit.pas

📁 CMPP2版短信平台行业版,运营商支持下400条/S
💻 PAS
📖 第 1 页 / 共 3 页
字号:
        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 + -