📄 gsmcom.~pas
字号:
procedure TGSMSets.TestDevice;
var
i: Integer;
begin
for i:=0 to Count-1 do
begin
if GSMSet[i].state <>gsIdle then
TestGSMDevice(i);
SimpleWait(100);
end;
end;
procedure TGSMSets.TestGSMDevice(Index: Integer);
var
IniFile: TIniFile;
begin
if Assigned(FOnGSMAfterCheck) then
FOnGSMBeforeCheck(Index);
// DelayTicks(100, True);
if GSMSet[index].InThread then
exit;
FApdComPort := TApdComPort.Create(nil);
FApdComPort.AutoOpen := false;
FApdComPort.Baud := 9600;
FApdComPort.Logging := tlOff;
FApdComPort.PromptForPort := false;
FApdGSMPhone := TApdGSMPhone.Create(nil);
FApdGSMPhone.GSMMode := gmPDU;
IniFile := TIniFile.Create(WizINIFile);
FApdGSMPhone.SMSCenter := IniFile.ReadString('COMMON','SMSCenter','8613800100500');
IniFile.Free;
FApdGSMPhone.QuickConnect := true;
FApdGSMPhone.ComPort := FApdComPort;
FApdComPort.ComNumber := GSMSet[Index].Port;
GSMSet[Index].state := gsIdle;
try
FApdGSMPhone.TestConnect;
except
on e:EPortNotAssigned do
GSMSet[Index].state := gsInvalid;
on e:EApdGSMPhoneException do
begin
case e.ErrorCode of
-8100:
GSMSet[Index].state := gsBusy;
-8101:
GSMSet[Index].state := gsOutTime;
end;
end;
on e: Exception do
GSMSet[Index].state := gsInvalid;
end;
FApdComPort.Open := false;
if Assigned(FOnGSMAfterCheck) then
FOnGSMAfterCheck(Index,GSMSet[Index].state);
FApdGSMPhone.Free;
FApdComPort.Free;
end;
{ TMultiMessage }
constructor TMultiMessage.Create(AMes: String);
begin
FPrefix := '(接前)';
FSuffix := '(待续)';
FMSG := Trim(AMes);
FMessagLength := 65;
resetCount;
end;
function TMultiMessage.GetMSG(Index: Integer): String;
var
WResult: WideString;
begin
WResult := '';
WResult := WideString(String(Copy(FMSG,Index*FMessagLength+1,FMessagLength)));
Result := String(WResult);
if FCount>1 then
begin
if Index>0 then
WResult := WideString(FPrefix) + WResult;
if Index<FCount-1 then
Result := Result + WideString(FSuffix);
end
else
end;
procedure TMultiMessage.ResetCount;
begin
if (length(FMSG) mod FMessagLength)=0 then
FCount := Length(FMSG) div FMessagLength
else
FCount := (Length(FMSG) div FMessagLength) + 1;
end;
procedure TMultiMessage.SetMessagLength(const Value: Integer);
begin
if FMessagLength<>value then
begin
FMessagLength := Value;
ResetCount;
end;
end;
procedure TMultiMessage.SetPrefix(const Value: String);
begin
FPrefix := Value;
end;
procedure TMultiMessage.SetSuffix(const Value: String);
begin
FSuffix := Value;
end;
{ TGSMSendItem }
function TGSMSendItem.Clone: TGSMSendItem;
begin
Result := TGSMSendItem.Create;
Result.MobileNo := FMobileNo;
Result.GSMMode := FGSMMode;
end;
constructor TGSMSendItem.Create;
begin
FGSMMode := gsmMessage;
end;
procedure TGSMSendItem.SetGSMMode(const Value: TGSMMode);
begin
FGSMMode := Value;
end;
procedure TGSMSendItem.SetMobileNo(const Value: String);
begin
FMobileNo := Value;
end;
{ TGSMMessageItem }
function TGSMMessageItem.Clone: TGSMSendItem;
begin
Result := TGSMMessageItem.Create;
Result.MobileNo := FMobileNo;
Result.GSMMode := FGSMMode;
TGSMMessageItem(Result).SMSMessage := FSMSMessage;
end;
constructor TGSMMessageItem.Create;
begin
inherited;
FGSMMode := gsmMessage;
end;
procedure TGSMMessageItem.SetSMSMessage(const Value: String);
begin
FSMSMessage := Value;
end;
{ TGSMDialItem }
function TGSMDialItem.Clone: TGSMSendItem;
begin
Result := TGSMDialItem.Create;
Result.MobileNo := FMobileNo;
Result.GSMMode := FGSMMode;
TGSMDialItem(Result).isRepeat := FisRepeat;
TGSMDialItem(Result).RepeatCount := FRepeatCount;
TGSMDialItem(Result).DialTime := FDialTime;
end;
constructor TGSMDialItem.Create;
begin
inherited;
FGSMMode := gsmDial;
end;
procedure TGSMDialItem.SetDialTime(const Value: Integer);
begin
FDialTime := Value;
end;
procedure TGSMDialItem.SetisRepeat(const Value: Boolean);
begin
FisRepeat := Value;
end;
procedure TGSMDialItem.SetRepeatCount(const Value: Integer);
begin
FRepeatCount := Value;
end;
{ TGSMFeeCom }
function TGSMFeeCom.CheckFeeMessage(var FeeMessage: String): Boolean;
var
i: Integer;
RetryCount: Integer;
RAdress: String;
MAdress: String;
begin
Result := false;
if ListAllMessage then
for i:=0 to FApdGSMPhone.MessageStore.Count-1 do
begin
RAdress := Trim(FGSMFee.ReceveAdress);
MAdress := Trim(FApdGSMPhone.MessageStore.Messages[i].Address);
if (RAdress = MAdress) or ('0'+RAdress=MAdress) or ('86'+RAdress=MAdress) or ('860'+RAdress=MAdress) then
begin
Result := true;
FeeMessage := FApdGSMPhone.MessageStore.Messages[i].Message;
break;
end;
end;
if (not Result) and (FLastFeeString <>'') then
begin
Result := true;
FeeMessage := FLastFeeString;
end;
end;
procedure TGSMFeeCom.ClearAllMessage;
var
i: Integer;
begin
for i:=0 to FApdGSMPhone.MessageStore.Count-1 do
begin
if Terminated then
if FGSMFee.ReceveAdress = FApdGSMPhone.MessageStore.Messages[i].Address then
if FLastFeeTime<FApdGSMPhone.MessageStore.Messages[i].TimeStamp then
FLastFeeString := FApdGSMPhone.MessageStore.Messages[i].Message;
// if FApdGSMPhone.MessageStore.Messages[i].Address = FGSMFee.ReceveAdress then
FApdGSMPhone.MessageStore.Delete(FApdGSMPhone.MessageStore.Messages[i].MessageIndex);
sleep(1000);
end;
end;
procedure TGSMFeeCom.Execute;
var
GetFee: Boolean;
begin
FLastFeeTime := 0;
FLastFeeString := '';
GetFee := false;
if not DoInitGSM then
try
GetFee := RequestFee;
except
end;
FreeGSMPhone;
FGSMSet.InThread := false;
if GetFee then
PostMessage(MainForm.Handle,WM_STOPFEE,FGSMSet.index,0)
else
begin
PostMessage(MainForm.Handle,WM_STOPFEE,FGSMSet.index,1);
Synchronize(UpdateFeeError);
end;
end;
function TGSMFeeCom.ListAllMessage: Boolean;
var
i: Integer;
RetryCount: Integer;
begin
RetryCount := 3;
Result := false;
repeat
RetryCount := RetryCount - 1;
try
FApdGSMPhone.QuickConnect := false;
FApdGSMPhone.Synchronize;
FApdGSMPhone.QuickConnect := true;
Result := true;
except
Result := false;
end;
sleep(500);
until Result or (RetryCount <=0) or Terminated;
end;
function TGSMFeeCom.parserFee(ReceveMessage, FeeModule: String): Currency;
var
Prefix,Sufix: String;
no1,no2: Integer;
Str: String;
i,j: Integer;
startPos,endPos: Integer;
function CanvertCurrency(Str:String): Currency;
var
V: Double;
Code: Integer;
begin
Val(str,V,code);
if Code = 0 then
Result := FloatToCurr(V)
else
Result := -1;
end;
begin
Result := -1;
startPos := -1;
endPos := Length(ReceveMessage);
no1 := Pos('<FEE>',FeeModule);
str := copy(FeeModule,no1-4,4);
no2 := Pos(str,ReceveMessage);
if no2 <>-1 then
begin
for i:= no2 to Length(ReceveMessage) do
begin
if Char(ReceveMessage[i]) in ['0'..'9',',','.'] then
begin
startPos := i;
for j:=startPos+1 to Length(ReceveMessage) do
begin
if not (Char(ReceveMessage[j]) in ['0'..'9',',',' ','.']) then
begin
endPos := j;
break;
end;
end;
break;
end;
end;
if startPos<>-1 then
begin
Str := copy(ReceveMessage,startPos,endPos-startPos);
Result := CanvertCurrency(Trim(Str));
end;
end;
end;
function TGSMFeeCom.RequestFee: Boolean;
var
NeedResetGSM: Boolean;
i: Integer;
RetryCount: Integer;
Done: Boolean;
FeeMessage: String;
theFee: Currency;
GetFee: Boolean;
TryCount : Integer;
begin
FeeMessage := '';
GetFee := false;
Synchronize(UpdateFeeListState);
if ListAllMessage then
begin
Synchronize(UpdateFeeClearState);
ClearAllMessage;
Synchronize(UpdateSendingState);
if SendFeeRequest then
begin
TryCount := 3;
repeat
SimpleWait(10000);
TryCount := TryCount - 1;
until (TryCount<=0) or CheckFeeMessage(FeeMessage) or Terminated;
if FeeMessage<>'' then
begin
try
theFee := parserFee(FeeMessage,FGSMFee.FeeTemplate);
except
theFee := -1;
end;
FGSMSet.Fee := theFee;
if theFee >=0 then
GetFee := true;
Synchronize(UpdateFeeState);
end;
end;
end
else
Synchronize(UpdateFeeListError);
if not GetFee then
Synchronize(UpdateFeeError);
Result := GetFee;
end;
function TGSMFeeCom.SendFeeRequest: Boolean;
var
RetryCount: Integer;
begin
Result := false;
RetryCount := 3;
repeat
try
RetryCount := RetryCount - 1;
FApdGSMPhone.SMSMessage := FGSMFee.SendMessage;
FApdGSMPhone.SMSAddress := FGSMFee.SendAdress;
FApdGSMPhone.SendMessage;
Result := true;
except
Result := false;
end;
until Result or (RetryCount <=0) or Terminated;
end;
procedure TGSMFeeCom.SetFeeInfo(SendAdress, SendMessage, ReceiveAddress,
FeeTemplate: String);
begin
FGSMFee.SendAdress := SendAdress;
FGSMFee.SendMessage := SendMessage;
FGSMFee.ReceveAdress := ReceiveAddress;
FGSMFee.FeeTemplate := FeeTemplate;
end;
procedure TGSMFeeCom.UpdateFeeCheckState;
var
AListItem: TListItem;
begin
AListItem := MainForm.GComListView.Items.Item[FGSMSet.Index];
if AListItem<>nil then
AListItem.SubItems.Strings[0] := '检查SMS';
if (MainForm.GSMComCombo.ItemIndex=0) or (MainForm.GSMComCombo.ItemIndex= FGSMSet.Index+1) then
MainForm.WriteLog('['+Format('GSM%.2d',[FGSMSet.Port])+'] 检查话费短信');
end;
procedure TGSMFeeCom.UpdateFeeClearState;
var
AListItem: TListItem;
begin
AListItem := MainForm.GComListView.Items.Item[FGSMSet.Index];
if AListItem<>nil then
AListItem.SubItems.Strings[0] := '清除SMS';
if (MainForm.GSMComCombo.ItemIndex=0) or (MainForm.GSMComCombo.ItemIndex= FGSMSet.Index+1) then
MainForm.WriteLog('['+Format('GSM%.2d',[FGSMSet.Port])+'] 清除所有短信');
end;
procedure TGSMFeeCom.UpdateFeeError;
begin
MainForm.WriteLog('['+Format('GSM%.2d',[FGSMSet.Port])+'] 查询话费失败.');
end;
procedure TGSMFeeCom.UpdateFeeListError;
var
AListItem: TListItem;
begin
AListItem := MainForm.GComListView.Items.Item[FGSMSet.Index];
if AListItem<>nil then
AListItem.SubItems.Strings[0] := '列出SMS出错';
if (MainForm.GSMComCombo.ItemIndex=0) or (MainForm.GSMComCombo.ItemIndex= FGSMSet.Index+1) then
MainForm.WriteLog('['+Format('GSM%.2d',[FGSMSet.Port])+'] 列出SMS出错');
end;
procedure TGSMFeeCom.UpdateFeeListState;
var
AListItem: TListItem;
begin
AListItem := MainForm.GComListView.Items.Item[FGSMSet.Index];
if AListItem<>nil then
AListItem.SubItems.Strings[0] := '列出SMS';
if (MainForm.GSMComCombo.ItemIndex=0) or (MainForm.GSMComCombo.ItemIndex= FGSMSet.Index+1) then
MainForm.WriteLog('['+Format('GSM%.2d',[FGSMSet.Port])+'] 列出所有短信');
end;
procedure TGSMFeeCom.UpdateFeeState;
var
AListItem: TListItem;
begin
AListItem := MainForm.GComListView.Items.Item[FGSMSet.Index];
if AListItem<>nil then
AListItem.SubItems.Strings[5] := CurrToStr(FGSMSet.fee);
if (MainForm.GSMComCombo.ItemIndex=0) or (MainForm.GSMComCombo.ItemIndex= FGSMSet.Index+1) then
MainForm.WriteFeeLog('['+Format('GSM%.2d',[FGSMSet.Port])+'] 剩余话费 '+CurrToStr(FGSMSet.Fee));
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -