Como jefe de comunicaciones rebelde, tu misión es crear un programa en Java que retorne la fuente y contenido del mensaje de auxilio. Para esto, cuentas con tres satélites que te permitirán triangular la posición, ¡pero cuidado! el mensaje puede no llegar completo a cada satélite debido al campo de asteroides frente a la nave.
Se optó por implementar un tipo de arquitectura clean ya que nos facilita centrarnos en la lógica de negocio y diferir ciertas decisiones, como por ejemplo que BBDD o Frameworks utilizar. Objetivo Principal del Nivel 1 del enunciado.
Nivel 1 (Solución feature/Level_1)
La solución general del nivel 1 se puede observar el el branch feature/Level_1 del corriente repositorio. Se observa que la problemática a resolver es la lógica de negocio de la aplicación.
Para solución de dicho problema geométrico se analizaron dos posibles métodos:
-
Triangulación
-
Trilateración
Se opto por la utilización del método de la trilateración ya que nos abstrae de la dificultad que conlleva el calculo con ángulos.
La trilateración es una técnica geométrica para determinar la posición de un objeto conociendo su distancia a tres puntos de referencia. A diferencia de la más conocida técnica de triangulación, en la que se miden ángulos y distancias, en la trilateración se utilizan sólo distancias.
Se utilizo la siguiente librería matemática que implementa la trilateración para disminuir la complejidad de realizar una implementación propia.
El algoritmo de localización se encuentra en la carpeta model dentro del core de la aplicación.
Para la implementación del algoritmo de decodificación se consideraron algunos supuestos:
- Se considera que los desplazamientos de los mensajes son de izquierda a derecha únicamente (->).
- Se considera que al menos a un satélite le llega el mensaje en la primera posición, de esta manera podemos saber la longitud inicial del mensaje.
- Encontrar el mensaje que nos indica la longitud correcta del mismo. Según supuesto 2.
- Eliminar desplazamientos que se le realizaron a los mensajes.
- Hacer un merge de los diferentes arrays.
- Verificar que el mensaje no posea huecos.
El algoritmo de decodificación se encuentra en la carpeta model dentro del core de la aplicación.
Nivel 2 (Solución feature/Level_2)
Se realizó mediante el uso del framework Spring Boot dos endpoints:
Obtener la ubicación de la nave y el mensaje que emite.
Obtener todos los Satelites activos.
Nivel 3 (Solución feature/Level_3)
Guardar mesaje llegado al satelite
Obtener la ubicación de la nave y el mensaje que emite.
Pipeline de integración continua para la generación de las imagenes de docker a deployar.
- Maven
- Docker
mvn test
mvn clean package
mvn package spring-boot:run
Build
docker-compose build
Arranque de la api
docker-compose up
Detener la api
docker-compose down
Se utilizó Swagger V3 (OpenApi) para documentar los diferentes endpoints.
Swagger es una serie de reglas, especificaciones y herramientas que nos ayudan a documentar nuestras APIs.
También nos brinda una interfaz de usuario para poder ejecutar los diferentes endpoints.