Grupo 3 Programación Distribuida - ASTROINGENIERIA/ASTROUFRO GitHub Wiki

Integrantes

  • Felipe Quezada
  • Jorge Silva
  • Patricio Gutierrez

Imagen Yocto para el Raspberry Pi

Requisitos:

  • Máquina con Ubuntu MATE 18.04, instalación LITE
  • Al menos 55GB de almacenamiento disponible
  • Tarjeta sd de al menos 8GB, preferentemente clase 10
  • Instalar las siguientes librerías:
    ~$ sudo apt-get install build-essential chrpath diffstat gawk libncurses5-dev libmcpp-dev texinfo git

  • Cambiar Ubuntu shell por defecto a bash:
    ~$ sudo dpkg-reconfigure dash 
    Elegir la opción NO

Procedimiento

Clonando repositorios

  • Clonamos el repositorio de yocto, para esto utilizar la rama sumo:
    ~$ git clone -b sumo git://git.yoctoproject.org/poky.git poky-sumo
  • Luego clonamos los distintos layers dentro de la carpeta poky-sumo. Como usaremos zeroc-ice, clonamos también su repositorio de la rama master:
    ~$ cd poky-sumo
    ~/poky-sumo$ git clone -b sumo git://git.openembedded.org/meta-openembedded
    ~/poky-sumo$ git clone -b sumo https://github.com/meta-qt5/meta-qt5
    ~/poky-sumo$ git clone -b sumo git://git.yoctoproject.org/meta-security
    ~/poky-sumo$ git clone -b sumo git://git.yoctoproject.org/meta-raspberrypi
    ~/poky-sumo$ git clone –b master git://github.com/zeroc-ice/meta-zeroc.git
  • Creamos un directorio fuera de poky-sumo para el repositorio meta-rpi, junto con un subdirectorio para la carpeta de configuraciones:
    ~$ mkdir ~/rpi
    ~$ cd ~/rpi
    ~/rpi$ git clone -b sumo git://github.com/jumpnow/meta-rpi
    ~/rpi$ mkdir –p build/conf
  • Copiamos los archivos de configuración desde la carpeta meta-rpi/conf a la carpeta build/conf, eliminando la extensión ".sample":
    ~/rpi$ cp meta-rpi/conf/local.conf.sample build/conf/local.conf
    ~/rpi$ cp meta-rpi/conf/bblayers.conf.sample build/conf/bblayers.conf

Editando local.conf:

  • Cambiamos el valor de la variable MACHINE a la raspberry objetivo, ejemplo:
        MACHINE=raspberrypi2
  • Agregamos al final del archivo el paquete de zeroc ice junto con la versión a instalar:
        IMAGE_INSTALL_append = “zeroc-ice zeroc-ice-python”
        PREFERRED_VERSION_zeroc-ice = “3.7.1”
  • Asignamos una contraseña para usuario root, cambiando el valor de jumpnowtek:
        EXTRA_USERS_PARAMS = "usermod -P jumpnowtek root; "

Editando bblayers.conf:

  • Dentro de la variable BBLAYERS, agregar la ruta hacia meta-zeroc:
        BBLAYERS ¿= “ \
	        ${HOME}/poky-sumo/meta \
	        . . .
	        ${HOME}/poky-sumo/meta-zeroc \
	        . . .

Iniciar compilación

  • Corremos el siguiente script:
        ~$ source ~/poky-sumo/oe-init-build-env ~/rpi/build
  • Luego iniciamos la compilación y creamos la imagen que queremos, en esta caso console-image:
        ~/rpi/build$ bitbake console-image

Copiando imagen a tarjeta SD

  • Para comenzar a usar los siguientes scripts, se debe desmontar todas las particiones de la tarjeta sd objetivo. Para esto ejecutamos el siguiente comando para listar las unidades de almacenamiento y saber el nombre de nuestra tarjeta que, en este caso es nuestra sd de 7.4G llamada sdb:
        ~/rpi/meta-rpi$ lsblk
        NAME    MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
        sda       8:0    0 931.5G  0 disk
        |-sda1    8:1    0  93.1G  0 part /
        |-sda2    8:2    0  93.1G  0 part /home
        |-sda3    8:3    0  29.8G  0 part [SWAP]
        |-sda4    8:4    0     1K  0 part
        |-sda5    8:5    0   100G  0 part /oe5
        |-sda6    8:6    0   100G  0 part /oe6
        |-sda7    8:7    0   100G  0 part /oe7
        |-sda8    8:8    0   100G  0 part /oe8
        |-sda9    8:9    0   100G  0 part /oe9
        `-sda10   8:10   0 215.5G  0 part /oe10
        sdb       8:16   1   7.4G  0 disk
        |-sdb1    8:17   1    64M  0 part
        `-sdb2    8:18   1   7.3G  0 part
  • Luego desmontamos las particiones si es que así se requiere.

  • Ya identificada nuestra tarjeta, nos vamos a la carpeta dentro de rpi con los scripts y ejecutamos mk2parts para particionar nuestra tarjeta:

        ~$ cd ~/rpi/meta-rpi/scripts
        ~/rpi/meta-rpi/scripts$ sudo ./mk2parts.sh sdb
  • Necesitamos un punto de montaje para poder copiar los archivos de la imagen. Para ello creamos el siguiente directorio:
        ~$/rpi/meta-rpi/scripts$ sudo mkdir /media/card
  • Para copiar los archivos del arranque del sistema, primero debemos exportar las siguientes variables:
    • OETMP, la cuál se encuentra en el archivo local.conf y por defecto su ruta es ~/rpi/build/tmp
    • MACHINE, la cuál también se definió en el archivo local.conf
    • Observación: Cada vez que cerremos la consola, se deben exportar estas variables para correr los scripts copy-boot y, más adelante, copy-rootfs
        ~/rpi/meta-rpi/scripts export OETMP=~/rpi/build/tmp
        ~/rpi/meta-rpi/scripts export MACHINE=raspberrypi2
  • Luego corremos el script copy-boot, indicando el nombre de nuestra tarjeta:
~/rpi/meta-rpi/scripts ./copy_boot.sh sdb

copy-root.sh

  • Luego ejecutamos el siguiente script para escribir la imagen en nuestra tarjeta indicando el nombre de la tarjeta, la imagen creada sin “-image”, y luego el nombre de la máquina (ejemplo, raspi2):
~/rpi/meta-rpi/scripts ./copy_rootfs.sh sdb console raspi2

Node.js como cliente de servidor ice

Requisitos:

  • Es necesario el mismo .ice del servidor (Ejemplo: Example.ice)
  • Instalar slice2js (npm install --save-dev slice2js)
  • Dependencia a utilizar ICE (npm install ice)

Lo primero que hay que hacer es compilar el .ice para JavaScript Si slice2js esta instalado globalmente

slice2js Example.ice 

O en su defecto, crear un .js con lo siguiente (dando por hecho que el .ice esta en la misma carpeta)

var slice2js = require('slice2js');
slice2js.compile(["Example.ice"]);

Luego, la base del programa es el siguiente:

const Ice = require("ice").Ice;
const Demo = require("./generated/Example").Demo; //Donde ./generated es la carpeta donde esta el compilado del .ice y que se llama Example.js y donde Demo es el nombre del modulo

(async function()
{
    let communicator;
    try
    {
        communicator = Ice.initialize();
        const base = communicator.stringToProxy("SimplePrinter:tcp -h IP -p 10000"); //SimplePrinter se llama en el servidor la implementación, IP es la ip del servidor y 10000 es el puerto por defecto
        const printer = await Demo.PrinterPrx.checkedCast(base); //PrinterPrx es el nombre de una clase generada en (Example.js)
        if(printer)
        {
            await printer.printString("Hello World!"); // printString es el metodo a realizar
        } 
        else
        {
            console.log("Invalid proxy");
        }
    }
    catch(ex)
    {
        console.log(ex.toString());
        process.exitCode = 1;
    }
    finally
    {
        if(communicator)
        {
            await communicator.destroy();
        }
    }
}());

Con este código funcionando, ya se puede utilizar la lógica para crear un servicio el cual se conecte a un servidor dinámicamente (dependiendo el ip que se utilice) y hacer peticiones http el cual este cliente gestione con el servidor.