после запуска "mvn install" я получаю сообщение об ошибке: "java .io.IOException: основной поток ввода возвратил ноль байтов" - PullRequest
0 голосов
/ 28 января 2020

Я разрабатываю программу на основе весенней загрузки и Arduino. В режиме разработки все работает нормально. Но при развертывании проекта с установкой и запуском mvn, читая отпечаток пальца, я получаю ошибку: java.io.IOException: Underlying input stream returned zero bytes. Я не вижу эту ошибку в режиме разработки. Я искал на этом форуме похожие проблемы, но ответы не помогли.

Может ли кто-нибудь мне помочь?

Полная трассировка стека:

java.io.IOException: Underlying input stream returned zero bytes
    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:288)
    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
    at java.io.InputStreamReader.read(InputStreamReader.java:184)
    at java.io.BufferedReader.fill(BufferedReader.java:161)
    at java.io.BufferedReader.readLine(BufferedReader.java:324)
    at java.io.BufferedReader.readLine(BufferedReader.java:389)
    at com.jtek.arduino.Serial.serialEvent(Serial.java:118)
    at gnu.io.RXTXPort.sendEvent(RXTXPort.java:772)
    at gnu.io.RXTXPort.eventLoop(Native Method)
    at gnu.io.RXTXPort$MonitorThread.run(RXTXPort.java:1641)

Мой Serial.java

package com.amede.arduino;

import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.Scanner;

public class Serial implements SerialPortEventListener {
    SerialPort serialPort;
        /** The port we're normally going to use. */
    private static final String PORT_NAMES[] = { 
            "/dev/tty.usbserial-A9007UX1", // Mac OS X
                        "/dev/ttyACM0", // Raspberry Pi
            "/dev/ttyUSB0", // Linux
            "COM4" // Windows marche pour mon pc
        //  "COM3" // Windows // Donc c'est ici le problème
    };
    /**
    * A BufferedReader which will be fed by a InputStreamReader 
    * converting the bytes into characters 
    * making the displayed results codepage independent
    */
    private BufferedReader input;
    /** The output stream to the port */
    private OutputStream output;
    /** Milliseconds to block while waiting for port open */
    private static final int TIME_OUT = 2000;
    /** Default bits per second for COM port. */
    private static final int DATA_RATE = 9600;

    //
    private int choixProgramme = 0;
    private String message = "";
    private int IDFingerPrint = 0;
    private String IDStored = "";
    private boolean verifier = false;
    private String IDVerify = "";
    //

    public String initialize() {
                // the next line is for Raspberry Pi and 
                // gets us into the while loop and was suggested here was suggested http://www.raspberrypi.org/phpBB3/viewtopic.php?f=81&t=32186
                //System.setProperty("gnu.io.rxtx.SerialPorts", "/dev/ttyACM0");

        CommPortIdentifier portId = null;
        Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();

        //First, Find an instance of serial port as set in PORT_NAMES.
        while (portEnum.hasMoreElements()) {
            CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement();
            for (String portName : PORT_NAMES) {
                if (currPortId.getName().equals(portName)) {
                    portId = currPortId;
                    break;
                }
            }
        }
        if (portId == null) {
            System.out.println("Could not find COM port.");
            message = "Lecteur d'empreinte digitale n'est pas connectée";
            return message;
        }

        try {
            // open serial port, and use class name for the appName.
            serialPort = (SerialPort) portId.open(this.getClass().getName(),
                    TIME_OUT);

            // set port parameters
            serialPort.setSerialPortParams(DATA_RATE,
                    SerialPort.DATABITS_8,
                    SerialPort.STOPBITS_1,
                    SerialPort.PARITY_NONE);

            // open the streams
            input = new BufferedReader(new InputStreamReader(serialPort.getInputStream()));
            output = serialPort.getOutputStream();

            // add event listeners
            serialPort.addEventListener(this);
            serialPort.notifyOnDataAvailable(true);
        } catch (Exception e) {
            System.err.println(e.toString());
        }
        return "";
    }

    /**
     * This should be called when you stop using the port.
     * This will prevent port locking on platforms like Linux.
     */
    public synchronized void close() {
        if (serialPort != null) {
            serialPort.removeEventListener();
            serialPort.close();
        }
    }

    /**
     * Handle an event on the serial port. Read the data and print it.
     */
    public synchronized void serialEvent(SerialPortEvent oEvent) {
        if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
            try {
                //String inputLine = input.readLine();
                String inputLine = input.readLine();
                if(!inputLine.isEmpty()) System.out.println(inputLine);
                Scanner user_input = new Scanner(System.in);

                // En attente des choix : 1 pour enregistrement, 2 pour vérification
                if(inputLine.equals("Menu du programme !")){ // choix du menu
                    System.out.print("En attente de choix : ");
                    if(choixProgramme != 0){
                        //byte id = user_input.nextByte();
                        int uint8 = choixProgramme & 0xFF; // convertir en uint8
                        output.write(uint8);
                        //close();
                    }
                }

                // Cas d'enregistrement
                if(inputLine.equals("Please type in the ID # (from 1 to 127) you want to save this finger as...")) {
                        System.out.print("En attente de ID : ");
                        //byte id = user_input.nextByte();
                    if (IDFingerPrint != 0) {
                        int uint8 = IDFingerPrint & 0xFF; // convertir en uint8
                        output.write(uint8);
                        //close();
                    }
                }

                // Erreur est survenue
                if(inputLine.contains("error")){
                    remiseAZero();
                    message = "Une erreur est survenue.";
                }

                // Empreinte enregistré
                if(inputLine.contains("Stored!")){
                    remiseAZero();
                    message = "Emreinte enregistrée avec succès";
                }

                // Empreintes non correspondant
                if(inputLine.contains("Fingerprints did not match")){
                    remiseAZero();
                    message = "Empreintes non correspondantes";
                }

                // Erreur de branchement
                if(inputLine.contains("Could not find fingerprint features")){
                    remiseAZero();
                    message = "error";
                }

                // Mettre à nouveau le doigt
                if(inputLine.equals("Remove finger")){
                    remiseAZero();
                    message = "Mettre à nouveau le doigt";
                }

                // Empreinte vérifiée
                if(inputLine.contains("Found ID #")){
                    remiseAZero();
                    verifier = true;
                    message = "Empreinte vérifiée avec succès";
                    IDVerify = inputLine;
                }

                /*if(verifier){
                    IDVerify = inputLine;
                }else {
                    verifier = false;
                }*/

                // Commnication error
                if(inputLine.contains("Communication error")){
                    remiseAZero();
                    message = "error";
                }

                // PORT COM introuvable
                if(inputLine.contains("Could not find COM port.")){
                    remiseAZero();
                    message = "Lecteur d'empreinte digitale n'est pas connectée";
                }

            } catch (Exception e) {
                System.err.println(e.toString());
            }
        }
        // Ignore all the other eventTypes, but you should consider the other ones.
    }

    /*public static void main(String[] args) throws Exception {
        Serial main = new Serial();
        main.initialize();
        Thread t=new Thread() {
            public void run() {
                //the following line will keep this app alive for 1000 seconds,
                //waiting for events to occur and responding to them (printing incoming messages to console).
                try {Thread.sleep(1000000);} catch (InterruptedException ie) {}
            }
        };
        t.start();
        System.out.println("Started");

    }*/

    /**
     * Permet de retourner la valeur de choixProgramme
     * @param c
     */
    public void setChoixProgramme(int c){
        choixProgramme = c;
    }

    /**
     *Permet de retourner la valeur de message
     * @return
     */
    public String getMessage(){

        /*if (IDFingerPrint == 0 && choixProgramme == 0){
            return  this.message;
        }*/
        return message;
    }

    /**
     *Permet de préciser la valeur de ID à enregistrer
     * @param idFingerPrint
     */
    public void setIDFingerPrint(int idFingerPrint){
        if(idFingerPrint <0 || idFingerPrint >128) return;
        this.IDFingerPrint = idFingerPrint;
    }

    /**
     * Remet les parametres de controles à zéro
     */
    public void remiseAZero(){
        // remise à zéro
        IDFingerPrint = 0;
        choixProgramme = 0;
        verifier = false;
    }

    /**
     * Permet de récupérer le ID lors de la vérification
     * @return
     */
    public String getIDVerify() {
        return IDVerify;
    }
}

код arduino

     #include <Adafruit_Fingerprint.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
uint8_t id;
uint8_t choix;
uint8_t verifier; // pour vérifier si la vérification est finie.

void setup()  
{
  Serial.begin(9600);
  while (!Serial);  // For Yun/Leo/Micro/Zero/...
  delay(100);
  Serial.println("\n\nConnecté");

  // set the data rate for the sensor serial port
  finger.begin(57600);

  if (finger.verifyPassword()) {
    Serial.println("Found fingerprint sensor!");
  } else {
    Serial.println("Did not find fingerprint sensor :");
    while (1) { delay(1); }
  }
}


uint8_t readnumber(void) {
  uint8_t num = 0;
  while (num == 0) {
    while (! Serial.available());
    //num = Serial.parseInt();
    num = Serial.read(); // pour lire les output de java
    Serial.print("Données reçues : ");
    Serial.println(num);
  }
  return num;
}


uint8_t readchoice(void) {
  uint8_t num = 0;
  while (num == 0) {
    while (! Serial.available());
    //num = Serial.parseInt();
    num = Serial.read(); // pour lire les output de java
    Serial.println("Données reçues : ");
    Serial.println(num);
  }
  return num;
}


void loop()                     // run over and over again
{
  // Pour le menu
  Serial.println("Menu du programme !");
  Serial.println("Entrer 1 pour enregistrement et 2 pour vérification");
  choix = readchoice();
  if(choix == 0){ // Choix invalide
  return;
  }
  // Choix réussi
  if(choix == 1){ // cas 1 : enregistrement
   Serial.println("Ready to enroll a fingerprint!");
  Serial.println("Please type in the ID # (from 1 to 127) you want to save this finger as...");
  id = readnumber();

  if (id == 0) {// ID #0 not allowed, try again!
     return;
  }
  Serial.print("Enrolling ID #");
  Serial.println(id);

  while (!  getFingerprintEnroll() ); 
  } // ./ Fin du cas 1 : enregistrement

  if(choix == 2){ // cas 2 : vérification 
    verifier = 0;
    //getFingerprintIDez();
               //don't ned to run this at full speed.
    while(verifier == 0){
   getFingerprintIDez();
   delay(50);
      };
    //if(getFingerprintIDez() != -1) return;

   } // ./ fin du cas 2 : vérification

}






/* 
Zone des fonctions nécessaires
*/

// Pour l'enregistrement
uint8_t getFingerprintEnroll() {
  int p = -1;
  Serial.print("Waiting for valid finger to enroll as #"); Serial.println(id);
  while (p != FINGERPRINT_OK) {
    p = finger.getImage();
    switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image taken");
      break;
    case FINGERPRINT_NOFINGER:
      Serial.println(".");
      break;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      break;
    case FINGERPRINT_IMAGEFAIL:
      Serial.println("Imaging error");
      break;
    default:
      Serial.println("Unknown error");
      break;
    }
  }
// OK success!
  p = finger.image2Tz(1);
  switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image converted");
      break;
    case FINGERPRINT_IMAGEMESS:
      Serial.println("Image too messy");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      return p;
    case FINGERPRINT_FEATUREFAIL:
      Serial.println("Could not find fingerprint features");
      return p;
    case FINGERPRINT_INVALIDIMAGE:
      Serial.println("Could not find fingerprint features");
      return p;
    default:
      Serial.println("Unknown error");
      return p;
  } // First read

Serial.println("Remove finger");
  delay(2000);
  p = 0;
  while (p != FINGERPRINT_NOFINGER) {
    p = finger.getImage();
  }
  Serial.print("ID "); Serial.println(id);
  p = -1;
  Serial.println("Place same finger again");
  while (p != FINGERPRINT_OK) {
    p = finger.getImage();
    switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image taken");
      break;
    case FINGERPRINT_NOFINGER:
      Serial.print(".");
      break;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      break;
    case FINGERPRINT_IMAGEFAIL:
      Serial.println("Imaging error");
      break;
    default:
      Serial.println("Unknown error");
      break;
    }
  }

  // OK success!
  p = finger.image2Tz(2);
  switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image converted");
      break;
    case FINGERPRINT_IMAGEMESS:
      Serial.println("Image too messy");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      return p;
    case FINGERPRINT_FEATUREFAIL:
      Serial.println("Could not find fingerprint features");
      return p;
    case FINGERPRINT_INVALIDIMAGE:
      Serial.println("Could not find fingerprint features");
      return p;
    default:
      Serial.println("Unknown error");
      return p;
  }


  // OK converted!
  Serial.print("Creating model for #");  Serial.println(id);

  p = finger.createModel();

  if (p == FINGERPRINT_OK) {
    Serial.println("Prints matched!");
  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    Serial.println("Communication error");
    return p;
  } else if (p == FINGERPRINT_ENROLLMISMATCH) {
    Serial.println("Fingerprints did not match");
    return p;
  } else {
    Serial.println("Unknown error");
    return p;
  }

  Serial.print("ID "); Serial.println(id);
  p = finger.storeModel(id);
  if (p == FINGERPRINT_OK) {
    Serial.println("Stored!");
    Serial.println(id);
  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    Serial.println("Communication error");
    return p;
  } else if (p == FINGERPRINT_BADLOCATION) {
    Serial.println("Could not store in that location");
    return p;
  } else if (p == FINGERPRINT_FLASHERR) {
    Serial.println("Error writing to flash");
    return p;
  } else {
    Serial.println("Unknown error");
    return p;
  }   
}
// ./ fin pour l'enregistrement



// Pour la vérification
uint8_t getFingerprintID() {
  uint8_t p = finger.getImage();
  switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image taken");
      break;
    case FINGERPRINT_NOFINGER:
      Serial.println("No finger detected");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      return p;
    case FINGERPRINT_IMAGEFAIL:
      Serial.println("Imaging error");
      return p;
    default:
      Serial.println("Unknown error");
      return p;
  }

  // OK success!

  p = finger.image2Tz();
  switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image converted");
      break;
    case FINGERPRINT_IMAGEMESS:
      Serial.println("Image too messy");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      return p;
    case FINGERPRINT_FEATUREFAIL:
      Serial.println("Could not find fingerprint features");
      return p;
    case FINGERPRINT_INVALIDIMAGE:
      Serial.println("Could not find fingerprint features");
      return p;
    default:
      Serial.println("Unknown error");
      return p;
  }

  // OK converted!
  p = finger.fingerFastSearch();
  if (p == FINGERPRINT_OK) {
    Serial.println("Found a print match!");
  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    Serial.println("Communication error");
    return p;
  } else if (p == FINGERPRINT_NOTFOUND) {
    Serial.println("Did not find a match");
    return p;
  } else {
    Serial.println("Unknown error");
    return p;
  }   

  // found a match!
  Serial.print("Found ID #"); Serial.print(finger.fingerID); 
  Serial.print(" with confidence of "); Serial.println(finger.confidence); 
  verifier = 1;

  return finger.fingerID;
}

// returns -1 if failed, otherwise returns ID #
int getFingerprintIDez() {
  uint8_t p = finger.getImage();
  if (p != FINGERPRINT_OK)  return -1;

  p = finger.image2Tz();
  if (p != FINGERPRINT_OK)  return -1;

  p = finger.fingerFastSearch();
  if (p != FINGERPRINT_OK)  return -1;

  // found a match!
  Serial.print("Found ID #"); Serial.print(finger.fingerID); 
  Serial.print(" with confidence of "); Serial.println(finger.confidence);
  verifier = 1;
  return finger.fingerID; 
}
// ./ Fin pour la vérification

В моем контроллере с пружинной загрузкой

 @RequestMapping(value = "/mouvement", method = RequestMethod.POST)
    public @ResponseBody HashMap<String, String> notifierArriver(HttpSession httpSession, Principal principal){
        HashMap<String, String> responseBody = new HashMap<>();
        // Arduino
        Serial main = new Serial();
        String portCOM = main.initialize();
        Thread t=new Thread() {
            public void run() {
                //the following line will keep this app alive for 1000 seconds,
                //waiting for events to occur and responding to them (printing incoming messages to console).
                try {Thread.sleep(1000);} catch (InterruptedException ie) {}
            }
        };
        t.start();
        System.out.println("Started");
        if(portCOM.contains("Lecteur d'empreinte digitale n'est pas connectée")){
            responseBody.put("msg",portCOM);
            main.remiseAZero();
            main.close();
            return  responseBody;
        }
        main.setChoixProgramme(2); // verification
        while (true){
            if(main.getMessage().contains("Empreinte vérifiée avec succès")){
                responseBody.put("msg",main.getMessage());
                String id = getIDVerifyFromMessage(main.getIDVerify());
                responseBody.put("id", id);
                Collaborateur collaborateur = collaborateurRepository.getCollaborateurByEmpreinte(id);
                if (collaborateur != null){
                    System.out.println("Collaborateur bien trouvé");
                    Presence p = presenceRepository.getPresenceByDateAndCollaborateur(LocalDate.now(),collaborateur.getIdCollaborateur());
                    responseBody.put("nom", collaborateur.getNom());
                    responseBody.put("prenoms",collaborateur.getPrenom());
                    responseBody.put("grade", collaborateur.getTitreCollaborateur());
                    if( p!= null){ // Les 3 cas qu'il reste

                        // cas où tous les mouvements sont faits
                        if(p.getFinie()){
                            responseBody.put("tout_est_fini","oui");
                            responseBody.put("heure_debut_premier_mvt",getLocaltimeEnLettre(p.getHeureDebutPremierMouvement()));
                            responseBody.put("heure_fin_premier_mvt",getLocaltimeEnLettre(p.getHeureFinPremierMouvement()));
                            responseBody.put("heure_debut_second_mvt",getLocaltimeEnLettre(p.getHeureDebutSecondMouvement()));
                            responseBody.put("heure_fin_second_mvt",getLocaltimeEnLettre(p.getHeureFinSecondMouvement()));
                        }
                        if(p.getHeureFinPremierMouvement() == null){ // Notifier départ du premier mouvement
                            p.setHeureFinPremierMouvement(LocalTime.now());
                            p.setDureeTotal(getDureeEffectuee(p.getHeureDebutPremierMouvement(),LocalTime.now()));
                            responseBody.put("heure_debut_premier_mvt",getLocaltimeEnLettre(p.getHeureDebutPremierMouvement()));
                            responseBody.put("heure_fin_premier_mvt",getLocaltimeEnLettre(LocalTime.now()));
                            System.out.println("Enregistré heure de départ du premier mouvement.");
                        }else if(p.getHeureDebutSecondMouvement() == null){ // Notifier arrivée du second mouvement
                            p.setHeureDebutSecondMouvement(LocalTime.now());
                            responseBody.put("heure_debut_premier_mvt",getLocaltimeEnLettre(p.getHeureDebutPremierMouvement()));
                            responseBody.put("heure_fin_premier_mvt",getLocaltimeEnLettre(p.getHeureFinPremierMouvement()));
                            responseBody.put("heure_debut_second_mvt",getLocaltimeEnLettre(LocalTime.now()));
                            System.out.println("Enregistré heure d'arrivée du second mouvement.");
                        }else if(p.getHeureFinSecondMouvement() == null){ // Notifier départ du second mouvement
                            p.setHeureFinSecondMouvement(LocalTime.now());
                            LocalTime dureeEffectueeSecond = getDureeEffectuee(p.getHeureDebutSecondMouvement(),p.getHeureFinSecondMouvement());
                            LocalTime dureeTotale = additionLocalTime(p.getDureeTotal(),dureeEffectueeSecond);
                            p.setFinie(true);
                            p.setDureeTotal(dureeTotale);
                            responseBody.put("heure_debut_premier_mvt",getLocaltimeEnLettre(p.getHeureDebutPremierMouvement()));
                            responseBody.put("heure_fin_premier_mvt",getLocaltimeEnLettre(p.getHeureFinPremierMouvement()));
                            responseBody.put("heure_debut_second_mvt",getLocaltimeEnLettre(p.getHeureDebutSecondMouvement()));
                            responseBody.put("heure_fin_second_mvt",getLocaltimeEnLettre(p.getHeureFinSecondMouvement()));
                            System.out.println("Enregistré heure de départ du second mouvement.");
                        }
                        // Enregistré les modifications éventuelles
                        presenceService.savePresence(p);

                    }else { // Enregistré l'arrivée du premier mouvement
                        System.out.println("Enregistré heure d'arrivée du premier mouvement.");
                        Presence new_presence = new Presence();
                        new_presence.setCollaborateur(collaborateur);
                        new_presence.setDateEnregistrement(LocalDate.now());
                        new_presence.setHeureDebutPremierMouvement(LocalTime.now());
                        new_presence.setFinie(false);
                        boolean save = presenceService.savePresence(new_presence);
                        if(save){

                  responseBody.put("heure_debut_premier_mvt",getLocaltimeEnLettre(LocalTime.now()));
                        }
                    }
                    responseBody.put("msg",main.getMessage());
                    main.remiseAZero();
                    main.close();
                    return responseBody;
                }else { // cas où le ID ne correspond pas à un collaborateur en base de données
                    System.out.println("Collaborateur non trouvé.");
                    responseBody.put("erreur","oui"); // OK
                    responseBody.put("msg",main.getMessage());
                    responseBody.put("erreur_msg","Collaborateur non détécté dans le système.");
                }
                main.remiseAZero();
                main.close();
                return  responseBody;
            }
            if(main.getMessage().contains("error")){ // s'il y a erreur
                responseBody.put("msg","Une erreur est survenue. Veillez vérifier les branchements...");
                main.remiseAZero();
                main.close();
                return  responseBody;
            }
        }
    }

Я атакую ​​этот контроллер с помощью ajax метода

Спасибо за помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...