
22.11.2012, 10:11
|
Прохожий
|
|
Регистрация: 19.11.2012
Сообщения: 1
Репутация: 10
|
|
Расшифровке кода (Delphi). Cерверное приложение
Есть серверное приложение на DELPHI,имеются терминалы(клиенты)к которым подключаются всевозможные датчики .На сервер от терминала приходит посылка вида 08:31:35 812 from Terminal:45 00 50 13 00 22 31 07 DC 0B 16 08 1F 04 00 00 00 00 E2 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00.....Где (22) код посылки,07-04 время, E2 значение с датчика.Пришедшую посылку пишем в базу данных.
Код:
procedure TfMain.ssForTerminalsClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
Text : string;
wI:Word;
cRSchar: char;
st:string;
___st:string;
Buf: array[0..1000] of byte;
Buf1: array[0..20] of byte;
adr: integer;
i, j :integer;
code: integer;
t:integer;
year,month,day,hour,minute,second:integer;
myDate : TDateTime;
myYear, myMonth, myDay : Word;
myHour, myMin, mySec, myMilli : Word;
ass : array[0..12] of byte;
str, zss : string;
begin
// Принимает от клиента сообщение
Text := socket.ReceiveText;
if Length(Text) <> 12 then begin
st := '';
for wI:=0 to Length(Text)-1 do
begin
//cRSchar:=Form1.ApdComPort1.GetChar;
cRSchar:=Text[wI+1];
Buf[wI]:=ord(cRSchar);
st := st + inttohex((ord(cRSchar)),2) + ' ';
end;
DateTimeToString(___st,'hh:nn:ss:zzz',time);
fMAin.lbLog.Items.Add(___st + 'From Terminal: '+ st);
if (fMAin.lbLog.Items.Count > 1000) then fMAin.lbLog.Items.Delete(0);
//len:=Buf[0]+Buf[1]*256;
adr:=Buf[3]+Buf[4]*256;
code:=Buf[5];
if (code = 1) then exit;
for i:=0 to MAX_TERMINALS do
begin
if terminals[i].adr = adr then
begin
if terminals[i].socket <> socket then
begin
terminals[i].socket := socket;
terminals[i].active := true;
terminals[i].adr := adr;
terminals[i].setDate := false;
//fMain.lbTerminals.Items.Delete(i);
fMain.lbTerminals.Items[i]:= inttostr(i+1)+'. '+terminals[i].name+' , ' + inttostr(terminals[i].adr) + ' Подключен.';
//fMain.lbTerminals.Items.Add(inttostr(i+1)+'. '+terminals[i].name+' , ' + inttostr(terminals[i].adr) + ' Подключен.');
end;
end;
end;
t:=0;
if not terminals[t].setDate then
begin
Buf1[0]:=14;
Buf1[1]:=0;
Buf1[2]:=0;
Buf1[3]:=0;
Buf1[4]:=0;
Buf1[5]:=$1B;
Buf1[6]:=0;
myDate:=Now;
DecodeDateTime(myDate, myYear, myMonth, myDay, myHour, myMin, mySec, myMilli);
Buf1[7]:=myYear mod 256;
Buf1[8]:=myYear div 256;
Buf1[9]:=myMonth;
Buf1[10]:=myDay;
Buf1[11]:=myHour;
Buf1[12]:=myMin;
Buf1[13]:=mySec;
terminals[t].socket.SendBuf(Buf1,14);
terminals[t].setDate:=True;
end;
//Особенно интересует код ниже
if code = $22 then
begin
//Bu[6]
t:=0;
terminals[t].countFail:=0;
if Buf[6] = $31 then
begin
year:=Buf[7]*256 + Buf[8];
month:=Buf[9];
day:=Buf[10];
hour:=Buf[11];
minute:=Buf[12];
second:=Buf[13];
if terminals[t].active = true then Buf[60]:= 1;
for i:=0 to 23 do
terminals[t].values[i] := Buf[14+i*2] + Buf[15+i*2]*256;
saveToDBDate(t,year,month,day,hour,minute,second);
end;
end
|