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

📄 unitmodempool.pas

📁 串口短信猫收发软件。支持西门子TC35i设备
💻 PAS
字号:

{*******************************************************}
{                                                       }
{  名称:TModemPool类                                   }
{  功能:                                               }
{      1.实现连接池功能                                 }
{      2.自动负载均衡                                   }
{  调用:                                               }
{      1.根据ini文件配置参数创建n个对应类型TModem实例   }
{      2.查找当前已经打开的实例对象                     }
{      3.调用实例的相应方法                             }
{                                                       }
{*******************************************************}

unit UnitModemPool;

interface

uses
  Windows, Messages, SysUtils, Forms, Classes, Dialogs, SyncObjs, IniFiles, Math, UnitPublicFun, UnitModem;

type
  TModemPool = class(TObject)
  private
    FModemList: TStringList;
    FHasChinaUnicom: Boolean;
    FHasChinaMobile: Boolean;
  public
    constructor Create;
    destructor Destroy; override;
    function StartAllModem: Boolean;                                            //启动所有设备
    procedure StopAllModem;                                                     //停止所有设备
    procedure ClearAllModem;
    procedure AddModem(DeviceType: integer; ComPort: string; NetDefine: integer);
    function LookupRandomModem(TelPreFix: string = ''): TModem;                 //随机获取MODEM实例(参数为号码前缀)
    function LookupNameModem(CommName: string): TModem;                         //根据通讯端口名称查找通讯设备对象
  published
    property ModemList: TStringList read FModemList;                            //MODEM池对象列表
    property HasChinaUnicom: boolean read FHasChinaUnicom;                      //MODEM池内是否有中国联通SIM卡 true-有 false-没有
    property HasChinaMobile: boolean read FHasChinaMobile;                      //MODEM池内是否有中国移动SIM卡 true-有 false-没有
  end;

implementation

uses UnitProgressBar, UnitSiememsTC35i, UnitDM;

{ TModemPool }

procedure TModemPool.AddModem(DeviceType: integer; ComPort: string; NetDefine: integer);
var
  FModem: TModem;
begin
  if FModemList=Nil then Exit;
  
  //根据不同设备类型,创建不同设备对象 0-Siemems TC35i
  case DeviceType of
    0: FModem := TSiememsTC35i.Create(ComPort);
    else FModem := TSiememsTC35i.Create(ComPort);
  end;
  //网络标识:0-中国联通,1-中国移动
  FModem.NetDefine := NetDefine;
  if NetDefine=0 then FHasChinaUnicom := True;
  if NetDefine=1 then FHasChinaMobile := True;
  FModemList.AddObject(FModem.CommName, FModem);
end;

procedure TModemPool.ClearAllModem;
var
  i: integer;
begin
  if FModemList=Nil then Exit;
  if FModemList.Count<=0 then Exit;  
  i := FModemList.Count-1;
  while FModemList.Count>0 do
  begin
    TModem(FModemList.Objects[i]).Free;
    FModemList.Delete(i);
    i := i - 1;
  end;
end;

constructor TModemPool.Create;
begin
  inherited Create;
  FModemList := TStringList.Create;
  FHasChinaUnicom := False;
  FHasChinaMobile := False;
end;

destructor TModemPool.Destroy;
begin
  ClearAllModem;
  FModemList.Free;
  inherited;
end;

function TModemPool.LookupRandomModem(TelPreFix: string): TModem;
var
  i, iTryCount: integer;
  tmpStr: string;
  m: TModem;
begin
  Result := nil;
  if FModemList=Nil then Exit;
  if FModemList.Count<=0 then Exit;
  tmpStr := copy(Trim(TelPreFix), 1, 3);

  for iTryCount:=0 to MAX_LOOKUP_TRYCOUNT-1 do
  begin
    Randomize;
    i := Random(FModemList.Count);                                              //随机获取已打开的设备
    m := TModem(FModemList.Objects[i]);

    if not m.IsOpen then continue;

    if tmpStr='' then//不分网
    begin
      Result := m;
      break;
    end;

    if not (FHasChinaUnicom and FHasChinaMobile) then//只有一个网,没有可选 (网络标识:0-中国联通,1-中国移动)
    begin
      Result := m;
      break;
    end;

    if pos(tmpStr, DM.UnicomTelPreFix)>0 then//中国联通号码
    begin
      if m.NetDefine=0 then
      begin
        Result := m;
        break;
      end;
    end
    else if pos(tmpStr, DM.MobileTelPreFix)>0 then//中国移动号码
    begin
      if m.NetDefine=1 then
      begin
        Result := m;
        break;
      end;
    end
    else//其它号码,如小灵通
    begin
      Result := m;
      break;
    end;
  end;
end;

function TModemPool.LookupNameModem(CommName: string): TModem;
var
  i: integer;
begin
  Result := Nil;
  if FModemList=Nil then Exit;
  if FModemList.Count<=0 then Exit;  
  for i:=0 to FModemList.Count-1 do
  begin
    if UpperCase(TModem(FModemList.Objects[i]).CommName)=UpperCase(CommName) then
    begin
      Result := TModem(FModemList.Objects[i]);
      break;
    end;
  end;
end;

function TModemPool.StartAllModem: Boolean;
var
  i: integer;
  s, n: string;
  m: TModem;
  ProgressBarForm: TProgressBarForm;
begin
  Result := False;

  if FModemList=Nil then Exit;
  if FModemList.Count<=0 then Exit;

  ProgressBarForm := TProgressBarForm.Create(Nil);
  ProgressBarForm.ProgressLabel.Caption := '正在初始化通讯设备,请稍等...';
  ProgressBarForm.ProgressBar.Min := 0;
  ProgressBarForm.ProgressBar.Max := FModemList.Count * 10;
  ProgressBarForm.ProgressBar.Step := 1;
  ProgressBarForm.ProgressBar.Position := 0;
  Application.ProcessMessages;

  try
    for i:=0 to FModemList.Count-1 do
    begin
      m := TModem(FModemList.Objects[i]);
      if m=nil then continue;
      if m.IsOpen then continue;
      try
        //1.打开设备
        m.Open;
        ProgressBarForm.ProgressBar.StepIt;

        //2.打开状态检测
        if not m.IsOpen then Exit;
        ProgressBarForm.ProgressBar.StepIt;

        //3.获取通讯端口名称
        n := m.CommName;
        ProgressBarForm.ProgressBar.StepIt;

        //4.恢复到厂商默认设置
        if not m.SetZero then
        begin
          StopAllModem;
          raise Exception.Create('恢复到厂商默认设置错误');
          Exit;
        end;
        ProgressBarForm.ProgressBar.StepIt;

        //5.设置短信发送PDU模式
        if not m.SetPduMode then
        begin
          StopAllModem;
          raise Exception.Create('设置短信发送PDU模式错误');
          Exit;
        end;
        ProgressBarForm.ProgressBar.StepIt;

        //6.设置关闭回显参数
        if not m.SetEchoOff then
        begin
          StopAllModem;
          raise Exception.Create('设置关闭回显参数错误');
          Exit;
        end;
        ProgressBarForm.ProgressBar.StepIt;

        //7.设置GSM网络模式
        if not m.SetTECharacterSet then
        begin
          StopAllModem;
          raise Exception.Create('设置GSM网络模式错误');
          Exit;
        end;
        ProgressBarForm.ProgressBar.StepIt;

        //8.设置通讯报告模式
        if not m.SetReportErrorOff then
        begin
          StopAllModem;
          raise Exception.Create('设置通讯报告模式错误');
          Exit;
        end;
        ProgressBarForm.ProgressBar.StepIt;

        //9.获取短信中心号码
        s := m.GetSIMServerNo;
        ProgressBarForm.ProgressBar.StepIt;

        //10.设置短信中心号码
{
        if s<>NO_DETAIL then
        begin
          if not m.SetSIMServerNo(s) then
          begin
            StopAllModem;
            raise Exception.Create('设置短信服务中心错误');
            Exit;
          end;
        end;
}
        ProgressBarForm.ProgressBar.StepIt;

      finally
        ProgressBarForm.ProgressLabel.Caption := '正在初始化 ' + n + ' ...';
        ProgressBarForm.ProgressBar.Position := (i + 1) * 8;
        Application.ProcessMessages;
      end;
    end;
    Result := True;
  finally
    ProgressBarForm.ProgressBar.Position := ProgressBarForm.ProgressBar.Max;
    ProgressBarForm.Close;
  end;
end;

procedure TModemPool.StopAllModem;
var
  i: integer;
  ProgressBarForm: TProgressBarForm;
  m: TModem;
begin
  if FModemList=Nil then Exit;
  if FModemList.Count<=0 then Exit;
  
  ProgressBarForm := TProgressBarForm.Create(Nil);
  ProgressBarForm.ProgressLabel.Caption := '准备关闭通讯设备,请稍等...';
  ProgressBarForm.ProgressBar.Min := 0;
  ProgressBarForm.ProgressBar.Max := FModemList.Count;
  ProgressBarForm.ProgressBar.Position := 1;
  Application.ProcessMessages;

  try
    for i:=0 to FModemList.Count-1 do
    begin
      try
        m := TModem(FModemList.Objects[i]);
        if m=nil then continue;
        if m.IsOpen then m.Close;
      finally
        ProgressBarForm.ProgressLabel.Caption := '关闭 ' + m.CommName+ ' ,请稍等...';
        ProgressBarForm.ProgressBar.StepIt;
        Application.ProcessMessages;
      end;
    end;
  finally
    ProgressBarForm.Close;
  end;
end;

end.

⌨️ 快捷键说明

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