📄 adgsm.pas
字号:
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 + -