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

📄 gsmcom.~pas

📁 很好的手机发短信的例子。含GSM群发机设计原理和使用说明。还有详细代码
💻 ~PAS
📖 第 1 页 / 共 5 页
字号:

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 + -