Ejemplo Hello World con Java en la Raspberry Pi

Escrito por el , actualizado el .
gnu-linux java planeta-codigo programacion
Enlace permanente Comentarios

Raspberry Pi

Java

Este artículo es introductorio a los siguientes que escribiré y publicaré sobre el kit de iniciación a la electrónica para la Raspberry Pi. Antes de empezar a cacharrear con los sensores y dispositivos de entrada y salida, con los pines GPIO y para hacerlo de forma cómoda crearé un entorno de desarrollo y despliegue en la Raspberry Pi usando SSH, rsync para copiar los artefactos del equipo de desarrollo a la RPi y Ansible usándolo desde Gradle para lanzar comandos y ejecutar los ejemplos de forma remota aunque si no se quiere usar Ansible se pueden lanzar los comandos mediante SSH.

En la Raspberry Pi deberemos instalar por supuesto Java (es posible usar Java 8) junto con SSH y rsync, configurar el servidor SSH en la RPi modificando el archivo /etc/ssh/sshd_config, habilitar el servidor SSH, copiar nuestra clave pública ssh generada previamente al archivo ~/.ssh/authorized_keys del usuario e instalar Python como requerimiento de Ansible. Los programas Java los escribiremos en un equipo más potente que la Raspberry Pi ya sea un portátil o un equipo de sobremesa con un IDE ya sea IntelliJ, eclipse u otro, también deberemos instalar Gradle, Ansible y rsync. En Arch Linux con los siguientes comandos del gestor de paquetes:

1
2
3
4
5
# pacman -S jdk8-openjdk python rsync
# vim /etc/ssh/sshd\_config
# systemctl enable sshd.service
# systemctl start sshd.service
# vim .ssh/authorized_keys
pacman-raspberrypi.sh
1
2
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAEAQDHK4xOEPe+8/C7+BmSQOjrMJRcjqTCg0HMWIsgOxas0mvjv7feCzW1kB5QPkQDuTSauRDvbAhHakNfa8tE7l2y6QtnuPwQUP6ml79Zzqiwo5Dkjv0ig09U5QPUs6dDbAvYc+EWeSVvIBll+zpxjSM/AtQrPy3YWuDxTcsUdmrZm5M7miQZ+XI18ICc/ehgewOTUAkMdpEJGXXEFiWYK1iazTrT6fo8y3JZmS3mFTQ9QAifkPvk47XbCWktc4VTVZXzPR8dy+cxMb4SMuxCvLA72qUANvsaHCdei9e4dtvWOGL2v2jC7vFQU+gEaZ77ezxrNzGzt2MdPUcoAAfk2T3KFbnE6L5NBZ+8kVTtOIK6rDJsZaFPZN75orqFa5GG9WMRtpQTldvMkCvoIYttGSDW00ojLbKDY0qYLlEYjBC9hOnQsBN8sYD8sVBwjOLkvvNnetzYqtVu1ij3eB59NEKV3MhPwFRLomk+TGSfHKEhhS5cHntvlm/syJ0/KKuTCBA0kOMH8eJ4MQTV3dqy2vhUBo9sBYo728kHv0JwWBD/CJWdNgoG9lfkZbmqJ9ZSJ89vsDHqJi9m59i6rqWnahhtuTdIzya2asDMjCTozRonBNFC6Eo5mX2ydL6OFOaC2mrdIAHYjJGugWmqBCkhfIh6nh1XJjnsysTgGxtjW79d6o/9WEPYeIF8F2EH77oehjVmJNQeuIgvmZSdhW+dlAgan6WjZT7jBNBDwJH4kH31dNDB8LEVijS7E6J//d4aYfMmUzQUgd0PjyabNZJaCmcWGsv22ggGlCKz3D6putzO0nJrsATWoLCt8wG+zidCSQ/PaZ4uEW0Cbkfhb76jGfSRfywCmyhe7OmCgyvuhE8IZbeaYfjYsHYYto0rd6MQmx5m0d6+ylUfYmCxst2uu/BQPVE/tj/hmNeUvDh1O9qslTFk/tdDY2MRbEWBoNrX56YXIksargth2DCvlPltzKeK8cL46md9P6hC6DXxGR9GcqiPnf7puGIu7BLWK8yQCp2dgnqugye9f1uGrnP3w5MB28MWRCPi7lCjACiIva1U5wPmMwD2HEaIIVNAkX5VTO7xp2JtymA4wWnTreSXBMfvQP9yR6Ao9Zx9Hu8NywRHOJfUalyY868/ISag9tR/9qHxRsyfnv5XtDUJ/+sFgYzn+OYsvSW6na/sRVO1seX5I0Gf+d0xF8LZfeB6DMRUwy5BTJbv8KlTGFEh3vG1+jYLGwX65d9f7LGRSlSXHR+NI6MEezT7CV+UD7YM1T2ki9ezkpiZLRvZ+UUh46j/+xM9ed3LVxUbj1tfgDP42tyiHIfDf+SiHtOsZX3Avedy4SbV96K3lCyH2HcJHqpW7+YT pico.dev@gmail.com

authorized_keys
1
2
# pacman intellij-idea-community-edition jdk8-openjdk ansible rsync gradle

pacman.sh

Con la ayuda de unas tareas para la herramienta de construcción Gradle haremos el despliegue y la ejecución de la librería jar del proyecto de los ejemplos y de las dependencias que necesiten. El archivo de construcción de Gradle sería el siguiente en el que la tarea copyDependencies copia las dependencias al directorio build/libs. La tarea upload ejecutan el comando rsync para subir el archivo jar y las dependencias del proyecto a la Raspberry Pi. Finalmente, una tarea como executeHelloWorld ejecutará el comando en la Raspberry Pi para lanzar el programa Java. Con SSH también se puede lanzar el comando de forma remota cambiando la dirección IP de la Raspberry Pi por la que tenga asignada.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
apply plugin: 'java'
apply plugin: 'idea'

sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    compile files('misc/libs/diozero-core-0.9-SNAPSHOT.jar', 'misc/libs/diozero-provider-pigpio-0.9-SNAPSHOT.jar', 'misc/libs/pigpioj-java-1.0.1.jar', 'misc/libs/commons-math3-3.6.1.jar', 'misc/libs/tinylog-1.1.jar')
}

task copyDependencies(type: Copy) {
    into "$buildDir/libs"
    from configurations.runtime
}

jar { dependsOn copyDependencies }

task upload(type: Exec, dependsOn: ['jar']) {
    commandLine 'rsync', '-arPL', '--delete', '-e', 'ssh', 'build/libs/', 'raspberrypi@192.168.1.101:/home/raspberrypi/scripts/javaraspberrypi/'
}

task executeHelloWorld(type: Exec, dependsOn: 'upload') {
    commandLine 'ansible', '-i', 'hosts', 'raspberrypi', '-m', 'command', '-a', 'chdir=/home/raspberrypi/scripts/javaraspberrypi java -classpath "*" io.github.picodotdev.blogbitix.javaraspberrypi.HelloWorld'
}
build.gradle
1
2
$ ./gradlew upload
$ ssh -t 192.168.1.101 'cd /home/raspberrypi/scripts/javaraspberrypi && sudo java -classpath "*" io.github.picodotdev.blogbitix.javaraspberrypi.HelloWorld'
executeSSH.sh
1
2
$ ./gradlew executeHelloWorld

executeGradle.sh

El programa de ejemplo es universal gracias a la idea «Write once, run anywhere» posibilitado por la máquina virtual o JVM y el bytecode, está compilado en un sistema con arquitectura x64 (el de mi equipo) y ejecutado en un sistema con arquitectura arm (el de la RPi). No se diferencia en nada al que usaríamos para lo mismo en cualquier otro sistema distinto de la Raspberry Pi.

1
2
3
4
5
6
7
8
package io.github.picodotdev.blogbitix.javaraspberrypi;

public class HelloWorld {

    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}
HelloWorld.java

El resultado de este ejemplo es un mensaje en la terminal que es emitido por un programa Java ejecutado en la Raspberry Pi y lanzado de forma remota.

Ejemplo Hello World con Java en la Raspberry Pi

Ejemplo Hello World con Java en la Raspberry Pi

En los siguientes artículos de la serie mostraré ya como usar diferentes elementos de salida como diodos LED, zumbador, display LCD 1602 o de entrada como un pulsador.

Terminal

El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub y probarlo en tu equipo ejecutando siguiente comando:
./gradlew executeHelloWorld


Comparte el artículo: