Pregunta El cliente de Arduino Processing no carga el archivo al servidor PHP


Fondo Quiero sensores de presión (están funcionando) para activar la cámara incorporada y tomar una foto cuando el gato se va a la cama, subir la foto y enviarme un correo electrónico para que pueda ver la imagen en tiempo real en el sitio web.

Servidor PHP tengo un php server running  127.0.0.1:8080 en la raíz de esta estructura:

 NetworkedCat -->
                  data --> script-cat.php
                  index.html 
                  NetworkedCat.pde 
                  img.jpg
                  save2web.php
                  swiftmailer --> libs, etc

Pruebas en el navegador, save2web.php y cat-script.php funcionan, es decir, los scripts se cargan y envían por correo electrónico.

Arduino

La aplicación Arduino debería hacer lo siguiente:

  1. recibir una entrada de un sensor de presión
  2. verificar si se supera el umbral
  3. tomar foto de la cámara incorporada
  4. subir foto al sitio web
  5. enviar correo informando sobre la carga

El sensor de presión () también está leyendo e imprimiendo, y el umbral ha sido calibrado.

Pero NetworkedCat.pde NO es desencadenado por los eventos en serie.

Tenga en cuenta:

Procesamiento Arduino abre localhost en otro port 80, porque php server trabaja en 8080.

Si acorto el código de procesamiento y pruebo solo la captura y la captura de la imagen, funciona. entonces, el error debe estar relacionado con los eventos en serie.

¿Por qué el código de procesamiento a continuación no funciona?

/*Serial String reader
Context: Arduino

Reads in a string of characters until it gets a linefeed (ASCII 10).
then converts the string into a number
*/

import processing.serial.*;
import processing.video.*;
import processing.net.*;

Serial myPort;              //the serial port
float sensorValue = 0;      //the value form the sensor
float prevSensorValue = 0;  //previous value from the sensor
int threshold = 200;        //above this number, the cat is on the mat

int currentTime = 0;       //the current time as a single number
int lastMailTime = 0;      //last minute you sent a mail
int mailInterval = 60;     //minimum seconds betweeen mails
String mailUrl = "cat-script.php";
int lastPicture = 0;       //last minute you sent a picture
int lastPictureTime = 0;   //last minute you sent a picture
int pictureInterval = 10;  //minimum seconds between pictures

Capture myCam;            //camera capture library instance
String fileName = "img.jpg"; //file name for the picture

//location on your server for the picture script:
String pictureScriptUrl = "save2web.php";
String boundary = "----H4rkNrF"; //string boundary for the post request

Client thisClient;        //instance for the net library


//float xPos = 0;             //horizontal position of the graph
//float lastXPos = 0;         //previous horizontal position  



void setup(){
  size(400, 300);
  //list all the available serial ports
  println(Serial.list());

  myPort = new Serial(this, Serial.list()[7], 9600);

  //reads bytes into a buffer until you get a newline (ASCII 10);
  myPort.bufferUntil('\n');

  //set initial background and smooth drawing:
  background(#543174);
  smooth();
  //for a list of cameras on your computer, use this line:
  println(Capture.list());

  //use the default camera for capture at 30 fps
  myCam = new Capture(this, width, height, 30);
  myCam.start();
}

void draw(){
  //make a single number fmor the current hour, minute, and second
  currentTime = hour() * 3600 + minute() * 60 + second();

  if (myCam.available() == true) {
    //draw the camera image to the screen;
    myCam.read();
    set(0, 0, myCam);

    //get the time as a string
    String timeStamp = nf(hour(), 2) + ":" + nf(minute(), 2)
    + ":" + nf(second(), 2) + "   " + nf(day(), 2) + "-"
    + nf(month(), 2) + "-" + nf(year(), 4);

    //draw a dropshadow for the time text:
    fill(15);
    text(timeStamp, 11, height - 19);
    //draw the main time next
    fill(255);
    text(timeStamp, 10, height - 20);
  }
}

void serialEvent (Serial myPort){
  //get the ASCII string
  String inString = myPort.readStringUntil('\n');

  if (inString != null){
    //trim off any whitespace:
    inString = trim(inString);
    //convert to an int and map to the screen height
    sensorValue = float(inString);
    //println(sensorValue);
    sensorValue = map(sensorValue, 0, 1023, 0, height);
    println(sensorValue);

    if (sensorValue > threshold){
      if(currentTime - lastPictureTime > pictureInterval){
        PImage thisFrame = get();
        thisFrame.save(fileName);
        postPicture();
        lastPictureTime = currentTime;
      }
      //if the last reading was less than the threshold
      //then the cat just got on the mat
      if(prevSensorValue <= threshold){
        println("Cat is on the mat.");
        sendMail();
      }
    }
    else{
      //if the sensor value is less than the threshold,
      //and the previous value was greater, then the cat
      //just left the mat
      if (prevSensorValue > threshold){
        println("Cat is not on the mat.");
      }
    }
    //save the current value for the next time
    prevSensorValue = sensorValue;
  }
}


void sendMail(){
  //how long has passed since the last mail
  int timeDifference = currentTime - lastMailTime;

  if( timeDifference > mailInterval){
    String[] mailScript = loadStrings(mailUrl);
    println("results from mail script:");
    println(mailScript);

    //save the current minute for next time
    lastMailTime = currentTime;
  }
}

EDITAR:

Por exclusión, el error está en esta última función, pero todavía no lo he encontrado:

void postPicture(){
 //load the saved image into an array of bytes
  byte[] thisFile=loadBytes(fileName);


//open a new connection to the server
 thisClient = new Client(this, "localhost", 80);

//make an HTTP POST request:
thisClient.write("POST " + pictureScriptUrl + " HTTP/1.1\n");

thisClient.write("Host: localhost\n");

//tell the server you're sending the POST in multiple parts
//and send a unique string that will delineate the parts
thisClient.write("Content-Type: multipart/form-data; boundary=");

thisClient.write(boundary + "\n");


//form the beginning of the request
String requestHead ="--" + boundary + "\n";

requestHead +="Content-Disposition: form-data; name=\"file\"; ";
requestHead += "filename=\"" + fileName + "\"\n";
requestHead +="Content-Type: image/jpeg\n\n";


//form the end of the request
String tail="\n\n--" + boundary + "--\n";


//calculate and send the length of the total request
//including the head of the request, the file, and the tail
int contentLength = requestHead.length() + thisFile.length + tail.length();

 thisClient.write("Content-Length: " + contentLength + "\n\n");
 //send the header of the request, the file and the tail
 thisClient.write(requestHead);
 thisClient.write(thisFile);
 thisClient.write(tail);
 }

Esto es lo que se está planteando:

java.lang.NullPointerException
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
at    javax.imageio.stream.FileCacheImageOutputStream.close(FileCacheImageOutputStream.java:238)
at com.sun.imageio.stream.StreamCloser$CloseAction.performAction(StreamCloser.java:130)
at com.sun.imageio.stream.StreamCloser$1.run(StreamCloser.java:74)
at java.lang.Thread.run(Thread.java:745)

Suma un Not a Number excepción:

sensorValue = map(NaN, 1023, 0, height);

Mi sistema es Unix.


9
2017-10-06 01:57


origen


Respuestas:


Probablemente sea mejor hacer esta pregunta en Arduino versión específica de intercambio de pila.

Mi sugerencia Deja que Arduino Processing tome la foto (del gato). Y deja que cargue la imagen en la aplicación web PHP.

Luego, la aplicación web de PHP debería recibir la carga del archivo (la imagen) y enviar un correo electrónico a quienes deseen recibirla por correo electrónico.

enter image description here

Parece que está ejecutando el servidor PHP en el puerto 8080, entonces la aplicación Arduino Processing, ¡también necesita conectarse a ese puerto! Así que actualice su código para que el cliente se conecte al servidor:

El procesamiento Arduino (el cliente) necesita saber dónde se encuentra el servidor PHP en la red. Por lo tanto, necesita saber el nombre DNS o la dirección IP del servidor. Corrija la cadena "name-or-ip", en el siguiente código!

//open a new connection to the server
thisClient = new Client(this, "name-or-ip", 8080);

Propina: En caso de que Arduino Processing se esté ejecutando en la misma computadora que PHP Server, entonces "localhost" funcionará como conexión de servidor.


3
2017-10-15 05:30



String mailUrl debe incluir toda la cadena: "http://127.0.0.1:8080/cat-script.php", y no solo la ubicación del script cat-script.php relativo a root directorio.

también, hubo un error en el save2web.php script - no presente en esta pregunta, que impedía la carga de la imagen. move_uploaded_file($fileTempName, $path.fileName); no había incluido ".fileName")

todo funciona bien ahora


0
2017-10-29 00:08



Preguntas populares