📄 unitmodempool.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 + -