Go Down

Topic: Serial proxy (Read 1 time) previous topic - next topic

aleale97

Ciao a tutti,
per fare economia ho deciso di trovare/fare/compilare un programma che mi consenta di richiedere dalla seriale il codice HTML di una pagina risiedente in internet.
Ho provato a cercare nell'arduino playground(http://arduino.cc/playground/Interfacing/SerialNet) ma purtroppo non ho trovato nulla che faccia al caso mio, o meglio:

  • Ho provato la Javaproxy ma in java non so proprio programmare e non sono riuscito neanche a compilare il codice  :smiley-sad-blue:

  • Ho provato Serialnet.pde ma come anche con il programma prima di lui nella lista richiede una connessione su una porta TCP/IP e sinceramente io chiedevo che l'arduino richiedesse quella connessione

  • Ho provato la SerialIP library ma non ha funzionato il codice di esempio sull'ultimo IDE arduino



se qualcuno riesce a trovare un programma che faccia al caso mio o riesce a risolvere/spiegare i miei problemi, scriva qui sotto :)

lesto

sicuramnte non basta il codice arduino, devi avere un "demone", ovvero un programma in ascolto di qualcosa (la seriale in questo caso), elabori le richieste e le ritrasmetta in rete.

Il programma Processing si occupa di fare da server, ovvero rimane in ascolto di una porta sul PC per connessioni in entrata, e ritrasmette tutto (in 2 direzioni) via seriale.

Da quello che ho capito invece tu vuoi fare da client: in questo caso, per rimanere su processing (che poi è un dialetto java) guarda i vari esempi che usano la classe Socket.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

uwefed

Non ho capito per cosa serve?
Con la complessitá delle pagine internet di oggi il trasferimento attraverso la seriale servirá perecchi secondi se non minuti.
Ciao Uwe

aleale97

Grazie per l'indirizzamento a lesto.
Beh serve per connettermi a una pagina di un mio server che ovviamente sarà scritta in php. Facendo richiedere all'arduino la pagina http://xxx.xxx.x.x/index.php?sen1=768&sen2=987 php restituirà un pagina bianca(e quindi l'arduino non dovrà "scaricare" nulla) e nel frattempo inserirà i valori in un database per poi mostrarli all'utente in un'altra pagina php che ha il semplice compito di mostrare l'array del database.
Se avete altre domande fatele pure :) Io nel frattempo vedo Socket...

aleale97

Non ho trovato la classe Socket in compenso però sono riuscito a trovare alcuni codici di example che messi insieme potrebbero fare al caso mio. Ho creato questi due codici:
ARDUINO:
Code: [Select]
String website = "www.google.it";
int result;

void setup()
{
Serial.begin(9600);
pinMode(13, OUTPUT);
pinMode(3, INPUT);
Serial.println(website);
}

void loop()
{
if (Serial.available() > 0) {
result = Serial.read();
if (result == 1) { digitalWrite(13, HIGH); }
else { digitalWrite(13, LOW); }
}

if (digitalRead(3) == HIGH) { Serial.print(website); delay(5000); }

}


PROCESSING:
Code: [Select]
import processing.serial.*;

Serial arduino;

String[] lines;

void setup() {
  //Inizializzo la seriale collegata all'arduino
arduino = new Serial(this, "COM3", 9600);
}

void draw()
{
//Metto lo sfondo verde per indicare che il server è in esecuzione
background(10,170,0);
//Finchè l'arduino mi da caratteri
while (arduino.available() > 0) {
   //Creo una stringa che li contenga tutti
    String inBuffer = arduino.readString();   
    //Se la stringa non è vuota
    if (inBuffer != null) {
      //Stampa la stringa
      println(inBuffer);
      //Mette lo sfondo a giallo
      background(230,230,0);
      //Prende la linea da internet
      lines = loadStrings(inBuffer);
      println(lines);
      //Stampa 1 se la prima linea è OK altrimenti 0
      if (lines[0] == "OK") { arduino.write(1); }
      else { arduino.write(0); }
     
    }
    //Altrimenti metti lo sfondo rosso e aspetta 5 secondi
    else { background(180,0,0); delay(5000); }
}


}


Il problema è che processing non riesce a ricevere la stringa dall'arduino, o meglio ne riceve solamente una parte. Nel primo caso in cui l'arduino scriveva a seriale nel caso non ricevesse OK da processing, esso riceveva caratteri incomprensibili e un pezzo di stringa. così ho aggiunto un pulsante in modo che srivesso dopo un po' solo all'input dell'utente in quanto pensavo che il problema fosse che processing non sapeva dove finiva la stringa ma anche qui ne predne solo un pezzo e poi ovviamente mi dice che il documento non è raggiungibile.
Qualche idea per fixare il problema?

per altro l'output di processing è questo:
Code: [Select]


WARNING:  RXTX Version mismatch
Jar version = RXTX-2.2pre1
native lib Version = RXTX-2.2pre2
www.g
null
The file "www.g" is missing or inaccessible, make sure the URL is valid or that the file has been added to your sketch and is readable.
Exception in thread "Animation Thread" java.lang.NullPointerException
at sketch_apr22b.draw(sketch_apr22b.java:51)
at processing.core.PApplet.handleDraw(Unknown Source)
at processing.core.PApplet.run(Unknown Source)
at java.lang.Thread.run(Thread.java:662)

uwefed

Non ho ancora capito a cosa serve Arduino in tutto questo. Non puoi farlo col PC e spedire dati letti del Arduino via USB/seriale al PC?
Ciao Uwe

lesto

allora, partiamo dalla fine. Il WARNING non è assolutamente un problema, non te ne preoccupare.

Quote
Il problema è che processing non riesce a ricevere la stringa dall'arduino, o meglio ne riceve solamente una parte

certo, leggi quella che è arrivata fino a quel momento. la stessa cosa ti capiterà con internet, anzi addirittura in modo più evidente.


Usa un carattere per indicare che la stringa di arrivo è finita, e il processing dovrà concatenare le stringhe finché non rileva quel carattere: a quel punto può inviare la richiesta. di solito come carattere si usa il '\n', che poi vuol dire "a capo" (invio, per intenderci)

se vuoi fare una richiesta HTTP, allora in java (e quindi probabilmente anche in processing) puoi usare la classe "HttpURLConnection", ed ecco un esempio (in java, ma portarlo in processing dovrebbe essere poco più di un copi-incolla) http://digiassn.blogspot.it/2008/10/java-simple-httpurlconnection-example.html
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

aleale97

Lo scopo si tutto questo è poter accedere ai valori dell'arduino semplicemente connettendomi al mio server casalingo... lesto, non ho capito molto bene come mettere in atto questa cosa, ho capito che processing deve trovare lo /n e mettere in coda la stringa ma nulla più di altro.. Un esempio  :)?

lesto

l'esempio chge ti ho postato fa la stessa cosa, però con il "carattere" null...
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

aleale97

#9
Apr 25, 2012, 12:10 pm Last Edit: Apr 25, 2012, 12:18 pm by aleale97 Reason: 1
effettivamente processing riconosce il codice con una sola modifica :D
il problema è che mi da un errore:
Code: [Select]

Usage: PApplet <appletname>
For additional options, see the Javadoc for PApplet

Cercando su internet ho visto che questo errore significa una mancata inizializzazione del PApplet, appunto, e che quensto succede in processing quando non si importa una libreria quando si usa la porta seriale(cosa ovviamente relazionata al mio "progetto"), come potete leggere in inglese qui http://processing.org/discourse/beta/num_1225493511.html.
ho trovato anche un'altro link che sembra aver trovato un pezzo di codice funzionante. Questo:
Code: [Select]
http://forum.processing.org/topic/papplet-loaded-in-junit4-eclipse-does-nt-work ma utilizza eclipse e per fare tutt'altro che seriale da quello che ho capito.

EDIT:  viene dato questo errore quando non si specifica l'apertura di nessuna finestra e quindi processing da l'errore. Rimettendo nel codice la solita strittura:
Code: [Select]

void setup()
{
size(200,200);

//INIZIO CODICE

//FINE CODICE
}
void draw()
{

}


mi da altri errori quindi il PApplet non è più il problema.
Se qualcuno mi aiuta a collegare le soluzioni mi fa un favore :)

lesto

ma ce l'hai la java JDK? se no installala. poi reinstalla processing. Se anche gli esempi base non compilano, è per forza un'errore di installazione o dipendenze.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

aleale97

Interessante, ora gli errori cambiano:

  • Se copio e incollo il codice mi sa semplicemente processing.app.SketchException: unexpected token: package

  • Se rimuovo package com.digiassn.blogspot; l'errore diventa Usage: PApplet <appletname>, ma se includo il codice nella prassi(void setup, void draw) mi restituisce Illegal modifier for the local class SimpleHTTPRequest, only abstract or final is permitted



Purtroppo qui non posso neanche tentare di risolverli gli errori perchè non capisco dove stanno gli stessi... Ancora chiedo a voi sommi :D... Grazie mille ancora.

lesto

non hai un'installazione fatta bene, non arriverai mai a risolverli
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Go Up