Program do komunikacji z serwerem iBox i odczyt z UDP – co robię źle?

0

Piszę mały program do komunikacji z serwerem iBox (taka mała skrzyneczka do zarządzania żarówkami)
Komunikuje się z tym po UDP

Robię tak

var
  x,yy: TidBytes;
  I : byte;
  temp: string;
  dataLen : integer;

begin
  temp := '130000000a03d3ea11f0fe6bbb6862';

  SetLength(x, length(temp) div 2);
  i:= 0;
  while temp <> '' do
  begin

    x[I] := StrToInt('$' + copy(temp,1,2));
    inc(I);
    delete(temp,1,2);
  end;

  IdUDPClient1.Host := '192.168.2.105';
  IdUDPClient1.Port := 5987;

  IdUDPClient1.Active := true;

  IdUDPClient1.SendBuffer(x);

 sleep(100);

 SetLength(yy,100);
 dataLen:=idUDPclient1.ReceiveBuffer(yy,sizeOf(yy));

Zamieniam string na tablicę bajtów (przy okazji jak można to zrobić łatwiej?)
Wysyłam tablicę bajtów
Serwer odpowiada tablicą bajtów (wiem po sprawdzam pakiety programem WireShark)
ale u mnie zawsze dataLen = 0 oraz yy = puste

Poradzicie co robię źle?

0

W tak małym i prostym programie raczej nie ma to znaczenia, jednak to:

while temp <> '' do
begin
  x[I] := StrToInt('$' + copy(temp,1,2));
  inc(I);
  delete(temp,1,2);
end;

jest najgorszym możliwym sposobem ”iteracji” po ciągu znaków. Ciągle usuwasz fragment łańcucha, a więc sprawiasz, że menedżer pamięci najpewniej ciągle realokuje pamięć dla tego ciągu. Bardzo nieefektywne rozwiązanie, choć jak najbardziej działające poprawnie.

pele2 napisał(a):

Zamieniam string na tablicę bajtów (przy okazji jak można to zrobić łatwiej?)

To czego używasz raczej jest łatwe (krótkie i zrozumiałe). Łatwiej może i można, ale efektywniej na pewno. ;)


Jeśli chodzi o komunikację po UDP to nie niczego nie doradzę – nie znam za bardzo tego tematu, więc nie chcę Cię wprowadzać w błąd sugestiami z wyszukiwarki.

0

może po prostu urządzenie nie zdąży odpowiedzieć w 100ms - zwiększ czas pomiędzy wysłaniem a odbiorem

0

Abrakadaber moze miec racje. Znalazlem takie cos przy podobnym przypadku:

Even if you have TIdUDPClient set up properly, 50ms is a very short amount of time to wait for data to arrive, so ReceiveBuffer() could simply be timing out. Try using a larger timeout value, at least a few seconds worth.

0

Wiecie co? dziwna sprawa. Zauważyłem że mam odpowiedzi ale nie za każdym razem.
Zmieniam czasy długi i krótkie i chyba nie ma to znaczenia.
Odczyt zamknąłem w pętli co 500 ms i za drugim lub trzecim razem mam odpowiedź,

0
Pele2 napisał(a):

Odczyt zamknąłem w pętli co 500 ms i za drugim lub trzecim razem mam odpowiedź,

IMO pasuje to do tego, co zacytował @karpov:

karpov napisał(a):
Try using a larger timeout value, at least a few seconds worth.

Spróbuj ustawić timeout np. na trzy sekundy.

0

Jak już mówiłem przechwytuję pakiety w programie Wireshark i tak odpowiedź jest natychmiast
Moja pętla ma 10 iteracji (10 x 500 ms)
czasem za drugim razem mam odczyt a czasem po dziesięciu iteracjach pętla się kończy i nie ma odczytu.
A może tak się dzieje, bo po wysłaniu bajtów trzeba czyścić bufor, albo zamykać połączenie?

1 użytkowników online, w tym zalogowanych: 0, gości: 1