Pages: [1]   Go Down
Author Topic: Gelöst: Client/Server Problem  (Read 411 times)
0 Members and 1 Guest are viewing this topic.
Mönchengladbach, Germany
Offline Offline
Full Member
***
Karma: 6
Posts: 140
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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
« Last Edit: August 04, 2012, 10:58:28 am by eberduino » Logged

Oscar Wilde: "Am Ende wird alles gut, und wenn es noch nicht gut ist - ist es nicht das Ende."  

CH
Offline Offline
God Member
*****
Karma: 19
Posts: 704
Book Writer "Arduino Praxiseinstieg"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Code:
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");
Logged

Mönchengladbach, Germany
Offline Offline
Full Member
***
Karma: 6
Posts: 140
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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.

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();
    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
Logged

Oscar Wilde: "Am Ende wird alles gut, und wenn es noch nicht gut ist - ist es nicht das Ende."  

Mönchengladbach, Germany
Offline Offline
Full Member
***
Karma: 6
Posts: 140
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:

Code:
/**************************************************************
 * 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
Logged

Oscar Wilde: "Am Ende wird alles gut, und wenn es noch nicht gut ist - ist es nicht das Ende."  

Pages: [1]   Go Up
Jump to: