Mémo: [Java] Obtenez des données Raspberry Pi avec SFTP

Contexte

Le lieu de travail recueille des données sur l'atmosphère et les rayons ultraviolets avec une tarte aux framboises. Au départ, je l'ai copié localement avec WinSCP pour emprunter ces données, mais après l'avoir fait tant de fois J'étais tellement fatiguée que j'ai pensé à obtenir les données avec SFTP. Je vais écrire le code.

ラズパイのデータコピーしてたんですけども.png

** SSH ** ... ** Communication cryptée ** ** FTP ** ... ** Protocole de transfert de fichiers **

** SSH + FTP = SFTP Transférer des fichiers en utilisant une communication cryptée SSH **

** Sortie des données Raspeye en standard **

Actuellement, les données sont stockées dans Razpai comme ceci. Cette fois, je sortirai les données du fichier 20180716.csv. 1.png

Ajoutez la balise ** <dependency> ** de jsch dans la balise ** <dependencies> ** de pom.xml. Comme ça

pom.xml


    <dependencies>
		<!--JSch_adding_at_self_-->
		<dependency>
            <groupId>com.jcraft</groupId>
            <artifactId>jsch</artifactId>
            <version>0.1.54</version>
        </dependency>
    </dependencies>

Le code est presque une copie de la page de référence.

test.java


import com.jcraft.jsch.*;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

public class test {

    public static void main(String[] args) throws JSchException, SftpException, FileNotFoundException, IOException {

        String host = "192.168.29.29"; 
        int port = 22;
        String user = "pi";
        String password = "raspberry";
        String dir = "/home/pi/iot/pressure/data/2018/";
        String fileName = "20180716.csv";

        JSch jsch;
        Session session = null;
        ChannelSftp channel = null;
        FileInputStream fin = null;
        BufferedInputStream bin = null;

        try {
            //Lien
            jsch = new JSch();
            session = jsch.getSession(user, host, port);
            session.setConfig("StrictHostKeyChecking", "no");//known_Ignorer la vérification des hôtes
            session.setPassword(password);
            session.connect();

            channel = (ChannelSftp) session.openChannel("sftp");
            channel.connect();
            channel.cd(dir);
          
            //Télécharger
            bin = new BufferedInputStream(channel.get(fileName));
            ByteArrayOutputStream bout = new ByteArrayOutputStream();
            byte[] buf = new byte[1024];
            int length;
            while (true) {
                length = bin.read(buf);
                if (length == -1) {
                    break;
                }
                bout.write(buf, 0, length);
            }
            //Sortie standard
            System.out.format("%1$s", new String(bout.toByteArray(), StandardCharsets.UTF_8));
        }
        finally {
            if (fin != null) {
                try {
                    fin.close();
                }
                catch (IOException e) {
                }
            }
            if (bin != null) {
                try {
                    bin.close();
                }
                catch (IOException e) {
                }
            }
            if (channel != null) {
                try {
                    channel.disconnect();
                }
                catch (Exception e) {
                }
            }
            if (session != null) {
                try {
                    session.disconnect();
                }
                catch (Exception e) {
                }
            }
        }
    }
}

Lançons-le. Le contenu du CSV a été exporté. 2.png

** Sortie du fichier Raspeye localement **

Maintenant, sortons les données dans un fichier local. Je viens d'écrire la sortie standard du code ci-dessus dans un fichier et je l'ai changé pour le contenu suivant.

test.java


import com.jcraft.jsch.*;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;

public class test {

    public static void main(String[] args) throws JSchException, SftpException, FileNotFoundException, IOException {

        String host = "192.168.29.29";
        int port = 22;
        String user = "pi";
        String password = "raspberry";
        String dir = "/home/pi/iot/pressure/data/2018/";
        String fileName = "20180716.csv";

        JSch jsch;
        Session session = null;
        ChannelSftp channel = null;
        FileInputStream fin = null;
        BufferedInputStream bin = null;

        try {
            
            jsch = new JSch();
            session = jsch.getSession(user, host, port);
            session.setConfig("StrictHostKeyChecking", "no");
            session.setPassword(password);
            session.connect();

            channel = (ChannelSftp) session.openChannel("sftp");
            channel.connect();
            channel.cd(dir);

            bin = new BufferedInputStream(channel.get(fileName));
            ByteArrayOutputStream bout = new ByteArrayOutputStream();
            byte[] buf = new byte[1024];
            int length;
            while (true) {
                length = bin.read(buf);
                if (length == -1) {
                    break;
                }
                bout.write(buf, 0, length);
            }
            File file = new File("C:/tedkuma/BOX/★"+fileName);//Exporter vers un fichier
            file.createNewFile();
            FileWriter fw = new FileWriter(file);
            fw.write(new String(bout.toByteArray()));
            fw.close();
            System.out.print("Sortie réussie");
        }
        finally {
            if (fin != null) {
                try {
                    fin.close();
                }
                catch (IOException e) {
                }
            }
            if (bin != null) {
                try {
                    bin.close();
                }
                catch (IOException e) {
                }
            }
            if (channel != null) {
                try {
                    channel.disconnect();
                }
                catch (Exception e) {
                }
            }
            if (session != null) {
                try {
                    session.disconnect();
                }
                catch (Exception e) {
                }
            }
        }
    }
}

La sortie s'affiche avec succès sur la console et un fichier avec une étoile est créé dans le répertoire cible. 3.png

Le contenu semble correct. Les mêmes données qu'auparavant sont sorties au format CSV. 4.png

** Exportez les fichiers dans un délai d'un jour à compter de la date de mise à jour localement **

Détourner le contenu de l'article que j'ai écrit l'autre jour Identifier les fichiers qui ont été mis à jour en 1 jour J'essaierai de ne sortir que les fichiers dans un délai d'un jour à compter de la date de mise à jour localement.

La page ChannelSftp.LsEntry sera utile. Vous pouvez recevoir les attributs de fichier de LsEntry avec getAttrs () et obtenir la date de modification avec getMTime ().

Je suis personnellement tombé sur les informations de la liste de fichiers lorsque j'ai reçu les informations du côté Raspeye. J'ai reçu une erreur (. Ou ..) autre que le fichier. Puisque le répertoire peut être déterminé par isDir (), il est traité s'il ne s'agit pas d'un répertoire. Rlogin.png

test.java


import com.jcraft.jsch.*;
import com.jcraft.jsch.ChannelSftp.LsEntry;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Calendar;
import java.util.Date;
import java.util.Vector;

public class test {

    public static void main(String[] args) throws JSchException, SftpException, FileNotFoundException, IOException {

        String host = "192.168.29.29";
        int port = 22;
        String user = "pi";
        String password = "raspberry";
        String dir = "/home/pi/iot/pressure/data/2018/";

        JSch jsch;
        Session session = null;
        ChannelSftp channel = null;
        FileInputStream fin = null;
        BufferedInputStream bin = null;

        try {
            
            jsch = new JSch();
            session = jsch.getSession(user, host, port);
            session.setConfig("StrictHostKeyChecking", "no");   
            session.setPassword(password);
            session.connect();

            channel = (ChannelSftp) session.openChannel("sftp");
            channel.connect();
            channel.cd(dir);

            Calendar st = Calendar.getInstance();   //Obtenez la date et l'heure actuelles avec la classe Calendar
            st.add(Calendar.DATE, -1);              //Obtenir il y a 1 jour
            Date start = st.getTime();              //Changer de date

            Calendar en = Calendar.getInstance();
            en.add(Calendar.MINUTE, -10);           //Obtenir il y a 10 minutes
            Date end = en.getTime();

            Vector<?> filelist = channel.ls(dir);
            for(int i=0; i<filelist.size();i++){

                LsEntry entry = (LsEntry) filelist.get(i);
                String filename= entry.getFilename();
                SftpATTRS attrs =  entry.getAttrs();
                Date lastModified = new Date(attrs.getMTime() * 1000L);
                if(attrs.isDir()) {
                    //Si c'est un répertoire, ne faites rien
                }if(start.compareTo(lastModified)<0 && end.compareTo(lastModified)>0){
                    bin = new BufferedInputStream(channel.get(filename)); 
                    ByteArrayOutputStream bout = new ByteArrayOutputStream();
                    byte[] buf = new byte[1024];
                    int length;
                    while (true) {
                        length = bin.read(buf);
                        if (length == -1) {
                            break;
                        }
                        bout.write(buf, 0, length);
                    }
                    File file = new File("C:/tedkuma/★"+filename);
                    file.createNewFile();
                    FileWriter fw = new FileWriter(file);
                    fw.write(new String(bout.toByteArray()));
                    fw.close();
                    System.out.print("Sortie réussie");
                }
            }
        }
        finally {
            if (fin != null) {
                try {
                    fin.close();
                }
                catch (IOException e) {
                }
            }
            if (bin != null) {
                try {
                    bin.close();
                }
                catch (IOException e) {
                }
            }
            if (channel != null) {
                try {
                    channel.disconnect();
                }
                catch (Exception e) {
                }
            }
            if (session != null) {
                try {
                    session.disconnect();
                }
                catch (Exception e) {
                }
            }
        }
    }
}

Seuls les fichiers dans le jour suivant la modification sont copiés dans le répertoire cible avec les noms marqués de ★. 5.png

Puisque les données de la nuit dernière sont incluses, le contenu des données ne semble pas poser de problème. 6.png

Recommended Posts

Mémo: [Java] Obtenez des données Raspberry Pi avec SFTP
Mémo d'apprentissage Java (type de données)
Traitez le mouvement détecté par le capteur humain HC-SR501 avec Raspberry Pi 3 et Java
[Note personnelle] Le type de données Java est ennuyeux
Mémo Java
Mémo organisé dans la tête (Java - type de données)
Obtenez des données avec une API créée par la commande curl
java quoi que ce soit mémo
Mémo Java Silver
java, mémo maven
Remarque sur Java SE 7
java n'importe quoi mémo 2
Taux circonférentiel à Java
Mémo de spécification Java
Mémo de modèle Java
Afficher les caractères sur l'écran LCD I2C 1602 avec Raspberry Pi 3 et Java
À propos des données locales CLDR activées par défaut à partir de Java 9
Lire la température / l'humidité avec Java de Raspberry Pi 3 & DHT11