Я разрабатываю программу на основе весенней загрузки и 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 метода
Спасибо за помощь.