arduino ethernet shield

Hallo zusammen,

versuche aus dem Arduino mit dem Ethernet Shield einen SRCP Server (srcpd.sourceforge.net/srcp/) zu bauen.

Ein SRCP Client (z.B. RocRail, wiki.rocrail.net/doku.php?id=srcp-de) erwartet aber bevor er etwas sendet eine Antwort vom Server.

Client client = server.available(); gibt aber immer null zurück, solange der Client nichts gesendet hat.

Die Kommunikation sollte wie folgt aussehen: Client -> connect server via Socket (ohne etwas zu senden) Server -> sendet SRCP Protokoll "srcpd V2.0.6; SRCP 0.8.2" Client -> beginnt Kommunikation, Server antwortet (aber hier läufts!)

Was mir fehlt, ist eine Funktion um abzufragen ob der Client eine Socket-Verbindung zum Arduino aufgebaut hat.

Wäre um Ideen dankbar, ansonsten müsste ich den RocRail-SRCP Client umbauen.

Gruss Marcel

Ich gehe mal davon aus, dass du das hier getesetet hast und sicher bist, dass Clients zu dem Arduino connecten können: http://arduino.cc/en/Reference/ServerConstructor

Mein Verständnis ist, dass die Variable client solange null ist, bis sich ein Client auf dem Port verbunden hat... die Doku ist an dieser Stelle leider nicht ganz präzise, der return Wert ist nicht definiert...

Hallo zusammen,

was an paar ruhige Tage doch bewirken.

Problem gelöst, dazu musste ich allerdings Server.cpp in der Arduino Library um eine Methode connected erweitern.

Server.cpp
Client Server::connected()
{
accept();

for (int sock = 0; sock < MAX_SOCK_NUM; sock++) {
Client client(sock);
if (EthernetClass::_server_port[sock] == _port &&
client.status() == SOCK_ESTABLISHED) {

return client;
}
}

return Client(255);
}

Und hier mein funktionierender SRCP Server:
void loop()
{
// Warte auf einen Connection vom Client, dann Protocol senden und go!
while ( 1 )
{
Client client = remoteServer.connected();
if ( client )
{
client.println( “srcpd V1.0; SRCP 0.8.2” );
{
while ( client.connected() )
{
if ( client.available() )
{
int byte = client.read();
if ( byte != ‘\n’ )
{
command[pos] = byte;
pos++;
continue;
}
if ( byte == ‘\r’ )
continue;
command[pos] = ‘\0’;

char* rc = srcpServer->dispatch( command );
client.println( rc );
pos = 0;
}
}
client.stop();
client = 0;
}
}
delay( 100 );
}
}

Gruss
Marcel

Super gemacht! Kannst Du das dem Autor der Ethernet Lib zukommen lassen oder zumindest im internationalen Forum vorstellen? Ich bin sicher, dass das vielen helfen wird und man es in die nächste Release aufnehmen sollte. Toll wäre auch, wenn die Doku entsprechend erweitert würde.