Acceso por API (funcionamiento)

8a5da52ed126447d359e70c05721a8aa

Al plantear el proyecto pensé muchas formás de hacerlo, pero pensando en la escalabilidad me quedé con la opción de que los clientes (las puertas) fueran lo más “tontas/simples” posibles.

Para conseguir esto necesitaba una parte del servidor potente, por lo que me decanté por Django y… ¿Cómo tener N puertas? ¿Cómo hacer las puertas lo más baratas-simples posibles?

Lo fácil hubiera sido poner un ordenador tipo Raspberry Pi por puerta, pero eso no era lo que quería (aunque fuera lo más fácil).

La mejor opción que encontré fue hacer una API, en la que pudiera utilizar diferentes tecnologías en los clientes pero que para funcionar solo necesitara una conexión a internet para hacer las consultas.


¿Cómo funciona ahora?

Se hace una petición web a la siguiente url definida en el proyecto de Django:

tudominio/api/1/device/code

Explicación:

  1. El cliente (una puerta) lee del lector NFC y coge el tag.
  2. Ese tag lo pone en “code” y hace la petición anterior.
  3. El servidor parsea esa url, recibe el “code” y lo busca en la tabla de “devices” donde están almacenados los IDs de todos los tag.
  4. El tag está asociado un usaurio por lo que ya se tiene la identidicación.

 

Veamos un ejemplo:

django-admin-device

 

Hay un usuario con el Tag “123456” del tipo NFC. Al pasar este NFC el lector obtiene el Tag, crea la url y hace la petición web:

tudominio/api/1/device/123456

Para obtener la respuesta nos tendremos que autentificar:

django-api-auth

Si se tiene acceso a la API devuleve lo siguiente del Django REST framework:

django-api-response

Responde a la petición en formato JSON, que deberemos parsear en el cliente para obtener los datos que nos interese.

Por ejemplo para activar el relé de abrir la puerta deberá fijarse en el campo “result”. Si el usuario cumple con los requisitos de acceso el resultado será “True” y el relé se activará.

Ahora mismo la seguridad no es la máxima posible desde mi punto de vista, por lo que estoy estudiando como implementar HTTPS.

 


Otras formas de acceso

El proyecto deja abierto la posibilidad para añadir distintas formas de acceso.

Una de ellas puede ser por Telegram, al tener el Chatid único de cada usuario podría buscar por él al utilizar el comando “/open” del Bot de Telegram. Me gusta porque es una forma segura y elegante de entrar a un espacio con cualquier dispositivo que disponga de la aplicación y sin necesidad de ningún llevar ningún hardware extra tipo tarjeta NFC/RFID, etc…

Anuncios

8 comentarios sobre “Acceso por API (funcionamiento)

  1. Hola Hector, Enhorabuena por el estupendo proyecto que estas llevando a cabo. Es muy interesante y una gran idea!!

    Yo acabo de empezar a trastear con DRF por que también llegué a la conclusión de que puede ser la mejor forma de comunicar un ESP8266 con Django, mediante API. Pero me esta llevando por el camino de la desesperación 😦 !!

    La verdad es que casi no encuentro información por la Red de como realizar una petición POST desde un Sketch en Arduino y por medio del ESP8266 hacia un Modelo de Django, para registrar en MySQL los valores de lectura de varios sensores.

    Todo lo que veo por internet está realizado mediante PHP para recibir los datos del ESP y escribir en Base de Datos.
    La verdad es que podría utilizar este tipo de conector en mi proyecto para escribir en la Base de Datos y después leer y gestionar los datos mediante Django, pero pienso que es algo chapucero. No me gustaría ver ningún fichero PHP en el proyecto, jejeje.

    He estado estudiando tu código desde GitHub y veo que solo realizas una petición GET desde el Sketch hacía el DRF, pero aún así me he animado a escribirte y preguntarte si por la remota casualidad has probado a realizar alguna petición POST.

    La verdad es que he conseguido realizar escritura en la Base de Datos haciendo CURL desde consola haciendo la petición al DRF, pero no soy capaz de hacerlo desde el ESP y ya casi estoy por desistir y pasarme al lado oscuro del PHP.

    ¿Podrías arrojarme algo de luz sobre este tema?

    De antemano mis agradecimientos por el buen trabajo que estás realizando con tu proyecto y compartirlo con la Comunidad.

    Un cordial saludo.

    Me gusta

    1. Hola!
      Actualmente funciona por GET porque era la forma más simple de hacerlo. Pero ya tengo mirado como implementar las peticiones con POST. Ésta mejora la quiero añadir cuando logre hacer que el DRF me funcione por Tokens y no por user y pasword como ahora.

      Lo que he mirado para hacer la petición POST desde el sketch de Arduino sobre el ESP8266 es:
      https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.cpp#L320-L335

      Espero que sea de ayuda.

      Saludos!

      Me gusta

  2. Interesante la librería ESP8266HTTPClient. Pero si no me equivoco es para utilizarla sin Arduino, verdad? Es para programar solo el ESP.

    Esta librería me vendrá muy bien para cuando le meta mano al D1. Pero en el proyecto que estoy trabajando la idea es utilizar el ESP8266-01 como Cliente conectado a un Arduino Uno. Y de esta manera poder utilizar los pines digital/analógicos del Arduino.

    Seguiré peleando con el tema… Muchas gracias por la referencia Héctor..

    Saludos.

    Me gusta

    1. Correcto es para el ESP8266 con el Core de Arduino.

      Mi recomendación es que utilices simplemente el D1 (o D1 mini), es mucho más pontente que el Arduino que estes utilizando (y le sirve el mismo código). Acabas ahorrando tiempo de programación para unir dos aparatos cuando ya tienes uno “fusionado”. Tiempo = Recursos.

      Si por fuerza mayor tienes que utilizar el Arduino, prueba a poner el firmware del core de arduino al ESP8266-01 y comunicalo por serial con el Arduino. Envias los datos del Arduino por serial al ESP8266-01, y en este pones toda la lógica de conexión web.

      Saludos.

      Me gusta

  3. Hola soy nuevo en raspberry, y la verdad es que me esta costando instalar el software. no tendras alguna guia? ya que lo intente de diferentes formas y me salen diferentes errores por ejemplo : “python manage.py runserver 192.168.1.253:8001 Unhandled exception in thread started by ” Por otro lado queria consultarte si no tenes una version para ser utilizado con mysql.

    Saludos y si bien aun no pude probarlo veo que tiene muy buena pinta.
    Yo tengo uno con arduino uno mysql json y php pero veo en este proyecto mayor potencial.

    Me gusta

    1. Hola!
      Hacer una de las guías es una de las tareas pendientes más importantes que tengo que hacer, pero me falta tiempo libre =(.

      A la hora de instalarlo en la raspberry te recomiendo leer (y hacer) este tutorial de Django:
      http://tutorial.djangogirls.org/es/django_installation/
      Ahí te explicará como funciona todo.
      Por lo que veo prueba primero “python manage.py runserver” para ver que funciona en localhost.

      Puedes utilizar cualquier motor de base de datos ya que Django se encarga de eso. Yo tengo una versión con Postgresql, busca “Django Mysql” y editar el settings con la nueva info.

      Saludos.

      Me gusta

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s