📄 unit1.pas
字号:
end;
end;
procedure TForm1.LogMsg0(LogDesc: string; LogCode: Byte);
begin
ListNet.Items.Add(Format('%.2d -- %s', [LogCode, LogDesc]));
ListNet.ItemIndex:= ListNet.Items.Count - 1;
WriteLog(Format('%.2d -- %s', [LogCode, LogDesc]));
end;
procedure TForm1.LogMsg1(LogDesc: string; LogCode: Byte);
begin
ListNet.Items.Add(LogDesc);
ListNet.ItemIndex:= ListNet.Items.Count - 1;
WriteLog(LogDesc);
end;
procedure TForm1.LogMsg2(LogDesc: string; LogCode: Byte);
begin
ListNet.Items.Add(Format('%.2d -- %s', [LogCode, LogDesc]));
ListNet.ItemIndex:= ListNet.Items.Count - 1;
writeLog(Format('%.2d -- %s', [LogCode, LogDesc]));
end;
procedure TForm1.LogMsg3(LogDesc: string; LogCode: Byte);
begin
ListNet.Items.Add(Format('%.2d -- %s', [LogCode, LogDesc]));
ListNet.ItemIndex:= ListNet.Items.Count - 1;
writeLog(Format('%.2d -- %s', [LogCode, LogDesc]));
end;
procedure TForm1.OthersOnLine(Sender: TObject; Client: string); //需要改 完善
begin
OnLine.Items.Add(Format('%s -- %s', [Client, timetostr(time)]));
OnLine.ItemIndex:= OnLine.Items.Count - 1;
WriteLog(Format('%s -- %s', [Client, timetostr(time)]));
end;
procedure TForm1.OthersOffLine(Sender: TObject; Client: string); //需要改 完善
begin
LeaveLine.Items.Add(Format('%s -- %s', [Client, timetostr(time)]));
LeaveLine.ItemIndex:= LeaveLine.Items.Count - 1;
WriteLog(Format('%s -- %s', [Client, timetostr(time)]));
end;
procedure TForm1.WriteData(Sender: TObject; Src, Dst: string; Cmd, PkCnt, PkNO: Byte; PkData: array of Byte; PkDataLen: integer) ;
var
Cs:Byte;
StrDat:Tstringlist;
i:integer;
Curlen:integer;
Index:integer;
DataRec: string;
s:string;
counter:integer;
Respond: T4KBytesBuf;
IOR:Byte;
order:string;
begin
StrDat:=Tstringlist.Create;
s:=datetimetostr(now()); //写日志 Src, Dst: string; , PkCnt, PkNO: Byte; PkData: array of Byte; PkDataLen: integer
ListData.Items.Add(s+' 获得数据包源地址:'+Src+'目标地址:'+Dst);
WriteLog(s+' 获得数据包源地址:'+Src+'目标地址:'+Dst);
if PkNO=0 then
qFirstCl:=PKData[0]; // 该包为第一包 需要提取CL 和 CH 设为全局变量 用来判断多包时的转发命令
{
if qsrcAddr1='' then
qsrcAddr1:=Src
else if qsrcAddr2='' then
qsrcAddr2:=Src
else if qsrcAddr3='' then
qsrcAddr3:=Src
else if qsrcAddr4='' then
qsrcAddr4:=Src //以上程序段用来分别什么地址给本地传输数据 不同的src传来的数据存到不同的StrDat中
else
showmessage('无效SRC');
if qsrcAddr1=src then //按照不同的src把Data数据域存到不同的数组中防止两个活多个src同时访问
begin }
showmessage('收到数据包');
if Cmd=$01 then //连续数据包命令为0x01 应答
begin
Respond[0]:=$41; // 连续数据包应答命令 Cmd, PkCnt, PkNO Cs
Respond[1]:=PkCnt;
Respond[2]:=PkNO;
Respond[3]:=$00;
SPClient.ClientTansData( Dst,Src,Respond,4); //连续数据包命令应答
end; //if Cmd=$01
if PkNO=0 then
qFirstCl:=PKData[0]; // 该包为第一包 需要提取CL 和 CH 设为全局变量 用来判断多包时的转发命令
//对所有数据包进行拼接 读出按转发数据格式的记录
if PkNO<PkCnt then //所有数据包拼接 包括单包(单包数据生产文件)情况
begin
i:=0; // 除去二次协议中的cmd pcnt pno 取data区数据
while i<=PKDataLen-1 do //数据包中最后一个存的是包校验码cs
begin //记录总的长度为多包数据总长度减去无效cmd pcnt pno cs
qDatByte1[qDataLen1]:=PKData[i]; //全局 每个源地址来的包都分一个 qDatByte1 qDataLen1
i:=i+1;
qDataLen1:=qDataLen1+1;
end; //whil
end; // if PkNO<PkCnt
//最终包到达 包括单包非生产文件与生产文件与单包查询记录命令
if PkNO=PkCnt-1 then
begin
if qFirstCl=$01 then //非生产文件数据包 数据解析 提取各个字段
begin
//showmessage('进入非生产文件');
index:=3; //在整个记录中 cl ch tt 不再需要提取了 直接从TNL开始 在记录中的位置是3
while index<=qDataLen1-3 do //前面是数据 最后两个存的是校验码 校验码分开处理
begin
if qDatByte1[index]>=127 then //取字段长度模块
begin
Curlen:=(qDatByte1[index]-128)*256+qDatByte1[ index+1];
index:= index+2;
end //if DatByte[index]>=127
else
begin
Curlen:= qDatByte1[index];
index:= index+1;
end; //else
i:=0;
DataRec:='';
while i<Curlen do //取表名和字段内容模块
begin
DataRec:=DataRec+char(qDatByte1[index]);
index:=index+1;
i:=i+1;
end; // while i<Curlen
// showmessage('解析出数据:'+datarec);
StrDat.Add(DataRec); //所有元素都存在StrDat中
ListData.Items.Add(DataRec); //添加数据日志表
end; // while index<qDataLen1-3
//写数据库 给是否写成功标志赋值
ADOqry.SQL.Clear; // StrToDate(StrDat[3])
if StrDat[0]='JFSH_VEH_BASICDATA' then
ADOqry.SQL.Add('insert JFSH_VEH_BASICDATA values(''' + StrDat[1] + ''', ''' + StrDat[2] + ''',''' + StrDat[3] + ''',''' + StrDat[4] + ''',''' + StrDat[5] + ''',''' + StrDat[6] + ''')')
else if StrDat[0]='JFSH_VEH_ETYPE' then
ADOqry.SQL.Add('insert JFSH_VEH_ETYPE values(''' + StrDat[1] + ''', ''' + StrDat[2]+ ''',''' + StrDat[3] + ''',''' + StrDat[4] + ''',''' + StrDat[5] + ''',''' + StrDat[6] + ''')')
else if StrDat[0]='JFSH_VEH_MOTOROLA' then
ADOqry.SQL.Add('insert JFSH_VEH_MOTOROLA values(''' + StrDat[1] + ''', ''' + StrDat[2] + ''',''' + StrDat[3] + ''',''' + StrDat[4] + ''',''' + StrDat[5] + ''',''' + StrDat[6] + ''')')
else if StrDat[0]='JFSH_VEH_ECAS' then
ADOqry.SQL.Add('insert JFSH_VEH_ECAS values(''' + StrDat[1] + ''', ''' + StrDat[2] + ''',''' + StrDat[3] + ''')')
else if StrDat[0]='JFSH_VEH_CANLIN' then
ADOqry.SQL.Add('insert JFSH_VEH_CANLIN values(''' + StrDat[1] + ''', ''' + StrDat[2] + ''',''' + StrDat[3] + ''')')
else if StrDat[0]='JFSH_ENG_BASICDATA' then
ADOqry.SQL.Add('insert JFSH_ENG_BASICDATA values(''' + StrDat[1] + ''', ''' + StrDat[2] + ''',''' + StrDat[3] + ''',''' + StrDat[4] + ''',''' + StrDat[5] + ''',''' + StrDat[6] + ''',''' + StrDat[7] + ''',''' + StrDat[8] + ''',''' + StrDat[9] + ''')')
else if StrDat[0]='JFSH_ENG_ECSMap' then
ADOqry.SQL.Add('insert JFSH_ENG_ECSMap values(''' + StrDat[1] + ''', ''' + StrDat[2] + ''')')
else if StrDat[0]='JFSH_ENG_BOSCH498' then
ADOqry.SQL.Add('insert JFSH_ENG_BOSCH498 values(''' + StrDat[1] + ''', ''' + StrDat[2] + ''')')
else if StrDat[0]='JFSH_ENG_DEUTZ' then
ADOqry.SQL.Add('insert JFSH_ENG_DEUTZ values(''' + StrDat[1] + ''', ''' + StrDat[2] + ''',''' + StrDat[3] + ''')')
else if StrDat[0]='JFSH_ENG_MOTOROLA' then
ADOqry.SQL.Add('insert JFSH_ENG_MOTOROLA values(''' + StrDat[1] + ''', ''' + StrDat[2] + ''',''' + StrDat[3] + ''')')
else if StrDat[0]='JFSH_ENG_PFileMap' then
ADOqry.SQL.Add('insert JFSH_ENG_PFileMap values(''' +StrDat[1] + ''', ''' +StrDat[2] + ''',''' +StrDat[3] + ''',''' +StrDat[4] + ''',''' + StrDat[5] + ''',''' + StrDat[6] + ''',''' + StrDat[7] + ''',''' + StrDat[8] + ''',''' + StrDat[9] + ''',''' + StrDat[10] + ''',''' + StrDat[11] + ''')')
else if StrDat[0]='JFSH_VEH_ETYPE' then
ADOqry.SQL.Add('insert JFSH_VEH_ETYPE values(''' + StrDat[1] + ''', ''' + StrDat[2] + ''',''' + StrDat[3] + ''',''' + StrDat[4] + ''',''' + StrDat[5] + ''',''' + StrDat[6] + ''')')
else
begin
WriteLog(s+' '+StrDat[0]+'表不存在');
ListSys.Items.Add(s+' '+StrDat[0]+'表不存在')
end;
try
ADOqry.ExecSQL;
IOR:=$01; //成功
WriteLog(s+' '+StrDat[0]+'表写入数据操作成功');
ListSys.Items.Add(s+' '+StrDat[0]+'表写入数据操作成功')
except
IOR:=$00; //失败
WriteLog(s+' '+StrDat[0]+'表写入数据操作失败');
ListSys.Items.Add(s+' '+StrDat[0]+'表写入数据操作失败')
end;
//showmessage('准备非文件发送应答');
Respond[0]:=$41; //应答非生产文件命令
Respond[1]:=$00;
Respond[2]:=$0A;
index:=3;
if qDatByte1[3]>=127 then
begin
Respond[index]:=qDatByte1[3];
index:=index+1;
Respond[index]:=qDatByte1[4];
index:=index+1;
end
else
begin
Respond[index]:=qDatByte1[3];
index:=index+1;
end;
// Respond[3]:=Length(StrDat[0]);
// index:=4;
i:=1;
while i<=length(StrDat[0]) do
begin
Respond[index]:=ord(StrDat[0][i]);
i:=i+1;
index:=index+1;
end;
Respond[index]:=qDatByte1[qDataLen1-2]; //key值为非文件表数据记录命令中的SEED 1Byte
index:=index+1;
Respond[index]:=qDatByte1[qDataLen1-1]; //key值为非文件表数据记录命令中的SEED 1Byte
index:=index+1;
Respond[index]:=IOR;
SPClient.ClientTansData(Dst, Src,Respond,index+1); //应答非文件表数据记录命令
// showmessage('发送非文件应答完毕');
end //if FirstCl=$01
//发送校验表记录命令 用来查询发送的数据内容
else if qFirstCl=$02 then // 查询数据包
begin
showmessage('进入查询文件');
index:=3; //在整个记录中 cl ch tt 不再需要提取了 直接从TNL开始 在记录中的位置是3
if qDatByte1[index]>=127 then //取字段长度模块
begin
Curlen:=(qDatByte1[index]-128)*256+qDatByte1[ index+1];
index:= index+2;
end //if DatByte[index]>=127
else
begin
Curlen:= qDatByte1[index];
index:= index+1;
end; //else
i:=0;
DataRec:='';
while i<Curlen do //取要查询的表名
begin
DataRec:=DataRec+char(qDatByte1[index]);
index:=index+1;
i:=i+1;
end; // while i<Curlen
ListData.Items.Add('要查询的表名为:+'+DataRec); //添加数据日志表
ADOqry.SQL.Clear;
ADOqry.SQL.Add('select * from '+DataRec);
try
ADOqry.Open;
ListSys.Items.Add(s+' '+DataRec+'表查询成功');
WriteLog(s+' '+DataRec+'表查询成功');
except
ListSys.Items.Add(s+' '+DataRec+'表查询失败');
WriteLog(s+' '+DataRec+'表查询失败')
end; // try
counter:=ADOqry.RecordCount; //counter中存储记录总条数
if counter>=0 then
begin
///////////////////////////应答检验表记录命令
Respond[0]:=$42;
Respond[1]:=$00;
Respond[2]:=$0A;
index:=3;
if qDatByte1[3]>=127 then
begin
Respond[index]:=qDatByte1[3];
index:=index+1;
Respond[index]:=qDatByte1[4];
index:=index+1;
end
else
begin
Respond[index]:=qDatByte1[3];
index:=index+1;
end;
i:=1;
while i<=length(DataRec) do
begin
Respond[index]:=ord(DataRec[i]);
i:=i+1;
index:=index+1;
end;
Respond[index]:=counter and $ff;
index:=index+1;
Respond[index]:=(counter shr 8) and $ff;
index:=index+1;
Respond[index]:=(counter shr 16) and $ff;
index:=index+1;
Respond[index]:=(counter shr 24) and $ff;
SPClient.ClientTansData( Dst,Src,Respond,index+1);
/////////////////////////////应答检验表记录命令
end; // if counter>=0
end // if FirstCl=$02
//处理生产文件
else if qFirstCl=$03 then // 生产文件数据包
begin //本次按照数据文件方式处理生产文件 有空改成读数据库不完整文件处理
showmessage('进入生产文件');
index:=3; //在整个记录中 cl ch tt RCL RCH 不再需要提取了 直接从TNL开始 在记录中的位置是3
while index<=qDataLen1-3 do //前面是数据 最后两个存的是校验码 校验码分开处理
begin
if qDatByte1[index]>=127 then //取字段长度模块
begin
Curlen:=(qDatByte1[index]-128)*256+qDatByte1[ index+1];
index:= index+2;
end //if DatByte[index]>=127
else
begin
Curlen:= qDatByte1[index];
index:= index+1;
end; //else
i:=0;
DataRec:='';
while i<Curlen do //取表名和字段内容模块
begin
DataRec:=DataRec+char(qDatByte1[index]);
index:=index+1;
i:=i+1;
end; // while i<Curlen
showmessage('解析出数据:'+datarec);
StrDat.Add(DataRec); //所有元素都存在StrDat中
ListData.Items.Add(DataRec); //添加数据日志表
end; // while index<qDataLen1-3 // while index<qDataLen1-3
ADOqry.SQL.Clear; //动态建立生产文件表
ADOqry.SQL.Add('create table QMZDY_PF_' + StrDat[0] + ' (RecName varchar(30),RecID varchar(30),RecLen varchar(30),RecContent varchar(512))');
try
ADOqry.ExecSQL;
ListSys.Items.Add(s+' QMZDY_PF_'+StrDat[0]+ '数据表成功建立');
WriteLog(s+' QMZDY_PF_'+StrDat[0]+ '数据表成功建立')
except
ListSys.Items.Add(s+' QMZDY_PF_'+StrDat[0]+ '数据表已存在');
WriteLog(s+' QMZDY_PF_'+StrDat[0]+ '数据表已存在')
end; //try
ADOqry.SQL.Clear; ///生产文件写数据库
ADOqry.SQL.Add('insert QMZDY_PF_' + StrDat[0] + ' values(''' + StrDat[0] + ''',''' + StrDat[1] + ''', ''' + StrDat[2] + ''',''' + StrDat[3] + ''')');
try
ADOqry.ExecSQL;
IOR:=$01; //插入成功 为0x01
WriteLog(s+' QMZDY_PF_'+StrDat[0]+ '表写入数据操作成功');
ListSys.Items.Add(s+' QMZDY_PF_'+StrDat[0]+ '表写入数据操作成功')
except
IOR:=$00; //插入失败为 0x00
WriteLog(s+' QMZDY_PF_'+StrDat[0]+ '表写入数据操作失败');
ListSys.Items.Add(s+' QMZDY_PF_'+StrDat[0]+ '表写入数据操作失败')
end;
//应答文件表数据记录命令
Respond[0]:=$43; //应答生产文件命令
Respond[1]:=$00;
Respond[2]:=$A0;
index:=3;
if qDatByte1[5]>=127 then
begin
Respond[index]:=qDatByte1[5];
index:=index+1;
Respond[index]:=qDatByte1[6];
index:=index+1;
end
else
begin
Respond[index]:=qDatByte1[5];
index:=index+1;
end;
i:=1;
while i<=length(StrDat[0]) do
begin
Respond[index]:=ord(StrDat[0][i]);
i:=i+1;
index:=index+1;
end;
Respond[index]:=qDatByte1[qDataLen1-2]; //key值为非文件表数据记录命令中的SEED 1Byte
index:=index+1;
Respond[index]:=qDatByte1[qDataLen1-1]; //key值为非文件表数据记录命令中的SEED 1Byte
index:=index+1;
Respond[index]:=IOR;
SPClient.ClientTansData( Dst,Src,Respond,index+1); //应答文件表数据记录命令
//查询生产文件看表是否填满 如果填满则删除表名
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -