📄 main.~pas
字号:
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, OleCtrls, MSCommLib_TLB, ComCtrls, ExtCtrls,
IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, Grids,
DBGrids, DB, ADODB, DBCtrls, SUIComboBox, RzPanel, Buttons;
type
TForm1 = class(TForm)
MSComm: TMSComm;
StatusBar: TStatusBar;
Timer1: TTimer;
IdTCPClient: TIdTCPClient;
ADOConnection1: TADOConnection;
ADOQuery: TADOQuery;
DataSource1: TDataSource;
ADOQuery1: TADOQuery;
ADOQuerylist: TADOQuery;
Panel2: TPanel;
Memo2: TMemo;
Panel3: TPanel;
ADOQuery_refuse: TADOQuery;
DataSource_refuse: TDataSource;
DBGrid1: TDBGrid;
DBNavigator1: TDBNavigator;
ADOQuery2: TADOQuery;
ADOQuery_del: TADOQuery;
Timer2: TTimer;
Timer3: TTimer;
RzGroupBox1: TRzGroupBox;
Label6: TLabel;
Label1: TLabel;
Com_Port: TsuiComboBox;
Com_BaudRate: TsuiComboBox;
RzGroupBox2: TRzGroupBox;
Label4: TLabel;
Btn_Open: TSpeedButton;
Btn_Device: TSpeedButton;
Btn_LinkServer: TSpeedButton;
RzGroupBox3: TRzGroupBox;
Label3: TLabel;
Edit1: TEdit;
Btn_Test: TSpeedButton;
procedure MSCommComm(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Btn_TestClick(Sender: TObject);
procedure sendyuyue(suser:string);
procedure dbgridlist();
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormCreate(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure Btn_DeviceClick(Sender: TObject);
procedure Btn_ClearDataClick(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
procedure Btn_RefreshClick(Sender: TObject);
procedure Timer3Timer(Sender: TObject);
procedure Btn_OpenClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure ComPort_List;
end;
var
Form1: TForm1;
Msg,txt,mobile : String;
strip,blank:string;
implementation
{$R *.dfm}
uses Registry;
procedure TForm1.MSCommComm(Sender: TObject);
var
s,revtime,bound:string;
i,ii,j:integer;
begin
case mscomm.CommEvent of
comEvReceive:
begin
memo2.Lines.Add(blank);
s:=trim(MSComm.Input);
if length(trim(s))=0 then exit;
memo2.Lines.Add(s);
//Pos函数寻找子字串在母字串中的位置
i:=Pos( ':', S);//查找:在字符串的位置,方便后面处理
j:=Pos( ',', S);//查找,在字符串的位置,方便后面处理
memo2.Lines.Add('字符:在字符串位置是:'+inttostr(i)+' 字符,在字符串位置是:'+inttostr(j));
if (Pos('"', S))>0 then
mobile:=trim(Copy(s,i+3,j-i-4))//Copy(str,index,n):从任意i位置,截取n个字符
else
mobile:=trim(Copy(s,i+1,j-i-1));
memo2.Lines.Add('用户号码'+mobile+'接收时间:'+datetimetostr(now));
mscomm.Output:='ath'+#13;
MSComm.RThreshold:=34; //设置接收10个字节产生OnComm 事件
MSComm.SThreshold:=1; //关闭改参数没有振铃声音
// mSComm.RThreshold:=34; //现在设置接收34个字节产生OnComm 事件,接受ring事件
MSComm.InBufferCount := 0;
//下面将接收到的号码写数据库
if length(trim(mobile))<11 then exit;
if length(trim(mobile))>12 then exit;
ADOQuery.Active:=false;
ADOQuery.SQL.Clear;
revtime:=datetimetostr(now);
Adoquery.SQL.Add('insert into revnumber(revtime,revno) values('''+revtime+''','''+mobile+''')');
Adoquery.ExecSQL;
//统计次数
ADOQuery.Active:=false;
ADOQuery.SQL.Clear;
Adoquery.SQL.Add('select * from dailnumber where dailno='''+trim(mobile)+'''');
Adoquery.open;
if (Adoquery.RecordCount>=1) then
begin
ii:=Adoquery.FieldValues['dailnum']+1;
ADOQuery1.Active:=false;
ADOQuery1.SQL.Clear;
memo2.Lines.Add(formatdatetime('yyyy-mm-dd hh:mm:ss',now)+' 接收用户:'+mobile+' 当前呼叫:'+inttostr(ii)+' 次...'+#13);
Adoquery1.SQL.Add('update dailnumber set dailnum='''+inttostr(ii)+''' where dailno='''+trim(mobile)+'''');
Adoquery1.ExecSQL();
end
else
begin
ADOQuery1.Active:=false;
ADOQuery1.SQL.Clear;
Adoquery1.SQL.Add('insert into dailnumber(dailno,dailnum) values('''+mobile+''',''1'')');
Adoquery1.ExecSQL();
end;
//下面将发送预约
if Copy(mobile,1,1)='1' then //用户号开头1表手机用户
//sendyuyue(mobile)
timer3.Enabled:=true
else
timer2.Enabled:=true;
end;
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
MSComm.InBufferCount := 0;// 清除接收缓冲区
//防止error错误存在接收缓冲区,导致输出错误
statusbar.Panels[0].Text:='当前时间:'+datetimetostr(now)+' '
end;
procedure TForm1.Btn_TestClick(Sender: TObject);
var
result:boolean;
begin
if trim(edit1.Text)='' then
begin
Application.MessageBox('输入用户号码!!','提示',mb_ok);
exit;
end;
if length(trim(edit1.Text))<11 then
begin
memo2.Lines.Add('输入号码不符合规格,应该是11位或者12位数字!!'+#13);
exit;
end;
memo2.Lines.Add(blank);
sendyuyue(trim(edit1.Text));
edit1.Text:='';
end;
procedure TForm1.sendyuyue(suser:string);
var
ymsg:string;
//yBuf: array[0..12] of Byte; //定义预约的头的二进制信息数组
begin //下面是向服务器预约平台发送数据
if length(trim(suser))<11 then exit;
if length(trim(suser))>12 then exit;
Adoquery2.Active:=false;
Adoquery2.SQL.Clear();
Adoquery2.SQL.Add('select * from refuser where usernumber='''+trim(suser)+''''); //只是显示最后的20行纪录
Adoquery2.Open;
if Adoquery2.RecordCount>0 then
begin
Memo2.Lines.Add(formatdatetime('yyyy-mm-dd hh:mm:ss',now)+'该用户'+trim(suser)+'被锁定,禁用...'+#13);
exit;
end
else
begin
Memo2.Lines.Add(formatdatetime('yyyy-mm-dd hh:mm:ss',now)+'正在连接预约服务器... ...'+#13);
with IdTCPClient do
begin
try
Host:=strip;
Port:=11027; //破解33预约端口
connect(5000);
if Connected=false then
Connect;
ymsg:='Msg_Call:'+trim(suser)+';%c%s'; //预约的用户格式
WriteLn(ymsg);
memo2.Lines.Add(formatdatetime('yyyy-mm-dd hh:mm:ss',now)+' 为用户:'+suser+' 发起预约呼叫!'+#13);
Disconnect; //关闭tcp连接
timer1.Enabled:=false;
timer2.Enabled:=false;
timer3.Enabled:=false;
except
Memo2.Lines.Add(formatdatetime('yyyy-mm-dd hh:mm:ss',now)+' 远程预约主机无响应,请检查网络环境... ...'+#13);
timer1.Enabled:=true;
timer2.Enabled:=false;
timer3.Enabled:=false;
Disconnect();
end;
end;
end;
end;
procedure TForm1.dbgridlist;
var
i:integer;
begin //下面是显示数据库里面的数据的函数
Adoquerylist.Active:=false;
Adoquerylist.SQL.Clear();
Adoquerylist.SQL.Add('select * from dailnumber order by dailnum desc'); //只是显示最后的20行纪录
Adoquerylist.Open;
adoquerylist.First;
with adoquerylist do
begin
while not Eof do
begin
//
end;
end;
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if (application.MessageBox('你确认要关闭窗口?','提示',MB_YESNO+MB_ICONQUESTION)=ID_NO) THEN
begin
CanClose:=false;
ADOQuery.Active:=false;
ADOQuery1.Active:=false;
ADOQuerylist.Active:=false;
MsComm.PortOpen:=false;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
MSComm.InBufferCount := 0;// 清除接收缓冲区
MSComm.OutBufferCount:=0;// 清除发送缓冲区
blank:='--------------------------------------------------------------------------------------------------------------------' ;
timer2.Enabled:=false;
timer3.Enabled:=false;
ComPort_List;
end;
procedure TForm1.ComPort_List; //得到串口列表的过程
var
reg: TRegistry;
st: Tstrings;
i: Integer;
begin
reg := TRegistry.Create;
try
reg.RootKey := HKEY_LOCAL_MACHINE;
reg.OpenKey('hardware\devicemap\serialcomm', False); //读注册表
st := TstringList.Create;
try
reg.GetValueNames(st);
Com_Port.Items.Clear;
for i := 0 to st.Count - 1 do
Com_Port.Items.Add(reg.Readstring(st.strings[i]));
finally
st.Free;
end;
reg.CloseKey;
finally
reg.Free;
end;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if key=#13 then
begin
if IdTCPClient.Connected=false then IdTCPClient.Connect;
Msg := IdTCPClient.ReadLn;
memo2.Lines.Add(Msg);
txt:=trim(edit1.Text);
IdTCPClient.Socket.Send(txt,sizeof(txt));
edit1.Text:= '';
memo2.Lines.Add(IdTCPClient.ReadLn);
IdTCPClient.Disconnect;
end;
end;
procedure TForm1.Btn_DeviceClick(Sender: TObject);
begin
WinExec('Rundll32.exe shell32.dll,Control_RunDLL Sysdm.cpl,,2',SW_RESTORE);
end;
procedure TForm1.Btn_ClearDataClick(Sender: TObject);
begin
ADOQuery_del.Active:=false;
ADOQuery_del.SQL.Clear;
ADOQuery_del.SQL.Add('delete from dailnumber');
ADOQuery_del.ExecSQL;
ADOQuery_del.Active:=false;
ADOQuery_del.SQL.Clear;
ADOQuery_del.SQL.Add('delete from revnumber');
ADOQuery_del.ExecSQL;
//dbgrid显示数据库里面的数据
end;
procedure TForm1.Timer2Timer(Sender: TObject);
begin
sendyuyue(mobile);
end;
procedure TForm1.Btn_RefreshClick(Sender: TObject);
var
i:integer;
begin //下面是显示数据库里面的数据的函数
Adoquerylist.Active:=false;
Adoquerylist.SQL.Clear();
Adoquerylist.SQL.Add('select * from dailnumber order by dailnum desc'); //只是显示最后的20行纪录
Adoquerylist.Open;
adoquerylist.First;
with adoquerylist do
begin
while not Eof do
begin
//
end;
end;
end;
procedure TForm1.Timer3Timer(Sender: TObject);
begin
sendyuyue(mobile);
end;
procedure TForm1.Btn_OpenClick(Sender: TObject);
var bound,shuju,jiaoyan,stops,Outstring:string;
begin
if (MsComm.PortOpen=true) then
memo2.Lines.Add('端口已经打开')
else
begin
//下面将设置端口
MSComm.commport:=strtoint(copy(trim(Com_Port.Text),4,length(trim(Com_Port.Text))-3));
bound:=trim(Com_BaudRate.Text);
MSComm.settings:=bound+',n,8,1';
MSComm.portopen:=true;
MSComm.RThreshold:=34; //设置接收10个字节产生OnComm 事件
MSComm.SThreshold:=1; //关闭改参数没有振铃声音
memo2.Lines.Add('参数设置成功');
memo2.Lines.Add('可以进行正常通讯');
Outstring:='at+clip=1'+#13;
mscomm.Output:= Outstring;
//下面设置状态栏
statusbar.Panels[1].Text:='串口:'+Com_Port.Text+',波特率:'+ Com_BaudRate.Text;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -