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

📄 adgsm.pas

📁 很好的手机发短信的例子。含GSM群发机设计原理和使用说明。还有详细代码
💻 PAS
📖 第 1 页 / 共 5 页
字号:
      end;
}      
      // Change message to string form
      try
        TheMessage := PDUToStringCN(U);
      except
        TheMessage := '';
      end;

//      if MessageLength = Length(TheMessage) then
        // Store message
        TempSMSMessage.FMessage := TheMessage;
    end; // else our PDU should handle longer messages
//    if (TempSMSMessage<>nil) then
//    begin
      if (TempSMSMessage.FMessageIndex = FNeedNewMessage) then
    // if new message notify wanted, then assign it
        FRecNewMess := TempSMSMessage.Message;
      MessageStore.AddObject(TempSMSMessage.TimeStampStr, TempSMSMessage);
      Result := Pos('+CMGL:', S) > 0;
//    end
//    else
//      Result := false;
  end;

  { Parse a message }
  function ParseAMessage : Boolean;
  begin
    if Pos (#13#10, S) = 1 then
      GetNextField (#13#10);
    if Pos('+CMGL:', S) = 1 then
    begin
      // first line of the message
      // format is +CMGL: Index, status, address, address name, timestamp
      TempSMSMessage := TApdSMSMessage.Create;
      S := Copy(S, Pos(':', S) + 1, Length(S));
      // extract the index number
      TempSMSMessage.FMessageIndex := GSMStrToInt(GetNextField(','));
      // extract the status
      STemp := GetNextField( ',' );
      if STemp = 'STO UNSENT' then
        TempSMSMessage.FStatus := ssUnsent
      else if STemp = 'STO SENT' then
        TempSMSMessage.FStatus := ssSent
      else if STemp = 'ALL' then
        TempSMSMessage.FStatus := ssAll
      else if STemp = 'REC UNREAD' then
        TempSMSMessage.FStatus := srUnread
      else if STemp = 'REC READ' then
        TempSMSMessage.FStatus := srRead
      else TempSMSMessage.FStatus := ssUnknown;                          {!!.01}

      // Read the address field with quotes (if any)
      TempSMSMessage.FAddress := GetNextField( ',' );
      // Name (??) field  followed by ,
      TempSMSMessage.FName := GetNextField( ',' );
      // DateTime Field followed by ,
      TempSMSMessage.FTimeStampStr := GetNextField( ',' );
      if TempSMSMessage.FTimeStampStr = '' then
        TempSMSMessage.FTimeStampStr := '<no timestamp>';
      // Message Type   followed by ,
      STemp := GetNextField( ',' );
      // Message Length followed by #13#10
      STemp := GetNextField( #13#10 );
      // Message        followed by #13#10
      TempSMSMessage.Message := GetNextField( #13#10 );
    end else begin
      // Message more than 1 line???
      TempSMSMessage.Message := TempSMSMessage.Message + #13#10 +
                      GetNextField( #13#10 );
    end;
    if TempSMSMessage.FMessageIndex = FNeedNewMessage then               {!!.06}
        FRecNewMess := TempSMSMessage.Message;                           {!!.06}
    MessageStore.AddObject(TempSMSMessage.TimeStampStr, TempSMSMessage);
    Result := Pos('+CMGL:', S) > 0;                                      {!!.04}
  end;

begin
  //State machine response handle
  case FGSMState of

    gsConfig:
    begin
      S := ResponseStr;                                       {!!.PDU}
      inc(CmdIndex);
      STemp := '';                                            {!!.PDU}
      if CmdIndex > High(GSMConfigAvail) then
      begin
          // generate the OnComplete event, we're done configuring
        ResponseStr := '';                                     {!!.02}
        if not FQuickConnect then
        begin                                                  {!!.02}
          // State set to gsNone in PostMessage below
          //FGSMState := gsNone;                        {!!.02}{!!.06}
          // PostMessage calls ListAllMessages
          PostMessage(FHandle, ApdGSMResponse, 1,0);           {!!.06}
          //ListAllMessages;                            {!!.02}{!!.06}
        end;                                                   {!!.02}
        FGSMState := gsConfig;                                 {!!.02}
        if Assigned(FOnGSMComplete) then                       {!!.02}
          FOnGSMComplete(Self, FGSMState, FErrorCode);         {!!.02}
        FGSMState := gsNone;
        FConfigList := False;                                  {!!.02}
        ResponseStr := '';
      end else
      begin
        // send the next command
        ResponsePacket.StartString := GSMConfigResponse[CmdIndex];
        ResponsePacket.EndString := #13;
        ResponsePacket.Enabled := True;
        //DelayTicks(4, True);                                 {!!.04}
        STemp := GSMConfigAvail[CmdIndex];                     {!!.06}
        // Detect, PDU, or Text
        if STemp = '+CMGF=' then
        begin                        {!!.PDU}
          STemp := Copy(S, Pos('(',S)+1, Length(S));          {!!.PDU}
          if Length(STemp) < 3 then
          begin                     {!!.PDU}
            if (FGSMMode = gmPDU) and (STemp[1] = '0') then   {!!.PDU}
              SetPDUMode(True)                                {!!.PDU}
            else                                              {!!.PDU}
              if (STemp[1] = '1') then                        {!!.PDU}
                SetPDUMode(False);                            {!!.PDU}
          end else begin                                      {!!.PDU}
            if (FGSMMode = gmPDU) and (STemp[3] = '1') then   {!!.PDU}
              SetPDUMode(True)                                {!!.PDU}
            else                                              {!!.PDU}
              SetPDUMode(False);                              {!!.PDU}
          end;                                                {!!.PDU}
          STemp := GSMConfigAvail[CmdIndex];                  {!!.PDU}
        end;                                                  {!!.PDU}
        if STemp = '+CMGF=' then
        begin                                                 {!!.PDU}
          if FPDUMode then                                    {!!.PDU}
            STemp := STemp + '0'                              {!!.PDU}
          else                                                {!!.PDU}
            STemp := STemp + '1';                             {!!.PDU}
          if QuickConnect then                                {!!.PDU}
            CmdIndex := High(GSMConfigAvail);                 {!!.PDU}
        end;                                                  {!!.PDU}
        if Copy(STemp, 1, 6) = '+CSMP=' then
        begin                                                  {!!.06}
          if NotifyOnNewMessage then                           {!!.06}
            STemp := '+CSMP= 32' +                             {!!.06}
                          Copy(STemp, 7, Length(STemp))        {!!.06}
          else                                                 {!!.06}
            STemp := '+CSMP= 17' +                             {!!.06}
                          Copy(STemp, 7, Length(STemp));       {!!.06}
        end;                                                   {!!.06}
        FComPort.Output := 'AT' + STemp + #13;
      end;
    end;

    gsSend:
    begin
        inc(CmdIndex);
        if CmdIndex > High(GSMSendMessageResponse) then
        begin
          // Sent message - see if another message is ready
          if Assigned(FOnNextMessage) then
          begin
            MsgRdy := False;
            FOnNextMessage(Self, FErrorCode, MsgRdy);
            if MsgRdy then
            begin
              { Will inc(CmdIndex) and start with the CSCA setting }
              CmdIndex := 0; // start sending over                 {!!.06}
              PostMessage(FHandle, ApdGSMResponse, 2,0);           {!!.06}
            end;
          end;
          // generate the OnComplete event, we're done
          if Assigned(FOnGSMComplete) then
          begin
            FOnGSMComplete(Self, FGSMState, FErrorCode);
          end;
          FGSMState := gsNone;
          ResponseStr := '';                                       {!!.02}
        end else
        begin
          if CmdIndex = High(GSMSendMessageCommands) - 1 then
          begin
            // send the next command
            ResponsePacket.StartString :=
                GSMSendMessageResponse[CmdIndex];
            ResponsePacket.EndString := '>'#32;
            ResponsePacket.Enabled := True;
            if FPDUMode then
            begin                                                 {!!.PDU}
              BuildPDUMessage;                                    {!!.PDU}
              STemp := IntToStr(PDULength);                       {!!.PDU}
            end
            else
            begin                                                 {!!.PDU}
              //DelayTicks(4, True);                               {!!.04}
              STemp := SMSAddress;
              if STemp = '' then
              begin                                                {!!.02}
                DoFail(secBadOperation,-8302);                     {!!.02}
                Exit;                                              {!!.02}
              end;                                                 {!!.02}
              if STemp[1] <> '"' then
                STemp := '"' + STemp + '"';                {!!.01} {!!.06}
              STemp := STemp + #13#10;
            end;
            FComPort.Output := 'AT' + GSMSendMessageCommands[CmdIndex]
                                  + STemp + #13;                   {!!.06}
          end
          else
          begin
            if CmdIndex = High(GSMSendMessageCommands) then
            begin
              ResponsePacket.StartString :=
                  GSMSendMessageResponse[CmdIndex];
              ResponsePacket.EndString := #13#10;
              ResponsePacket.Enabled := True;
              //DelayTicks(4, True);                               {!!.04}
              if FPDUMode then
              begin                                               {!!.PDU}
                STemp := FTempWriteMess;                          {!!.PDU}
              end
              else                                            {!!.PDU}
                STemp := FMessage;
              if STemp[Length(STemp)] <> #26 then
                STemp := STemp + #26;
              FComPort.Output := STemp;
            end
            else
            begin
              ResponsePacket.StartString :=
                  GSMSendMessageResponse[CmdIndex];
              ResponsePacket.Enabled := True;
              //DelayTicks(4, True);                               {!!.04}
              if GSMSendMessageCommands[CmdIndex] = '+CSCA=' then
              begin
                if (FSMSCenter <> '') and
                (GSMSendMessageCommands[CmdIndex]='+CSCA=') then
                begin
                  if FSMSCenter[1] = '"' then
                    FSMSCenter := copy(FSMSCenter, 2, Length(FSMSCenter));
                  if FSMSCenter[Length(FSMSCenter)] = '"' then     {!!.01}
                    FSMSCenter := copy(FSMSCenter, 1,              {!!.01}
                                         Length(FSMSCenter)-1);    {!!.01}
                  FComport.Output := 'AT' +
                          GSMSendMessageCommands[CmdIndex]+'"'     {!!.01}
                                     + FSMSCenter + '"' + #13
                end
                else
                begin
                  inc(CmdIndex);
                  ResponsePacket.StartString :=
                      GSMSendMessageResponse[CmdIndex];
                  ResponsePacket.EndString := '>'#32;
                  ResponsePacket.Enabled := True;
                  //DelayTicks(4, True);                           {!!.04}
                  if FPDUMode then
                  begin                                           {!!.PDU}
                    BuildPDUMessage;                              {!!.PDU}
                    S := IntToStr(PDULength);                     {!!.PDU}
                  end else
                  begin                                           {!!.PDU}
                    S := SMSAddress;
                    if S = '' then
                    begin                                          {!!.02}
                      DoFail(secBadOperation,-8302);               {!!.02}
                      Exit;                                        {!!.02}
                    end;                                           {!!.02}
                    if S[1] <> '"' then {begin}                    {!!.01}
                      S := '"' + S + '"';                          {!!.01}
                    //else                                         {!!.01}
                      //if S[2] <> '+' then                        {!!.01}
                        //S := '"+' + S + '"';                     {!!.01}
                    //end;                                         {!!.01}
                  end;                                            {!!.PDU}
                  S := S + #13;
                  FComPort.Output := 'AT' +
                             GSMSendMessageCommands[CmdIndex] + S;
                end
              end else
                FComPort.Output := 'AT' + STemp + #13;
            end
          end
        end;
        STemp := '';
      end;
    gsListAll :
    begin
      // Just sent +CMGL, successful so far, send the next command
      S := ResponseStr;
      if Length(S) > 8 then begin                            {!!.02}
        if FGSMMode = gmPDU then begin                       {!!.06}
          while ParseAPDUMessage do                          {!!.06}
            DelayTicks(1, True);                             {!!.06}
        end else                                             {!!.06}
          while ParseAMessage do                             {!!.02}
            DelayTicks(1, True);                             {!!.02}
      end;
      if FNeedNewMessage > 0 then begin                      {!!.04}
        if Assigned(FOnNewMessage) then                      {!!.04}
          FOnNewMessage
            (Self, FNeedNewMessage, FRecNewMess);            {!!.06}
        FNeedNewMessage := 0;                                {!!.04}
        FRecNewMess := '';                                   {!!.06}
      end else begin                                         {!!.04}
        if Assigned(FOnMessageList) then
          FOnMessageList(Self);
        if Assigned(FOnGSMComplete) and not FConfigList then {!!.02}
          FOnGSMComplete(Self, FGSMState, FErrorCode);
      end;
      ResponsePacket.IncludeStrings := False;
      ResponsePacket.StartCond := scString;                  {!!.02}
      FGSMState := gsNone;
      ResponseStr := '';                                     {!!.02}
    end;

    gsSendFStore :
    begin
      //Just sent +CMSS, successful so far, send the next command
      inc(CmdIndex);
      if CmdIndex > High(GSMSendMessFromStorage) then
      begin
        // generate the OnComplete event, we're done
        //FMessageStore.ClearStore;                       {!!.06}
        //Synchronize;                                    {!!.06}
        if Assigned(FOnMessageList) then
          FOnMessageList(Self);
        if Assigned(FOnGSMComplete) then
          FOnGSMComplete(Self, FGSMState, FErrorCode);
        FGSMState := gsNone;
        ResponseStr := '';                                {!!.02}
      end else
       // send the next command if there is one
        FComPort.Output := 'AT' + GSMSendMessFromStorage[CmdIndex] + #13;
   end;
   gsWrite :
   begin
     // Just sent +CMGW, successful so far, send the next command
     inc(CmdIndex);
     if CmdIndex > High(GSMWriteToMemoryCommands) then
     begin
       //FMessageStore.ClearStore;                            {!!.06}
       //Sync

⌨️ 快捷键说明

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