Go Down

Topic: [Arduino Yun] Come cambiare porta al webserver usando YunServer e YunClient ? (Read 6717 times) previous topic - next topic

gpb01

Premetto che con Linux sono praticamente a zero e quindi ... magari basta una banale modifica ad un file di configurazione che io non conosco, comunque ...

... ho visto, guardando un po' gli esempi, che, usando YunServer e YunClient, basta inviare da browser la richiesta :

Code: [Select]
http://ip_arduino/arduino/mio_testo

che la parte "mio_testo" arriva già bella pulita, senza tutti i fronzoli HTTP al mio programma attraverso un semplice ciclo client.read() e la risposta può essere, altrettanto semplicemente, inviata con un banale client.print("mia_risposta"). :)


Ora, chiaramente, la suddetta richiesta viene inviata dal browser utilizzando la porta standard HTTP 80 ...
... la mia necessità è di utilizzare un'altra porta, es. 8080 :)


Premetto che ho già visto che è possibile, in fase di istanza della classe YunServer scrivere :

Code: [Select]
YunServer mioServer(8080);

... ovvero indicargli la porta e la cosa, per la parte server, funziona ma purtroppo ... non funziona la parte della risposta del client, ovvero anche se la client.print() viene eseguita, sul browser arriva solo una pagina bianca ... come se la parte YunClient non sia stata informata della porta da usare.

Spero che il problema sia chiaro ... e il succo della domanda è quindi :

Usando le semplici due classi YunServer e YunClient, come fare per poter usare da browser un porta diversa dalla standard per inviare le richieste e ricevere le risposte  (es. http: // ip_arduino:8080 / arduino / mio_testo) ?

Grazie.

Guglielmo
Search is Your friend ... or I am Your enemy !

pablos71

se tu metti
Code: [Select]
YunServer mioServer(8080);
arduino lo chiamerai con
Code: [Select]
http://ip_arduino:8080/arduino/mio_testo
se ometti di scrivere la porta nella chiamata http://......... per default viene applicata la 80
non dovrebbe essere diverso da altri webserver ...
nel caso di risposta dovrai informare il router di reindirizzare i dati provenienti dalla porta 8080 sull IP di arduino

ciao
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

gpb01

Pablos,
forse non sono stato chiaro ...  :smiley-roll: ... ma se rileggi tutto il mio post, vedrai che è quello che ho fatto, però ...

... mentre alla parte YunServer basta che nell'istanza passi la porta, la parte YunClient sembra non accorgersene e NON invia la risposta sulla stessa porta, quindi la domanda è ... come configurare YunServer e YunClient in modo che usino un altra porta ?

Guglielmo
Search is Your friend ... or I am Your enemy !

PaoloP

Nel codice non vedo nessun passaggio di porta nel Client, eccetto per il connect.
--> https://github.com/arduino/Arduino/blob/ide-1.5.x/libraries/Bridge/src/YunClient.h

Come accade per la libreria Ethernet anche qui i client non sono univoci non avendo parametri che li caratterizzano.

gpb01

Difatti Paolo,
avevo guardato anche io il sorgente e ... mentre nella YunServer avevo chiaramente trovato il parametro per passare il "port" ... non riesco a capire come fare per rispondere dalla YunClient.

Prendendo come riferimento l'esempio "TemperatureWebPanel" si vede che il meccanismo d'uso delle due classi è veramente semplice ...

Code: [Select]
...
YunServer server;
...
YunClient client = server.accept();
...
if (client) {
    // read the command
    String command = client.readString();
...
client.print("<br>Current temperature: ");
client.print(temperature);
...


... e funziona perfettamente se non si cambia porta (ovvero si usa port 80 che è il default per il WebServer), ma, se si mette nella dichiarazione del server :

Code: [Select]
YunServer server(8080);

la parte di ricezione della richiesta dal browser sulla nuova porta arriva correttamente, mentre la risposta data dalla client.print() no :( :( :(

Guglielmo
Search is Your friend ... or I am Your enemy !

pablos71

Allora butta la yun è una ciofeca di scheda  ]:D ]:D ]:D
a parte scherzi sembra che per default ci sia la porta 5555 nella yunserver.h

Code: [Select]
class YunServer : public Server {
 public:
   // Constructor with a user provided BridgeClass instance
   YunServer(uint16_t port = 5555, BridgeClass &_b = Bridge);


le lib sono molto diverse dalla ethernet shield e non avendo la yun  tra le mani per fare esperimenti è difficile

cercando un po' ho trovato questo
Quote
To listen to commands from connected clients, you need to start the server by calling "server.begin()". "server.listenOnLocalhost()" forwards all local server communication to port 5555. Process allows you to call Linux commands through your sketch. Here, you'll execute the shell command "date" by calling "startTime.runShellCommand("date")", which will report the date and time the sketch started running.

fonte: http://blog.arduino.cc/2013/09/05/hands-on-the-arduino-yuns-bridge/

L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

gpb01


Allora butta la yun è una ciofeca di scheda  ]:D ]:D ]:D


Mah ... sai che invece la sto apprezzando ...  XD

E' che, indubbiamente, per sfruttare appieno alcune cose occorre conoscere bene Linux e ... mi manca  XD :smiley-mr-green: XD

Guglielmo
Search is Your friend ... or I am Your enemy !

pablos71

L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

gpb01

Grazie Pablos, capisco che senza scheda è molto difficile riuscire a trovare una soluzione ...  :smiley-roll:

La porta 5555 sembrerebbe usata "internamente" mentre, verso il mondo esterno, il webserver che gira nella parte Linux, parla HTTP sulla porta standard 80, tanto è vero che di base tutto funziona e con un qualsiasi browser, senza specificare nulla, accedi e ricevi le risposte :)

Se invece istanzi la classe YunServer così :

Code: [Select]
YunServer server(port);

accetti il protocollo HTTP invece che su port 80, sul "port" che specifichi e, provando, in effetti i dati arrivano, peccato poi che con la client.print() non riesci a rispondere e, sul browser, come risposta, ricevi sempre una pagina vuota :(

Guglielmo
Search is Your friend ... or I am Your enemy !

leo72

Ma non è che c'è un firewall dietro? Non è che la Linino, per motivi di sicurezza, è abilitata a parlare solo sulla 80?
Ho letto in giro che dovrebbe avercelo abilitato di default. mi pare che sia basato su iptables.

gpb01

Leo, se anche fosse, mi spieghi allora a cosa serve aver previsto la sintassi :

Code: [Select]
YunServer server(port);

che permettere la ricezione corretta di quello che si manda a :

Code: [Select]
http://ip_arduino:port/arduino/testo

... ovvero con la client.read() leggi la parola "testo" (provato e funziona) e poi però ... con la client.print() non puoi rispondere ???  :smiley-fat: :~ :smiley-fat:

Guglielmo
Search is Your friend ... or I am Your enemy !

leo72

Faccio un'ipotesi, non so come funzioni la Yun. Però i firewall funzionano sia in ingresso che in uscita.

pablos71

Mi spiace ci ho provato... risolvi al più presto perchè se no mi tocca comprare la yun  e sbatterci la testa :D :D :D
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

leo72

Ho trovato questo:
http://tavendo.com/blog/post/arduino-yun-with-autobahn/

qui parlano di un progetto basato sulla Yun che dovrebbe creare una comunicazione bidirezionale e accennano all aporta 8080. Non ho analizzato assolutamente il codice perché esula dalle mie conoscenze, però forse potrebbe aiutarti a capire meglio come risolvere il tuo problema.

pablos71

scusa puoi provare questo?
Code: [Select]
#include <Bridge.h>
#include <YunServer.h>
#include <YunClient.h>

#define PORT 6666
YunServer server(PORT);

void setup() {
  Serial.begin(115200);
  Bridge.begin();
  server.noListenOnLocalhost();
  server.begin();
}


void loop() {
  YunClient client = server.accept();

  if(client.connected()){
    String question = "What is your name?\n";
    client.write((uint8_t*)&question[0], question.length());
     
    String response;
    while(client.connected()){
      if(client.available()){
        char cmd = client.read();
        if(cmd == '\n'){
          break;
        } else {
          response += String(cmd);
        }
      }
    }
    response = "Bye "+response+"\n";
    client.write((uint8_t*)&response[0], response.length());
     
    client.stop();
  }

  delay(1000);
}


chiamandolo con l'apposita porta ... ho quasi l'impressione che sia il tuo client che rifiuta i messaggi diciamo "non autorizzati"
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

Go Up