Android studio, SSH an Raspberry

schnibli

Mitglied
Hallo,
Ich bin auf euer Forum gestoßen weil ich ein kleineres Problemchen habe 🙂
Daher auch gleich an meinem ersten tag meine Frage 🙂

Wunsch:
Ich würde gerne mit meinem Android App SSH befehler an meinen Raspberry pi senden.
Meine ersten versuche startete ich mit jsch.
Hier mal mein Code:
Code:
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        rootview = inflater.inflate(R.layout.menu3_layout, container, false);

        final Button btn_energy = (Button) rootview.findViewById(R.id.btn_energy);
        btn_energy.setOnClickListener(
                new Button.OnClickListener() {
                    public void onClick(View v) {
                        ClientAsyncTask clientAST = new ClientAsyncTask();
                    }
                }
        );

        return rootview;
    }

    ClientAsyncTask clientAST = new ClientAsyncTask();

    class ClientAsyncTask extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... params) {
            String result = null;
            try {
                JSch jsch = new JSch();
                Session session = null;

                session = jsch.getSession("root", "192.168.61.93", 22);

                session.setPassword("password");

                // Avoid asking for key confirmation
                Properties prop = new Properties();
                prop.put("StrictHostKeyChecking", "no");
                session.setConfig(prop);

                session.connect();

                // SSH Channel
                ChannelExec channelssh = (ChannelExec)
                        session.openChannel("exec");
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                channelssh.setOutputStream(baos);

                // Execute command
                channelssh.setCommand("mpc stop");
                channelssh.connect();
                channelssh.disconnect();

            } catch (JSchException e) {

            }
            return result;
        }
    }
}

Nun es erscheinen Keine Fehler und es passiert auch nichts, daher denke ich, dass ich Grundlegend einen Fehler habe.

Zusätzlich währe es noch so das ich 2 Raspberry Pi's habe und je nach Button den Befehl an den einen oder an den anderen Raspberry pi gesendet werden soll.

Ich hoffe ich stoße hier auf Hilfreiche Personen 🙂

Freundliche Grüsse
 
Ich hab leider noch nichts mit jsch gemacht, daher bin ich da etwas überfragt. Hast du das denn schon mal von einem regulären Java-Programm aus ausgeführt und geschaut, was da passiert?
Vielleicht auch auf dem Raspi mal mit tcpdump oder so tracen und schauen, ob die Verbindung überhaupt aufgemacht wird.

Grundsätzlich aber wäre es hilfreich, wenn du eventuelle JSchExceptions auch loggen würdest: Deine Anwendung (bzw. dein Task) dropped diese im Moment still und heimlich.
android.util.Log.<v|d|i|w|e>(tag, message[, throwable]);
Heisst: Es kann schon Exceptions geben, du bekommst sie nur nie mit...
 
Zuletzt bearbeitet:
Hallo ich konnte es erfolgreich lösen 🙂 ...
Code:
/**
 * Created by Roger on 13.03.2015.
 */
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;

import java.io.ByteArrayOutputStream;
import java.util.Properties;


public class SSH {
    public static String executeRemoteCommand() throws Exception {
        JSch jsch = new JSch();
        Session session = jsch.getSession("root", "192.168.61.93", 22);
        session.setPassword("schneider");


        // Avoid asking for key confirmation
        Properties prop = new Properties();
        prop.put("StrictHostKeyChecking", "no");
        session.setConfig(prop);

        session.connect();

        // SSH Channel
        ChannelExec channelssh = (ChannelExec)
                session.openChannel("exec");
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        channelssh.setOutputStream(baos);

        // Execute command
        channelssh.setCommand("mpc stop");
        channelssh.connect();
        channelssh.disconnect();

        return baos.toString();
    }
}
Code:
  btn_werk_srf3.setOnClickListener(
                new Button.OnClickListener() {
                    public void onClick(View v) {

                        new AsyncTask<Integer, Void, Void>(){
                            @Override
                            protected Void doInBackground(Integer... params) {
                                try {
                                    executeRemoteCommand("root","123451234","192.168.61.11", 22, "mpc play 4");
                                } catch (Exception e) {
                                    e.printStackTrace();
                                }
                                return null;
                            }
                        }.execute(1);
                    }
                }
        );

    public static String executeRemoteCommand(String username,String password,String hostname,int port, String message)
            throws Exception {
        JSch jsch = new JSch();
        Session session = jsch.getSession(username, hostname, port);
        session.setPassword(password);

        // Avoid asking for key confirmation
        Properties prop = new Properties();
        prop.put("StrictHostKeyChecking", "no");
        session.setConfig(prop);

        session.connect();

        // SSH Channel
        ChannelExec channelssh = (ChannelExec)
                session.openChannel("exec");
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        channelssh.setOutputStream(baos);

        // Execute command
        channelssh.setCommand(message);
        channelssh.connect();
        channelssh.disconnect();

        return baos.toString();
    }
Danke!!
 
Hallo, ich würde gerne den Beitrag nochmal aufnehmen.
Ich habe den Code so probiert und es funktioniert auch wunderbar. Hab jetzt meine App aufs Handy gespielt, um damit meinen Raspberry als Webradio mit mpd zu steuern. Auch diese Funktion funktioniert, jedoch reagiert das ganze sehr träge. Bis ein Befehl vom Handy umgesetzt wird dauert es ca. 6-8 Sekunden. Gibts ne Möglichkeit das zu beschleunigen?
 
Es scheint, du baust immer die Verbindung neu auf. Das dauert natürlich.
Vielleicht wäre es einfacher, die ssh verbindung offen zu lassen, und erst ab einer bestimmten Zeit wieder zu schließen.

Vielleicht etwas umständlich gelöst im Moment.
 
Hallo zusammen,
ich scheiter leider schon bei dem Einbinden des Packages.
Der Kompiler wirft mir ein Fehler bei dem Import.

Jetzt die Frage : Wie kann ich das Package richtig einbinden ? Wo muss ich es runterladen ?

Wäre euch für die Infos sehr danbar.

Liebe Grüße

Felix
 
Hallo Vfl,

danke für die schnelle Antwort.
Bitte enschuldige meine ungenauen Angaben.

Ich habe ein Beispielprojekt in Android Studio erstellt. Anschließend wollte ich per Buttonklick eine Nachricht per SSH an ein LinuxDistro zu senden -> soviel zu dem Hintergrund.

Ich erstelle also ein Beispielprojekt und kopiere die Imports :

import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;

darauffolgend wird jcraft rot unterstrichen.

Ich nehme an dass ich die Bibliothek erst einbinden muss.

Also habe ich das Paket heruntergeladen, jedoch enthält der Ordner diverse Dateien und ich weiss nicht wie ich die Bibliothek einbinden muss/kann und welche Datei benötigt wird.

Danke im Vorraus.
 
Moin,
Ich nehme an dass ich die Bibliothek erst einbinden muss.
Also habe ich das Paket heruntergeladen, jedoch enthält der Ordner diverse Dateien und ich weiss nicht wie ich die Bibliothek einbinden muss/kann und welche Datei benötigt wird.
Also ich kenne die LIB natürlich auch nicht (habe den Link nur kurz für Dich gegooglet) 😀
Aber ich denke doch mal, dass es dann irgendein lib-Verzeichnis geben wird, aus der du die 'passende' LIB in Deinen BuildPath einfügen kannst!
Gibt es denn keine readme-Datei oder ähnliches ??

Gruß Klaus
 
Also müsste ich in dem gedownloadetem Ordner eine .lib Datei finden, die ich dann in Android studio importieren muss ? Wie binde ich eine solche Datei in Android Studio ein ?

Auf deren Website steht folgender Kommentar:
"JSch is in pure Java, but it depends on JavaTM Cryptography Extension (JCE). JSch has been known to work with:"

Ich brauche also diese JCE erweiterung um die Lib zu benutzen? Oder ist die Lib bereits in der Erweiterung enthalten ?
 
Ich glaube ich habe mich etwas verrannt.
Habe jetzt von einer anderen Quelle eine .jar Datei herunter geladen.

Glaube ich muss diese nur noch in Android Studio importieren.

Bin ich in der Annahme richtig ?
 
Bin ich in der Annahme richtig, dass bei Dir sämtliche Grundlagen fehlen? Ich glaube, Du solltest Dich zuerst in deine IDE einarbeiten (kleines Stichwort: Gradle).
Da kannst Du hier fragen was Du willst, niemand kann Dir das Grundgerüst abnehmen. Und dann, irgendwann wenn Du fertig bist, kannst Du Sachen wie SSH machen.
 
Hallo schnibli,
ich hoffe, Du lebst noch 🙂 Ich bin auf der Suche nach einer Methode, eine SSH-App für Android selber zu implementieren (Fernsteuerung einer Pi-Anwendung). Bei meiner Recherche stoße ich auf diesen schon etwas altenThread. Vielleicht meldest Du Dich oder jemand anderer, der mir beim Start behilflich sein möchte.
Ich wollte eigentlich die App mit Kotlin implementieren. Da finde ich aber bisher noch keine Beispiele, hätte aber auch kein Problem damit, in Java zu programmieren
 
Also so einen alten Thread aufwärmen dürfte kaum etwas bringen.

Schau Dir mal die Library jsch an - das ist auch das, was der TE versucht hat zu benutzen. Die kannst Du auch aus Kotlin heraus nutzen.

Aber bei Problemen und so: Bitte eigenen Thread eröffnen und dann können wir Dir ggf. auch weiter helfen.
 
Danke für die schnelle Reaktion. Bin ja froh, dass sich jemand meldet. Ich werde einen neuen Thread aufmachen. Interessant ist die Aussage, dass jsch auch mit Kotlin benutzt werden kann.
 

Zurück
Oben