UDP a port w Wireshark

0

Napisałem prosty program (komponent INDY) do odbierania danych z mikrokontrolera esp32 program działa poprawnie ale po sprawdzeniu komunikacji w Wireshark okazało się że server komunikuje się i używa losowego portu

procedure TForm1.Button1Click(Sender: TObject);
 begin
   IdUDPClient1.Send('192.168.4.1',4444,'00FFR01010000');
 end;       

Wysyłanie zapytania do mikrokontrolera

procedure TForm1.FormCreate(Sender: TObject);
begin
  Edit1.Clear;
  Memo1.Clear;
  IdUDPClient1.Active:=True;
  
  IdUDPServer1.DefaultPort :=5555;
  IdUDPServer1.Active := true;  
   
 end;      


procedure TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
  const AData: TIdBytes; ABinding: TIdSocketHandle);
  var
  sText: string; 
begin
  Memo1.Lines.Add(ABinding.PeerIP);
  SetString(Stext, PAnsiChar(@AData[0]), Length(AData));
  Form1.Memo1.Lines.Add(sText);

end; 

Odbieranie komunikacji z mikrokontrolera

Frame 27: 57 bytes on wire (456 bits), 57 bytes captured (456 bits) on interface \Device\NPF_{E3F3B902-E81E-44FD-AF4B-9874D3D2B269}, id 0
Ethernet II, Src: CloudNet_9eef (f8d23d:ef), Dst: Espressi_3c99 (94c6ee:99)
Internet Protocol Version 4, Src: 192.168.4.2, Dst: 192.168.4.1
User Datagram Protocol, Src Port: 50680, Dst Port: 4444
Source Port: 50680
Destination Port: 4444
Length: 23
Checksum: 0x628c [unverified]
[Checksum Status: Unverified]
[Stream index: 0]
[Timestamps]
UDP payload (15 bytes)
Data (15 bytes)

Dlaczego Source Port: to port 50680 a nie 5555 tak jak ja chciałem ?

Dodam ze aplikacja napisana przez producenta na tym samym komputerze komunikuje się na poprawnych portach 4444 i 5555

3

Port 5555 ustawiłeś dla IdUDPServer1, a dane wysyłasz przez IdUDPClient1

0
grzegorz_so napisał(a):

Port 5555 ustawiłeś dla IdUDPServer1, a dane wysyłasz przez IdUDPClient1

Tak to się zgadza:

192.168.4.2 --> 192.168.4.1 port 4444

IdUDPClient1.Send('192.168.4.1',4444,'00FFR01010000');

ale dlaczego podczas wysyłania wiadomości Source Port: 50680 a nie 5555 ?

Odpowiedz z mikrokontrolera przychodzi poprawnie na adresie 192.168.4.255
komunikacja jest przez producenta z góry ustawiona na portach 5555 i 4444

Frame 514: 69 bytes on wire (552 bits), 69 bytes captured (552 bits) on interface \Device\NPF_{E3F3B902-E81E-44FD-AF4B-9874D3D2B269}, id 0
Ethernet II, Src: Espressi_3c99 (94c6ee:99), Dst: Broadcast (ffffff:ff)
Internet Protocol Version 4, Src: 192.168.4.1, Dst: 192.168.4.255
User Datagram Protocol, Src Port: 4444, Dst Port: 5555
Source Port: 4444
Destination Port: 5555
Length: 35
Checksum: 0x127d [unverified]
[Checksum Status: Unverified]
[Stream index: 5]
[Timestamps]
UDP payload (27 bytes)
Data (27 bytes)
Data: 023031303072303130313041202020302e3030306b673030030d0a
[Length: 27]

1

Prawdopodobnie dlatego, że:

Port 5555 ustawiłeś dla IdUDPServer1, a dane wysyłasz przez IdUDPClient1

2

Już wiem co robiłem źle powinienem ustawić port z którego chce wysyłać czyli:

IdUDPClient1.BoundPort:=5555;

i port na który chce wysyłać czyli

IdUDPClient1.Port:=4444;

Teraz wszystko działa

  IdUDPClient1.Port:=4444;
  IdUDPClient1.BoundIP:='192.168.4.2';
  IdUDPClient1.BoundPort:=5555;
  IdUDPClient1.Active:=True; 

Wireshark wyświetla wszystko poprawnie

Frame 150: 57 bytes on wire (456 bits), 57 bytes captured (456 bits) on interface \Device\NPF_{E3F3B902-E81E-44FD-AF4B-9874D3D2B269}, id 0
Ethernet II, Src: CloudNet_9eef (f8d23d:ef), Dst: Espressi_3c99 (94c6ee:99)
Internet Protocol Version 4, Src: 192.168.4.2, Dst: 192.168.4.1
User Datagram Protocol, Src Port: 5555, Dst Port: 4444
Source Port: 5555
Destination Port: 4444
Length: 23
Checksum: 0x12d2 [unverified]
[Checksum Status: Unverified]
[Stream index: 28]
[Timestamps]
UDP payload (15 bytes)
Data (15 bytes)

0

Podczas wysyłania wiadomości do kontrolera napotkałem na problem z którym nie mogę sobie poradzić.

procedure TForm1.Button1Click(Sender: TObject);
 begin
   IdUDPClient1.Send('192.168.4.1',4444,'00FFR01010000');
 end;    

podczas wysyłania komunikatu z większa szybkością np. 200ms nie dostaje żadnej odpowiedzi w IdUDPServer1UDPRead. Moim rozwiązaniem jest dodanie sleep(500); i czekanie aż kontroler wyśle odpowiedz.

procedure TForm1.Button1Click(Sender: TObject);
 begin
   IdUDPClient1.Send('192.168.4.1',4444,'00FFR01010000');
   sleep(500);
 end; 

ale to z kolei bardzo zamula cały program.

Czy możecie mi doradzić inne rozwiązanie?

Do odczytywania używam

procedure TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
  const AData: TIdBytes; ABinding: TIdSocketHandle);
  var
  sText: string; 
begin
  Memo1.Lines.Add(ABinding.PeerIP);
  SetString(Stext, PAnsiChar(@AData[0]), Length(AData));
  Form1.Memo1.Lines.Add(sText);

end; 
2
  1. z tego co piszesz wynika że problem jest w tym że mikrokontroler potrzebuje jakiegoś czasu aby odesłać odpowiedź, a Twój kod nie czeka na odpowiedź wystarczająco długo ..
  2. piszesz "podczas wysyłania komunikatu z większa szybkością np. 200ms" ... Nie wysyłasz z większą szybkością tylko po wysłaniu wstawiasz opóżnienie 200 ms. A to nie to samo
0
grzegorz_so napisał(a):
  1. z tego co piszesz wynika że problem jest w tym że mikrokontroler potrzebuje jakiegoś czasu aby odesłać odpowiedź, a Twój kod nie czeka na odpowiedź wystarczająco długo ..
  2. piszesz "podczas wysyłania komunikatu z większa szybkością np. 200ms" ... Nie wysyłasz z większą szybkością tylko po wysłaniu wstawiasz opóżnienie 200 ms. A to nie to samo

pisząc większa szybkość miałem na myśli Timer ustawiony na np 200ms

procedure TForm2.Timer3Timer(Sender: TObject);
begin
   IdUDPClient1.Send('192.168.4.1',4444,'00FFR01010000');
   sleep(500);
end;   
1

Masz problem z synchronizacją czasową wysłania pakietu i odbioru odpowiedzi. Pokaż więcej kodu. Bez tego trudno znaleźć wyjaśnienie problemu

0
grzegorz_so napisał(a):

Masz problem z synchronizacją czasową wysłania pakietu i odbioru odpowiedzi. Pokaż więcej kodu. Bez tego trudno znaleźć wyjaśnienie problemu

procedure TForm1.Button1Click(Sender: TObject);
begin
  form1.Timer1.Enabled:=True;
end;

procedure TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
  const AData: TIdBytes; ABinding: TIdSocketHandle);
begin
     Memo1.Lines.Add(DateTimeToStr(now)+'  '+ ABinding.PeerIP    +'      '+BytesToString(AData));
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
    try
       try


         IdUDPClient1.Active:=True;
         IdUDPServer1.Active := true;

    if IdUDPServer1.Active then

    IdUDPClient1.Send('10.31.12.90',4445,'00FFR01010000');
    Sleep(200);


        except

             end;
       finally

     IdUDPServer1.Active := false;
     IdUDPServer1.Bindings.Clear;
     IdUDPClient1.Active:=False;

   end;


end;

end. 

właśnie znalazłem problem rozłączałem połączanie z serwerem przed odebraniem wiadomości, już działa dzięki za naprowadzenie grzegorz_so

    IdUDPServer1.Active := false;
     IdUDPServer1.Bindings.Clear;
     IdUDPClient1.Active:=False;
0

Sformatowałem Twój kod... totalny bałagan i brak logiki
W sekcji Finally dezaktywujesz IdUDPServer1 i oczekujesz że coś coś odbierze ?

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  try
    try

      IdUDPClient1.Active := True;
      IdUDPServer1.Active := True;
      if IdUDPServer1.Active then
        IdUDPClient1.Send('10.31.12.90', 4445, '00FFR01010000');
      Sleep(200);
    except
    end;
  finally
    IdUDPServer1.Active := false;
    IdUDPServer1.Bindings.Clear;
    IdUDPClient1.Active := false;
  end;
end;

spróbuj tak ....

procedure TForm1.Timer1Timer(Sender: TObject);
begin
    try
      IdUDPClient1.Active := True;
      IdUDPServer1.Active := True;
      IdUDPClient1.Send('10.31.12.90', 4445, '00FFR01010000');
    except
      // obsługa wyjątku 
    end;
end;

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