Translate

sábado, mayo 20, 2017

Salidas GPIO Orange PI 2G IoT



Salidas GPIO Orange PI 2G IoT


En el anuncio de la Orange Pi 2G IoT dicen  "40 pins Header Compatibe witch Raspberry pi B+"
Voy a comparar los interfaces.

1.Orange Pi 2G IoT, SoC RDA8810:




Probando comunicación con los pins GPIO (pruebas, gracias a la ayuda del grupo de Telegram):

1.Bajar ultima distro, yo uso Ubuntu Server:

http://www.orangepi.org/downloadresources/

2. Aplicar modulo GPIO:

        #cd /lib/modules/3.10.62-rel5.0.2/kernel/drivers/gpio
        #insmod gpio-OrangePiRDA.ko

3. Con el comando dmesg vemos el log y como queda aplicado el modulo:
                [ 1299.883361] GPIO name B24
                [ 1299.883789] GPIO_INIT finish used!

4.De momento han activado un pin (el 7 que corresponde con el GPIO_B24), aparece tras aplicar el modulo del punto numero 2, y está en /sys/class/gpio_OrangePi/ .Si queremos encender / apagar un led debemos usar el pin GPIO numero 7 (GPIO_B24):

             

Encendio: /sys/class/gpio_OrangePi/B24# echo "1">data

Apagado:/sys/class/gpio_OrangePi/B24# echo "0">data




NOTA IMPORTANTE (otra forma de trabajar con los gpio de esta placa): 

Gracias al trabajo de Reinhard  http://ec.hobbykompetenz.de/index.php/2017/06/07/gpio/ también se puede trabajar sobre los puertos GPIO sin la carga del modulo GPIO en memoria en tal caso para encender/apagar el led sería usando el pin 7 de la placa (GPIO_B24) que en el sistema de archivos es gpio56:
Hay que habilitar en el sistema de archivos el puerto GPIO al pin 7 de la placa:
echo "56" > /sys/class/gpio/export

Apagar LED:  echo "in" > /sys/class/gpio/gpio56/direction
Enceder LED1: echo "out" > /sys/class/gpio/gpio56/direction

Para consultar el estado de entrada/salida del puerto: cat  cat /sys/class/gpio/gpio56/value

He realizado un script para que parpadee el LED (blink.sh):

#!/bin/sh

echo 56 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio56/direction

while true
do
        echo 1 > /sys/class/gpio/gpio56/value
        sleep 1
        echo 0 > /sys/class/gpio/gpio56/value
        sleep 1
done





domingo, mayo 07, 2017

Conexión por red de datos movil 2G, 3G y 4G tunel inverso por SSH, usando Orange Pi 2G IoT


Tipo Conexión 2: Usando SSH, tunel inverso:

Orange Pi (equipo1) ---P1234--router (ip publica) --P22-----Raspberry Pi (equipo 2)
                                     <------p2222:localhostp22---->
En mi afán de tener conexión ssh por red movil (uso freedompop), he probado esta conexión ssh y asi poder usar la conexión ssh a mi Orange Pi 2G IoT remota sin ip publica.

Esta forma es algo mas complicada que la anterior pero es mucho mas rapida y bajo mi punto de vista se comporta bastante mejor:

1 Necesitamos tener nuestra Orange Pi 2G IoT y otro equipo remoto que hará las veces de ssh inverso, yo uso una raspberry pi, asi que en adelante Llamaré al equipo 1 Orange pi (remoto) y equipo dos lo llamare Raspberry pi (equipo local, detras de mi router).

2.Lo primero es hacer un mapeo de puertos en nuestro router (NAT) de tal marera que toda conexion entrante por nuestra ip pública al puerto 1234 vaya directamente al puerto 22 de nuestra lan interna:

192.168.1.100TCP&UDP221234

3En la raspberry pi (equipo 2) debemos disponer de un usuario con acceso ssh, este usuario lo incluiremos en el siguiente fichero alojado en la Orange pi (equipo 1):

/etc/ssh/sshd_config

Lo editamos e incluiremos al principio del mismo al usuario :

AllowUsers pi

Podemos hacer pruebas desde la orange pi para probar que podemos logearnos en la raspberry pi

ssh pi@IP_PUBLICA_NUESTRO_ROUTER -p 1234


Luego instalaremos  sshpass en la Orange Pi. Sshpass evita la solicitud de contraseña ssh interactiva para que la conexión se pueda establecer automáticamente.

sudo apt-get install sshpass

Necesitamos crear el siguiente script que iniciará la conexión inversa entre nuestra orange Pi (equipo 1) y la raspberry Pi (equipo 2):

#!/bin/bash

REMOTE_PORT=1234
REMOTE_ADDRESS=pi@IP_PUBLICA_NUESTRO_ROUTER
PASSWORD="password_usuario_pi"

sshpass -p "$PASSWORD" \
ssh -o ServerAliveInterval=60 \
    -o ServerAliveCountMax=2 \
    -o StrictHostKeyChecking=no \
    -o UserKnownHostsFile=/dev/null \
    -o ConnectTimeout=15 \
    -N -R 2222:localhost:22 $REMOTE_ADDRESS -p $REMOTE_PORT

Desde la raspberry pi (equipo 2) ya podemos lanzar el siguiente comando para logearnos en Orange Pi (equipo 1):

ssh UsuarioOrangePi@localhost -p 2222


Ya está, hemos conseguido establecer un tunel ssh entre las dos máquinas y acceder la la Orange Pi (equipo 1) por red de datos 2G, GPRS sin necesidad de que nuestro operador nos de una IP pública.
Por supuesto que realmente queremos que la Orange  Pi (equipo 1) inicie la conexión automáticamente. Así que hay que incluir la llamada anterior en un bucle y añadir una línea @reboot en el crontab para ejecutar este script en el inicio (creamos el script reverse_ssh.sh con el siguiente código):

#!/bin/bash

FWD_PORT=1234
WAIT_SECONDS=60

if [ "$#" != "3" ]; then
 echo "Maintain a reverse ssh connection, forwarding port $FWD_PORT on the remote machine."
 echo "If the connection fails or is dropped, wait $WAIT_SECONDS seconds and retry."
 echo "Usage: $(basename $0) [remote_user@]remote_server port password"
 echo "Then, on the remote ssh server: ssh $USER@localhost -p $FWD_PORT"
 exit
fi

REMOTE_ADDRESS=$1
REMOTE_PORT=$2
PASSWORD=$3

# By default the tunnel never seems to timeout. This is bad because if the connection to the
# server has been established once, then the server disconnects (link down, or maybe it's a laptop
# that doesn't run 24/7), it could never be re-established. So it's important to set a timeout for
# the tunnel. Note that keepalive is handled transparently by ssh; it does not mean any payload data
# has to be sent through the tunnel at these intervals.
SERVER_ALIVE_INTERVAL=60
SERVER_ALIVE_COUNT_MAX=2

while true; do
 sshpass -p "$PASSWORD" \
 ssh -o ServerAliveInterval=$SERVER_ALIVE_INTERVAL \
 -o ServerAliveCountMax=$SERVER_ALIVE_COUNT_MAX \
 -o StrictHostKeyChecking=no \
 -o UserKnownHostsFile=/dev/null \
 -o ConnectTimeout=15 \
 -N -R $FWD_PORT:localhost:22 $REMOTE_ADDRESS -p $REMOTE_PORT
 sleep $WAIT_SECONDS
done


Ahora debemos incluir esta entrada en crontab:

@reboot ./reverse_ssh.sh pi@IP_PUBLICA_NUESTRO_ROUTER 1234 passwordUsrPi


Hay que tener en cuenta que despues de reiniciar la Orange Pi (equipo 1) debemos  esperar hasta un minuto (o cualquier intervalo que hayamos elegido) antes de establecer la conexión.

Nota: Para hacer que nuestra orange pi Iot conecte automaticamente a nuestro proveedor sin intervenir nada mas simple que editar el fichero /etc/network/interfaces y agregar lo siguiente:

auto ppp0
iface ppp0 inet wvdial