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

📄 adgsm.pas

📁 很好的手机发短信的例子。含GSM群发机设计原理和使用说明。还有详细代码
💻 PAS
📖 第 1 页 / 共 5 页
字号:
  DoFail(ErrorMessage, ErrorCode);                                       {!!.06}
  //raise Exception.Create('Exception ' + IntToStr(ErrorCode) + ' ' +    {!!.06}
                          //ErrorMessage);                               {!!.06}
end;

procedure TApdCustomGSMPhone.ResponseStringPacket(Sender: TObject;
  Data: string);
begin
  // Handle data from packet -State Machine-
  ResponseStr := Data;
  PostMessage(FHandle, ApdGSMResponse, 0,0);
end;

procedure TApdCustomGSMPhone.NotifyStringPacket(Sender: TObject;         {!!.02}
  Data: string);                                                         {!!.02}
var                                                                      {!!.02}
  MessageIndex : Integer;                                                {!!.02}
begin                                                                    {!!.02}
  NotifyStr := Data;                                                     {!!.02}
  if NotifyStr <> '' then
  begin                                                                  {!!.02}
    if assigned(FOnNewMessage) then
    begin                                                                {!!.02}
      NotifyStr := Copy(NotifyStr,
        Pos('",', NotifyStr) + 2, Length(NotifyStr));                    {!!.02}
      MessageIndex := StrToInt(NotifyStr);                               {!!.02}
      //if Assigned(FOnNewMessage) then begin                            {!!.02}
      { if OnNewMessage event then PostMessage to Synchronize/ListAllMessages }
      FNeedNewMessage := MessageIndex;                                   {!!.04}
      PostMessage(FHandle, ApdGSMResponse, 1,0);                         {!!.04}
//      FOnNewMessage(Self, MessageIndex, TheMessage);           {!!.02} {!!.04}
      //end;                                                     {!!.04} {!!.06}
    end;                                                                 {!!.02}
  end;                                                                   {!!.02}
end;                                                                     {!!.02}

{ issues +CMGL to list all messages with a Status of ssUnsend}
procedure TApdCustomGSMPhone.ListAllMessages;
var
  Res : Integer;
  ET : EventTimer;
begin
  if FQuickConnect then                                                  {!!.06}
    exit;                                                                {!!.06}
  if FGSMState > gsNone then
  begin
    DoFail(secSMSBusy,-8100);
    Exit;
  end;
  if not FConnected then
  begin
    { Do connection/configuration stuff }
    DoFail(secBadOperation,-8302);
    Exit;
  end;
  CmdIndex := 0;
  SetState(gsListAll);
  FMessageStore.ClearStore;
  FComPort.FlushInBuffer;
  ResponsePacket.StartCond := scAnyData;                                 {!!.02}
  //ResponsePacket.StartString := #13#10;                                {!!.02}
  //ResponsePacket.StartString := '+CMGL: ';                             {!!.02}
  ResponsePacket.EndString := #13#10'OK'#13#10;                          {!!.02}
  ResponsePacket.IncludeStrings := True;                                 {!!.04}
  ResponsePacket.Enabled := True;
  //DelayTicks(4, True);                                                 {!!.04}
  FComPort.Output := 'AT' + GSMListAllMessagesCommands[CmdIndex] +'=4'+#13#10;
  FComPort.Output := 'AT'#13;
  NewTimer(ET, ExpiredTime+500); // 60 second timer
  DelayTicks(1, True);                                                   {!!.06}
  repeat
    Sleep(SLEEPTIME);
    Res := SafeYield;
  until (FGSMState = gsNone) or (Res = wm_Quit) or TimerExpired(ET);
  if TimerExpired(ET) then
  begin
    DoFail(secSMSTimedOut,-8101);
    Exit;
  end;
end;

{ issues +CMSS to send message from storage indexed by Index }
procedure TApdCustomGSMPhone.SendFromMemory(TheIndex: Integer);
var
  Res : Integer;
  ET : EventTimer;
begin
  if FGSMState > gsNone then begin
    DoFail(secSMSBusy,-8100);
    Exit;
  end;
  if not FConnected then begin
    { Do connection/configuration stuff }
    FQuickConnect := False;
    Connect;
  end;
  CmdIndex := 0;
  SetState(gsSendFStore);
  ResponsePacket.StartString := '+CMSS: ';
  ResponsePacket.EndString := #13#10'OK';
  ResponsePacket.ComPort := FComPort;
  ResponsePacket.Enabled := True;
  //DelayTicks(4, True);                                                 {!!.04}
  FComPort.Output := 'AT' + GSMSendMessFromStorage[CmdIndex] +
                     IntToStr(TheIndex) + #13;
  NewTimer(ET, ExpiredTime); // 60 second timer
  repeat
    Sleep(SLEEPTIME);
    Res := SafeYield;
  until (FGSMState = gsNone) or (Res = wm_Quit) or TimerExpired(ET);
  if TimerExpired(ET) then
  begin
    DoFail(secSMSTimedOut,-8101);
    Exit;
  end;
end;

procedure TApdCustomGSMPhone.Dial;
var
  Res : Integer;
  ET : EventTimer;
  OutPutStr: String;
begin
  HangUp;

  if (FGSMState <> gsNone) and (FGSMState<>gsDialed)  then
  begin
    DoFail(secSMSBusy,-8100);
    Exit;
  end;
  if not FConnected then
    Connect;

  CmdIndex := 0;                                                         {!!.06}
//  ResponsePacket.EndString := #13;                                       {!!.01}
//  ResponsePacket.StartString := GSMDialResponse[CmdIndex];
//  ResponsePacket.Enabled := True;


  DialErrorPacket.Enabled := false;
  SetState(gsDialed);
  OutPutStr := GSMDialCommand[CmdIndex]+SMSAddress+';'#13;
//  OutPutStr :=GSMDialCommand[CmdIndex] + #13;
  FComPort.Output := OutPutStr;

  DelayTicks(9, True);                                                   {!!.06}

  DialErrorPacket.Enabled := true;
//  DialErrorPacket.AutoEnable

  DelayTicks(9, True);                                                   {!!.06}

//  OutPutStr :='AT' + #13;
//  FComPort.Output := OutPutStr;
//  NewTimer(ET, 1080); // 60 second timer
  NewTimer(ET, DialExpiredTime); // 60 second timer
  repeat
    Sleep(SLEEPTIME);
    Res := SafeYield;
  until  (FGSMState = gsNone) or (Res = wm_Quit) or TimerExpired(ET);
{  if FGSMState= gsNone then
  begin
    DoFail(secSMSTimedOut,-8101);
    Exit;
  end;
  SetState(gsDialed);
}
end;

procedure TApdCustomGSMPhone.HangUp;
var
  Res : Integer;
  ET : EventTimer;
  OutPutStr: String;
begin
  if (FGSMState <> gsNone) and (FGSMState<>gsDialed)  then
  begin
    DoFail(secSMSBusy,-8100);
    Exit;
  end;
  if not FConnected then
    Connect;

  CmdIndex := 0;                                                         {!!.06}
  ResponsePacket.EndString := #13;                                       {!!.01}
  ResponsePacket.StartString := GSMHangUpResponse[CmdIndex];
  ResponsePacket.Enabled := True;
  //DelayTicks(4, True);                                                 {!!.04}
  SetState(gsHangUp);
  OutPutStr :=GSMHangUpCommand[CmdIndex] + #13;
  FComPort.Output := OutPutStr;
//  NewTimer(ET, 1080); // 60 second timer
  NewTimer(ET, ExpiredTime); // 60 second timer
  repeat
    Sleep(SLEEPTIME);
    Res := SafeYield;
  until (FGSMState = gsNone) or (Res = wm_Quit) or TimerExpired(ET);
  if TimerExpired(ET) then
  begin
    DoFail(secSMSTimedOut,-8101);
    Exit;
  end;
end;

{ issues +CMGS to send message without placing the message in memory }
procedure TApdCustomGSMPhone.SendMessage;
var
  Res : Integer;
  ET : EventTimer;
  OutPutStr: String;
begin
  if FGSMState > gsNone then
  begin
    DoFail(secSMSBusy,-8100);
    Exit;
  end;
  if not FConnected then begin
    { Do connection/configuration stuff }
    Connect;
  end;
  //if FNotifyOnNewMessage then                                   {!!.01}{!!.06}
  //  CmdIndex := 0                                               {!!.01}{!!.06}
  //else                                                          {!!.01}{!!.06}
    //CmdIndex := 1; // Handled in the gsConfig                          {!!.06}
  CmdIndex := 0;                                                         {!!.06}
  ResponsePacket.EndString := #13;                                       {!!.01}
  ResponsePacket.StartString := GSMSendMessageResponse[CmdIndex];
  ResponsePacket.Enabled := True;
  //DelayTicks(4, True);                                                 {!!.04}
  SetState(gsSend);
  OutPutStr := 'AT' + GSMSendMessageCommands[CmdIndex] + #13;
  FComPort.Output := OutPutStr;
//  NewTimer(ET, 1080); // 60 second timer
  NewTimer(ET, ExpiredTime); // 60 second timer
  repeat
    Sleep(SLEEPTIME);
    Res := SafeYield;
  until (FGSMState = gsNone) or (Res = wm_Quit) or TimerExpired(ET);
  if TimerExpired(ET) then
  begin
    DoFail(secSMSTimedOut,-8101);
    Exit;
  end;
end;

procedure TApdCustomGSMPhone.SetMessage(const Value: string);
begin
  if Length(Value) > 160 then
  begin
    DoFail(secSMSTooLong,-8102);
    Exit;
  end;
  FMessage := Value;
end;

{ enables/disables new message notification (+CNMI), new messages provided
  through OnNewMessage event }
procedure TApdCustomGSMPhone.SetNotifyOnNewMessage(const Value: Boolean);
begin
  FNotifyOnNewMessage := Value;
     // Return True for then +CMTI for New Message Indications to TE
end;

procedure TApdCustomGSMPhone.DialErrorStringPacket(Sender: TObject;
  Data: string);
var
  ErrorCode : Integer;
  ErrorMessage : string;
  Temp : string;
begin
  //Display Message Service Failure Result Code
  Temp := Data;
  if Temp <> '' then                                                     {!!.06}
  begin                                                                  {!!.06}
    ErrorCode := -4012;                                                  {!!.06}
    ErrorMessage := 'No carrier';                                     {!!.06}
  end;                                                                   {!!.06}
  FGSMState := gsNone;
//  DoFail(ErrorMessage, ErrorCode);                                       {!!.06}
  //raise Exception.Create('Exception ' + IntToStr(ErrorCode) + ' ' +    {!!.06}
                          //ErrorMessage);                               {!!.06}
end;

{ TApdMessageStore }
function TApdMessageStore.AddMessage(const Dest, Msg: string): Integer;
var
  SMS : TApdSMSMessage;
begin
  SMS := nil;
  try
    SMS := TApdSMSMessage.Create;
    SMS.Message := Msg;
    SMS.Address := Dest;
    SMS.TimeStampStr := FormatDateTime('yy/mm/dd/hh:mm:ss', Now);
    SMS.Status := ssUnsent;

    Result := AddObject(SMS.TimeStampStr, SMS);
  finally
    SMS.Free;
  end;
end;

{ Clear all Messages }
procedure TApdMessageStore.Clear;
begin
 inherited;exit;
  // Clear All messages
  while Count > 0 do begin
    if Objects[Count - 1] <> nil then begin
      TApdSMSMessage(Objects[Count - 1]).Free;
      Objects[Count - 1] := nil;
    end;
    Delete(Count - 1);
  end;
end;

{ Just clears our message store - not the phone }
procedure TApdMessageStore.ClearStore;
begin
  JustClearStore := True;
  Clear;
  JustClearStore := False;
end;

{ Create Message Store }
constructor TApdMessageStore.Create(GSMPhone : TApdCustomGSMPhone);
begin
  FGSMPhone := GSMPhone;
  JustClearStore := False;
end;

{ issues +CMGD to Delete Message at Index }
procedure TApdMessageStore.Delete(PhoneIndex: Integer);
var
  I : Integer;
begin
  if (FGSMPhone.FConnected) and not(JustClearStore) then
    FGSMPhone.DeleteFromMemoryIndex(PhoneIndex)
  else
  begin
    for I := 0 to pred(Count) do

⌨️ 快捷键说明

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