Gelöst: Client/Server Problem

ich komme mit der client/server-verbindung zu einem Logitech Medien Server (LMS) nicht klar.

Aus einem Hauptprogramm wird das Unterprogrammvoid SqueezeboxPlay(String playlist) aufgerufen. Die mitgelieferte Playlist-Nummer wird dann in den Http-String eingebaut und an LMS übersandt. Funktioniert beim ersten Mal prima. beim zweiten Aufruf klappt alles nicht mehr: Fehlermeldung "keine Verbindung". Die Abfrage "if (clientOnline)..." wird beim 2. Durchlauf mit "1" also wahr be zurückgegeben.

Ich weiß mir keinen Rat mehr warum die folgenden Abfragen nicht funktionieren. Kann da mal jemnd drüberschauen??

Hier der Code:

void SqueezeboxPlay(String playlist)
{
  digitalWrite(chipSelectPin,HIGH);       // dectivate the RFID reader
  digitalWrite(chipSelectEth,LOW);        // activate the EthernetCard

  Serial.println(playlist);
  Serial.println(clientOnline);
  if (clientOnline)
  {
    client.println("GET /status?p0=playlist&p1=resume&p2="+playlist+"&" + player[2] + "HTTP/1.1");
    client.println();
  }
  else

  {
    if(!client.connect(server, 9002))
    {
      Ethernet.begin(mac, ip);// start the Ethernet connection
      delay(1000); // give the Ethernet shield a second to initialize
      Serial.println("connecting...");
    }

    // if you get a connection, report back via serial:
    if (client.connect(server, 9002)) {
      Serial.println("connected");
      client.println("GET /status?p0=playlist&p1=resume&p2="+playlist+"&" + player[2] + "HTTP/1.1");
      client.println();
      clientOnline=true;

    } 

    // if you didn't get a connection to the server:
    Serial.println("connection failed");
  }



  digitalWrite(chipSelectPin,LOW);        // activate the RFID reader
  digitalWrite(chipSelectEth,HIGH);       // deactivate the EthernetCard
}

Eberhard

Wie und wo wird "clientOnline" deklariert?

Die Fehlermeldung wird ausgegeben auch wenn die Verbindung funktioniert hat da kein else-Zweig vorhanden ist. Die Ausgabe erfolgt jeweils nach der if (client.connect(server, 9002))-Abfrage.
Tip: zum Testen in jedem if-Zweig eine eindeutige Ausgabe auf die serielle Schnittstelle senden um den Programmcode zu prüfen.

if(!client.connect(server, 9002))
    {
      Ethernet.begin(mac, ip);// start the Ethernet connection
      delay(1000); // give the Ethernet shield a second to initialize
      Serial.println("connecting...");
    }

    // if you get a connection, report back via serial:
    if (client.connect(server, 9002)) {
      Serial.println("connected");
      client.println("GET /status?p0=playlist&p1=resume&p2="+playlist+"&" + player[2] + "HTTP/1.1");
      client.println();
      clientOnline=true;

    } 

   // hier sollte der else-Fall ausgegeben werden

    // if you didn't get a connection to the server:
    Serial.println("connection failed");

Wie und wo wird "clientOnline" deklariert?

clientOnline wird ganz oben vor dem void setup() als: boolean clientOnline = false; deklariert.

Hier der geänderte Code.

Bei ersten mal läuft er über "connected" und bei allen weiteren über "Nachricht an LMS abgesandt". Die neue Kartennummer ist auch vorhanden - aber nichts rührt sich.

void SqueezeboxPlay(String playlist)
{
  digitalWrite(chipSelectPin,HIGH);       // dectivate the RFID reader
  digitalWrite(chipSelectEth,LOW);        // activate the EthernetCard

  Serial.println(playlist);
  Serial.println(clientOnline);
  if (clientOnline)
  {
    client.println("GET /status?p0=playlist&p1=resume&p2="+playlist+"&" + player[2] + "HTTP/1.1");
    client.println();
    Serial.println("Nachricht an LMS abgesandt");
  }
  else

  {
    if(!client.connect(server, 9002))
    {
      Ethernet.begin(mac, ip);// start the Ethernet connection
      delay(1000); // give the Ethernet shield a second to initialize
      Serial.println("connecting...");
    }

    // if you get a connection, report back via serial:
    if (client.connect(server, 9002)) {
      Serial.println("connected");
      client.println("GET /status?p0=playlist&p1=resume&p2="+playlist+"&" + player[2] + "HTTP/1.1");
      client.println();
      clientOnline=true;

    } 
else
   {
    Serial.println("connection failed");
  }
  }


  digitalWrite(chipSelectPin,LOW);        // activate the RFID reader
  digitalWrite(chipSelectEth,HIGH);       // deactivate the EthernetCard
}

Eberhard

Das Problem ist gelöst.

Um einen eindeutigen Status beim Verlassen der Sub zu haben, muss der Client angehalten werden.

Der richtige Code sieht jetzt so aus:

/**************************************************************
 * Routine um die Playlist mit der Kartennummer aufzurufen.
 */
void SqueezeboxPlay(String playlist)
{
  digitalWrite(chipSelectPin,HIGH);       // dectivate the RFID reader
  digitalWrite(chipSelectEth,LOW);        // activate the EthernetCard

  Serial.println(playlist);
    
if (client.connect(server, 9002))
  {
    //Serial.println(server);
    client.println("GET /status?p0=playlist&p1=resume&p2="+playlist+"&" + player[2] + "HTTP/1.1");
    client.println();
    Serial.println("Nachricht an LMS abgesandt "+playlist);
  }
  else

  {
    if(!client.connect(server, 9002))
    {
      Ethernet.begin(mac, ip);// start the Ethernet connection
      delay(2000); // give the Ethernet shield a second to initialize
      Serial.println("connecting...");
    }

    // if you get a connection, report back via serial:
    if (client.connect(server, 9002)) 
    {
      Serial.println("connected");
      client.println("GET /status?p0=playlist&p1=resume&p2="+playlist+"&" + player[2] + "HTTP/1.1");
      client.println();
    } 

else
   {
    Serial.println("connection failed");
       }
  }

  client.stop();
  digitalWrite(chipSelectPin,LOW);        // activate the RFID reader
  digitalWrite(chipSelectEth,HIGH);       // deactivate the EthernetCard
}

Danke an Webmeister für die Hinweise. Die Variable clientOnline hatte auch keinen Nährwert => wurde entfernt.

Eberhard