Configurar el Wi-Fi de Raspberry Pi a través de Bluetooth para luego enviar datos a Ubidots

Al menos una vez en tu vida tuviste problemas para configurar las credenciales de Wi-Fi de una Raspberry Pi simplemente porque no tenías un monitor contigo en ese momento.

En esta guía, describiré cómo configurar una Raspberry Pi con un punto de acceso (AP) mediante una aplicación Android portátil. ¿No puedes conectar un cable Ethernet porque estás en una nueva ubicación? No te preocupes: después de seguir esta guía, podrás usar tu Pi en cualquier lugar. Solo necesitas escanear la red, seleccionar la red con la que deseas establecer la conexión, escribir las credenciales y ¡listo!

He implementado una herramienta sencilla que permite configurar el SSID y el PSK del Wi-Fi de la Raspberry Pi mediante Bluetooth. Por ahora, es muy básica: solo necesitas haber emparejado previamente tu teléfono Android con tu Raspberry Pi y he creado una aplicación básica para Android.

Personalmente creo que esto es realmente útil para aquellos que están con su Raspberry Pi, moviéndola de un taller a otro, llevándola de casa al colegio, más todos los posibles casos que tengas en mente ahora mismo... Ahora, sin discutir más, comencemos a construir cosas interesantes, empezando por la instalación del script de python que va a estar corriendo en nuestra Raspberry Pi.

Requisitos

Paso a paso

  1. Configuración del Bluetooth de Raspberry Pi
  2. Emparejamiento de Raspberry Pi y un teléfono Android
  3. Configuración del sensor DHT22 – Hardware
  4. Configuración del sensor DHT22 – Software
  5. Envío/visualización de datos a Ubidots

1. Configuración del Bluetooth de Raspberry Pi

Al principio necesitarás un monitor + teclado conectados, o bien acceder a la Raspberry Pi vía SSH para poder establecer todas las configuraciones requeridas a través de la Terminal Raspbian.

Ejecute los siguientes comandos con cuidado para establecer las configuraciones adecuadas:

  1. Instalar bluez (biblioteca bluetooth de Python):
$ sudo apt-get install python-bluez

2. Inicie el demonio Bluetooth en modo de compatibilidad. Para ello, edite /etc/systemd/system/dbus-org.bluez.service ejecutando el siguiente comando:

$ sudo nano /etc/systemd/system/dbus-org.bluez.service

3. Luego, modifique el ExecStart :

ExecStart=/usr/lib/bluetooth/bluetoothd –C

4. Ahora, cargue el perfil del puerto serie utilizando el siguiente comando:

$ sudo sdptool agregar SP

5. Para guardar los cambios correctamente, reinicie su Pi:

$ sudo reiniciar

Después de reiniciar, emparejemos el Bluetooth con nuestro teléfono Android

2. Emparejamiento de Raspberry Pi y teléfono Android.

1. Empareja tu teléfono Android con tu Raspberry Pi. Para ello, activa el Bluetooth de tu teléfono y ejecuta el siguiente comando en tu Pi:

$ bluetoothctl

Luego, una vez iniciado el proceso de emparejamiento, se insertan los siguientes parámetros. (Consulte la imagen para comprender mejor el proceso)

encendido detectable al escanear

En este punto, tu teléfono aparecerá en la lista de dispositivos disponibles. Anota la dirección de tu teléfono.

confianza<PHONE_ADDRESS> par<PHONE_ADDRESS>

2. Para salir del control de bluetooth, escriba el comando quit:

$ dejar de fumar

3. [OPCIONAL – CONSEJO PROFESIONAL] Puedes omitir la configuración anterior configurando el Bluetooth con la interfaz de Raspbian. Simplemente pulsa el icono de Bluetooth y selecciona el Bluetooth de tu teléfono.

4. Después de emparejar el Bluetooth, agregue el script de Python directamente en Raspbian escribiendo el comando nano copiando/pegando el código fuente, o puede copiar directamente el archivo run.py.

$ sudo nano run.py

Código fuente (Copiar/Pegar):

#!/usr/bin/env python #Run.py import os from bluetooth import * from wifi import Cell, Scheme import subprocess import time wpa_supplicant_conf = "/etc/wpa_supplicant/wpa_supplicant.conf" sudo_mode = "sudo " def wifi_connect(ssid, psk): # escribe la configuración wifi en el archivo cmd = 'wpa_passphrase {ssid} {psk} | sudo tee -a {conf} > /dev/null'.format( ssid=str(ssid).replace('!', '\!'), psk=str(psk).replace('!', '\!'), conf=wpa_supplicant_conf ) cmd_result = "" cmd_result = os.system(cmd) print cmd + " - " + str(cmd_result) # reconfigurar wifi cmd = sudo_mode + 'wpa_cli -i wlan0 reconfigure' cmd_result = os.system(cmd) print cmd + " - " + str(cmd_result) time.sleep(10) cmd = 'iwconfig wlan0' cmd_result = os.system(cmd) print cmd + " - " + str(cmd_result) cmd = 'ifconfig wlan0' cmd_result = os.system(cmd) print cmd + " - " + str(cmd_result) p = subproceso.Popen(['nombre_de_host', '-I'], stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = p.communicate() if out: ip_address = out else: ip_address = "<Not Set> " return ip_address def ssid_discovered(): Cells = Cell.all('wlan0') wifi_info = 'SSID encontrado: \n' para el valor actual en el rango (len(Cells)): wifi_info += Cells[current].ssid + "\n" wifi_info+="!" print wifi_info return wifi_info def handle_client(client_sock): # obtener SSID client_sock.send(ssid_discovered()) print "Esperando SSID..." ssid = client_sock.recv(1024) if ssid == '' : return print "ssid recibido" print ssid # obtener PSK client_sock.send("waiting-psk!") print "Esperando PSK..." psk = client_sock.recv(1024) if psk == '' : return print "psk recibido" print psk dirección_ip = wifi_connect(ssid, psk) print "dirección IP: " + dirección_ip client_sock.send("dirección_ip:" + dirección_ip + "!") return try: while True: server_sock=BluetoothSocket( RFCOMM ) ​​server_sock.bind(("",PORT_ANY)) server_sock.listen(1) port = server_sock.getsockname()[1] uuid = "815425a5-bfac-47bf-9321-c5ff980b5e11" advertising_service( server_sock, "Configuración Wifi RPi", id_servicio = uuid, clases_servicio = [ uuid, CLASE_PUERTO_SERIE ], perfiles = [ PERFIL_PUERTO_SERIE ]) print "Esperando conexión en el canal RFCOMM %d" % port client_sock, información_cliente = server_sock.accept() print "Conexión aceptada de ", client_info handle_client(client_sock) client_sock.close() server_sock.close() # configuración finalizada print 'Configuración finalizada\n' except (KeyboardInterrupt, SystemExit): print '\nSaliendo\n'

5. Después del paso anterior, es hora de hacer que el script sea ejecutable otorgando los permisos necesarios:

$ chmod +x ejecutar.py

Para ejecutar:

$ sudo ./run.py

6. En este punto, abra la aplicación de Android y seleccione la Raspberry Pi en la lista de dispositivos Bluetooth emparejados. Ingrese el SSID y el PSK y presione el "Iniciar configuración" . En unos segundos, la conexión Wi-Fi de la Raspberry Pi debería estar activada, como se muestra en las imágenes a continuación.

7. Para ejecutar el script durante el proceso de arranque del Pi, edite /etc/rc.local y agregue la siguiente línea de código:

(dormir 10;/ruta/al/script/./run.py)&

3. Configuración del sensor DHT22 - Hardware

1. Establezca las conexiones adecuadas, como se muestra en el diagrama a continuación:

4. Configuración del sensor DHT22 - Software

1. Instale los paquetes necesarios ejecutando los siguientes comandos:

$ sudo apt-get update
$ sudo apt-get install build-essential python-dev python-openssl git

2. Cargue la biblioteca de sensores. En mi caso, utilizo una biblioteca de Adafruit preconfigurada compatible con diversos sensores:

$ git clone https://github.com/adafruit/Adafruit_Python_DHT.git && cd Adafruit_Python_DHT

3. Con la biblioteca ya cargada, ejecute el siguiente comando para crear una biblioteca Python que le permita realizar la integración fácilmente para este y otros proyectos.

$sudo python setup.py instalar

4. Si todo funciona correctamente, deberíamos poder leer la temperatura y la humedad. La forma más sencilla es usar primero los archivos de demostración que ya están disponibles en nuestra Pi:

$ ejemplos de cd

5. Ejecute el siguiente código de ejemplo. El primer parámetro (11) indica qué sensor se utilizó (22 para el DHT22) y el segundo, a qué GPIO está conectado (no el número de pin, sino el número de GPIO). Esto produce una salida como la siguiente:

$ sudo ./AdafruitDHT.py 11 4

Resultado esperado:

$ sudo ./AdafruitDHT.py 11 4 Temperatura=24.0* Humedad=41.0%

5. Envío de datos a Ubidots

1. Cree un script de Python con el editor nano y pegue el código a continuación en la terminal. Para ello, inserte el siguiente comando:

$ sudo nano ubidots3.py

Código fuente:

import time import requests import math import random import sys import Adafruit_DHT sensor = 22 #Selecciona tu versión de DHT pin = 18 #Ingresa tu PIN de DHT22 TOKEN = "…" # Pon tu TOKEN aquí DEVICE_LABEL = "Raspberrypi" # Pon la etiqueta de tu dispositivo aquí VARIABLE_LABEL_1 = "temperature" # Pon tu primera etiqueta de variable aquí VARIABLE_LABEL_2 = "humidity" # Pon tu segunda etiqueta de variable aquí # Intenta obtener una lectura del sensor. Usa el método read_retry que reintentará hasta 15 veces para obtener una lectura del sensor (esperando 2 segundos entre cada reintento). humidity, temperature = Adafruit_DHT.read_retry(sensor, pin) # Descomenta la línea de abajo para convertir la temperatura a Fahrenheit. # temperatura = temperatura * 9/5.0 + 32 # Tenga en cuenta que a veces no obtendrá una lectura y # los resultados serán nulos (porque Linux no puede # garantizar el tiempo de las llamadas para leer el sensor). # ¡Si esto sucede, inténtelo de nuevo! def build_payload(variable_1, variable_2): # Crea dos valores aleatorios para enviar datos valor_1 = temperatura valor_2 = humedad carga útil = {variable_1: valor_1, variable_2: valor_2, } return payload def post_request(payload): # Crea los encabezados para las solicitudes HTTP url = "http://industrial.api.ubidotsubidots" url = "{}/api/v1.6/devices/{}".format(url, DEVICE_LABEL) headers = {"X-Auth-Token": TOKEN, "Content-Type": "application/json"} # Hace que las solicitudes HTTP status = 400 intentos = 0 mientras que status >= 400 e intentos <= 5: req = requests.post(url=url, headers=headers, json=payload) status = req.status_code intentos += 1 time.sleep(1) # Procesa los resultados si el estado >= 400: print("[ERROR] No se pudieron enviar los datos después de 5 intentos, por favor verifique sus credenciales de token y conexión a Internet") return False print("[INFO] solicitud realizada correctamente, su dispositivo está actualizado") return True def main(): payload = build_payload( VARIABLE_LABEL_1, VARIABLE_LABEL_2) print("[INFO] Intentando enviar datos") post_request(payload) print("[INFO] finalizado") if __name__ == '__main__': while (True): print('Temp={0:0.1f}* Humidity={1:0.1f}%'.format(temperature, humidity)) humidity, temperature = Adafruit_DHT.read_retry(sensor, pin) main() time.sleep(1) ```

Luego de pegar el código fuente, debes asignar el TOKEN Ubidots donde se indica en el script de Python:

$ sudo nano ubidots3.py

2. Ahora con todo configurado, puedes ejecutar el código de muestra para comenzar a transmitir datos a tu cuenta Ubidots :

$ sudo python ubidots3.py

En este punto, si accedes a la sección de dispositivos de tu cuenta de Ubidots podrás ver un nuevo dispositivo creado llamado “RaspberryPi”.

3. Para visualizar sus datos de forma eficiente, configuremos un Dashboard de Ubidots . Para crearlo, vaya a la Dashboard (Datos > Dashboard ).

4. Luego, presiona “ Agregar nuevo widget ” y selecciona tu widget:

5. Seleccione la variable que desea mostrar:

6. Dale un nombre personalizado al widget y presiona el ícono verde para finalizar la creación del widget.

Ahora puedes monitorear variables de forma remota desde cualquier ubicación gracias a la plataforma de desarrollo de aplicaciones IoT Ubidots :

Artículos recomendados: