Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: washburn - Giugno 01, 2020, 01:00:17 pm

Titolo: Errore "Socket Write Error" con TTCPClient e TCP server python
Inserito da: washburn - Giugno 01, 2020, 01:00:17 pm
Salve,

poichè ho la necessità di trasmettere i dati rilevati da un misuratore di potenza (SDM120C) via MQTT ad una dashboard Cayenne (per visualizzare i valori dei dati tramite degli indicatori "visuali", grafici ecc) ho pensato di "trasmettere" i dati via TCP dal Raspberry che legge i valori dal misuratore ad un'app scritta in Python che poi trasmette via MQTT i valori letti alla pagina Cayenne.
Pertanto ho cercato un semplice esempio di TCP server scritto in Python, l'ho copiato ed attivato.
Dopodichè ho scritto un semplice TCPCLient in Lazarus usando "fpSock, fpAsync" da un esempio trovato su internet.
Quando invio un semplice byte o una stringa mi appare l'errore "Socket Write Error" e non capisco perchè.
Questo è il codice Lazarus:

Codice: [Seleziona]
procedure TForm1.Button1Click(Sender: TObject);
var
  tC: TTCPClient;
  ClientEventLoop: TEventLoop;
begin

  ClientEventLoop:= TEventLoop.Create();

  tC:= TTCPClient.Create(nil);
  tC.EventLoop:= ClientEventLoop;
  tC.Host:='192.168.1.122';
  tC.Port:= 8080;
  tC.Active:= true;
  try
    //tC.Stream.WriteAnsiString('pippo');
    tC.Stream.WriteByte(65);
  except
    on E: Exception do
    begin
      ShowMessage(e.Message);
    end;
  end;
  tC.Active:= false;
  ClientEventLoop.Free;

end;

e questo quello in Python:

Codice: [Seleziona]
import socket
import sys

sock= socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_address= ('localhost', 8080)
sock.bind(server_address)
sock.listen(1)

while True:
    print >>sys.stderr, 'waiting...'
    connection, client_address= sock.accept()
    try:
        print >>sys.stderr, 'connection from ', client_address
        while True:
            data=connection.recv(100)
            print >>sys.stderr, 'received "%s"' % data
    finally:
        connection.close()


Cosa non sta funzionando?
Eventuali alternative?
Grazie, saluti.

Roberto
Titolo: Re:Errore "Socket Write Error" con TTCPClient e TCP server python
Inserito da: xinyiman - Giugno 01, 2020, 01:33:57 pm
Come prima cosa hai provato a vedere che il server python funziona come ti aspetti? Hai provato ad instaurare una sessione telnet per vedere che il server funzioni? Sfortunatamente non conosco python.
Titolo: Re:Errore "Socket Write Error" con TTCPClient e TCP server python
Inserito da: Stilgar - Giugno 01, 2020, 02:57:02 pm
Iniziamo dalle domande sceme (le mie).
Il processo pyton è attivo sul dispositivo target?
Così per rompere il ghiaccio, una domanda scema ;)

Stilgar
Titolo: Re:Errore "Socket Write Error" con TTCPClient e TCP server python
Inserito da: washburn - Giugno 01, 2020, 04:58:12 pm
@Stilgar: sì, il processo è attivo perchè visualizza un messaggio mentre attende che un client si connetta

@Xinyiman: in effetti con una sessione di telnet da pc non risponde...potrebbe essere quindi un problema lato python.

Verifico se ci sono altri snippets python relativi all'implementazione di un semplice TCP server.


Roberto
Titolo: Re:Errore "Socket Write Error" con TTCPClient e TCP server python
Inserito da: washburn - Giugno 01, 2020, 05:13:30 pm
Ho trovato ed era una boiata pazzesca...non mi ero accorto che il server ascoltava su "localhost" (127.0.0.1) mentre nel programma Lazarus (e la prova con Telnet) inviavo a 192.168.1.122.
E' bastato, ovviamente, sostituire "localhost" con l'indirizzo IP locale (server e client sono la stessa macchina).
Ma un'implementazione (decente) di MQTT è stata fatta in Lazarus?
Ne ho trovata una ma non è chiaro come installarla...
Grazie,

Roberto
Titolo: Re:Errore "Socket Write Error" con TTCPClient e TCP server python
Inserito da: Stilgar - Giugno 02, 2020, 09:20:11 am
https://github.com/ZiCog/mqtt-free-pascal
Ho trovato questo :)

Stilgar
Titolo: Re:Errore "Socket Write Error" con TTCPClient e TCP server python
Inserito da: washburn - Giugno 03, 2020, 09:52:11 am
Gli darò un'occhiata, grazie.


Roberto