Anmerkung: [Java] Raspberry Pi-Daten mit SFTP abrufen

Hintergrund

Der Arbeitsplatz sammelt mit einem Himbeerkuchen Daten über die Atmosphäre und ultraviolette Strahlen. Anfangs habe ich es lokal mit WinSCP kopiert, um diese Daten auszuleihen, aber nachdem ich es so oft getan habe Ich war so müde, dass ich darüber nachdachte, die Daten mit SFTP abzurufen. Ich werde den Code aufschreiben.

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

** SSH ** ... ** Verschlüsselte Kommunikation ** ** FTP ** ... ** Dateiübertragungsprotokoll **

** SSH + FTP = SFTP Übertragen von Dateien mit SSH-verschlüsselter Kommunikation **

** Raspeye-Daten standardmäßig ausgeben **

Derzeit werden Daten in Razpai wie folgt gespeichert. Dieses Mal werde ich die Daten der Datei 20180716.csv ausgeben. 1.png

Fügen Sie das ** <dependency> ** -Tag von jsch in das ** <dependencies> ** -Tag von pom.xml ein. So was

pom.xml


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

Der Code ist fast eine Kopie der Referenzseite.

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 {
            //Verbindung
            jsch = new JSch();
            session = jsch.getSession(user, host, port);
            session.setConfig("StrictHostKeyChecking", "no");//known_Hosts überspringen
            session.setPassword(password);
            session.connect();

            channel = (ChannelSftp) session.openChannel("sftp");
            channel.connect();
            channel.cd(dir);
          
            //herunterladen
            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);
            }
            //Standardausgabe
            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) {
                }
            }
        }
    }
}

Lass es uns laufen. Der Inhalt von CSV wurde exportiert. 2.png

** Raspeye-Datei lokal ausgeben **

Lassen Sie uns nun die Daten in eine lokale Datei ausgeben. Ich habe gerade die Standardausgabe des obigen Codes in eine Datei geschrieben und sie in den folgenden Inhalt geändert.

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);//In Datei exportieren
            file.createNewFile();
            FileWriter fw = new FileWriter(file);
            fw.write(new String(bout.toByteArray()));
            fw.close();
            System.out.print("Ausgabe erfolgreich");
        }
        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) {
                }
            }
        }
    }
}

3.png

Der Inhalt scheint in Ordnung zu sein. Die gleichen Daten wie zuvor werden im CSV-Format ausgegeben. 4.png

** Dateien innerhalb eines Tages nach dem Aktualisierungsdatum lokal ausgeben **

Umleiten des Inhalts des Artikels, den ich neulich geschrieben habe Identifizieren Sie Dateien, die innerhalb eines Tages aktualisiert wurden Ich werde versuchen, nur die Dateien innerhalb eines Tages nach dem Aktualisierungsdatum lokal auszugeben.

Die Seite ChannelSftp.LsEntry ist hilfreich. Sie können das Attribut der Datei mit getAttrs () von LsEntry abrufen und das Änderungsdatum mit getMTime () abrufen.

Ich bin persönlich auf die Informationen in der Dateiliste gestoßen, als ich die Informationen auf der Raspeye-Seite erhielt. Ich habe einen anderen Fehler (. Oder ..) als die Datei erhalten. Da das Verzeichnis von isDir () bestimmt werden kann, wird es verarbeitet, wenn es kein Verzeichnis ist. 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();   //Holen Sie sich das aktuelle Datum und die aktuelle Uhrzeit mit der Kalenderklasse
            st.add(Calendar.DATE, -1);              //Holen Sie sich vor 1 Tag
            Date start = st.getTime();              //Zum Datum wechseln

            Calendar en = Calendar.getInstance();
            en.add(Calendar.MINUTE, -10);           //
            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()) {
                    //Wenn es sich um ein Verzeichnis handelt, tun Sie nichts
                }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("Ausgabe erfolgreich");
                }
            }
        }
        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) {
                }
            }
        }
    }
}

Nur Dateien innerhalb eines Tages nach der Änderung werden mit den mit ★ gekennzeichneten Namen in das Zielverzeichnis kopiert. 5.png

Da die Daten der letzten Nacht enthalten sind, scheint der Inhalt der Daten kein Problem zu sein. 6.png

Recommended Posts

Anmerkung: [Java] Raspberry Pi-Daten mit SFTP abrufen
Java-Lernnotiz (Datentyp)
Verarbeiten Sie die vom menschlichen Sensor HC-SR501 erkannte Bewegung mit Raspberry Pi 3 & Java
[Persönliches Memo] Der Java-Datentyp ist ärgerlich
Java-Memo
Organisiertes Memo im Kopf (Java - Datentyp)
Holen Sie sich Daten mit der API, die mit dem Befehl curl erstellt wurde
Java alles Memo
Java Silver Memo
Java, Maven Memo
Java SE 7 Hinweis
Java alles Memo 2
Umfangsrate in Java
Java-Spezifikationsnotiz
Java-Muster-Memo
Zeigen Sie Zeichen auf dem I2C 1602 LCD mit Raspberry Pi 3 und Java an
Informationen zu CLDR-Gebietsschemadaten, die standardmäßig in Java 9 aktiviert sind
Lesen Sie Temperatur / Luftfeuchtigkeit von Raspberry Pi 3 & DHT11 mit Java ab