Показать сообщение отдельно
  #1  
Старый 22.11.2012, 10:11
DMBS DMBS вне форума
Прохожий
 
Регистрация: 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
Ответить с цитированием