En esta serie de dos entradas que tienen por hashtag #GPS_Dev, hablaremos del GPS desde su aspecto más básico (qué es, qué tipos hay) a su funcionamiento interno en Android (arquitectura, drivers, desarrollo).
Ayer hablamos de los principios básicos del GPS, así como los tipos que hay actualmente en el mercado, y hoy vamos a adentrarnos un poco en su arquitectura interna, en especial con dispositivos Android, pero a la hora de la verdad bien lo podemos extrapolar a cualquier dispositivo.
La imagen que acompaña esta entrada sirve de resumen para la misma.
Hay 5 elementos a tener en cuenta:
El Chip
Se trata de un receptor de radiofrecuencia. Su funcionamiento ya lo vimos en la anterior entrada, así que no indagaré más en el asunto.
El driver
Como el resto de drivers, sirve de controlador para el chip, esto es, comunica la información recibida por el chip de radio frecuencia a lenguaje informático mediante una API de bajo nivel. Consta de varios archivos, alojados por lo general en /System/lib/hw (en algunas versiones en /Vendor/Lib/hw), del tipo gps.*.os (gps.profile.os, gps.default.os,…). Son los propios fabricantes quienes liberan este producto, y a no ser que tengas en mente crear tu propio smartphone carecen de importancia.
GL Engine
Llegamos a la parte interesante de esta guía. El GL Engine es el encargado de suministrar la localización de los nodos de radiofrecuencia (las torres) cercanas, guardando los datos obtenidos (en caso de que sean nuevos o actualizados) en el GPS Lock.
Si leísteis el anterior artículo, recordaréis que había dos métodos para obtener la triangulación necesaria para la localización GPS. Por un lado, la consulta mediante un paquete enviado por radiofrecuencia a las torres cercanas, y el análisis de los tiempos de retardo en contestación, lo que era bastante lento. Y por otro lado, conectándose a internet y leyéndolo de un directorio SUPL/NTP (más rápido). Tanto si se usa una de ellas o las dos, el GL Engine se encarga también de guardar los datos recogidos en el NVRAM para futuras consultas.
Los archivos encargados de esta función se encuentran en Android en /system/bin (carpetas con nombres del tipo glgps, gpsd,.). y afortunadamente para nosotros, están escritos en lenguaje XML, por lo que su configuración y entendimiento es relativamente sencillo.
Son estos ficheros los que por lo general reciben la modificación de aplicaciones root que nos aceleran la geolocalización. O bien modifican el fichero de configuración del GPS (GPS.conf), o bien te agregan consultas NVRAM, o bien las dos cosas.
Servicios de Localización
Pertenecen al Framework de Android, y por tanto estamos hablando de java. Se trata de un grupo de funciones contenidas en el paquete android.location del framework que controlan diferentes aspectos del GPS con el fin de comunicarse entre Apps y GL Engine.
Algunos ejemplos son:
- addGpsStatusListener(GpsStatus.Listener listener): Cambiar el estado del GPS a «escuchando».
- getProviders(Criteria criteria, boolean enabledOnly): Devuelve una lista de torres cercanas que satisfagan X criterios pasados a la función.
Tenéis más información al respecto en la propia web del desarrolladores de Android, o en los comentarios de XDA Developers.
Aplicaciones
La última capa son las aplicaciones que tenemos instaladas en nuestro terminal. Estas se sirven del framework para comunicarse con el resto de capas, y hacer de forma transparente todo lo necesario para que nosotros disfrutemos de la experiencia check-in, o perdamos la dignidad por fb asegurando lo bien que nos lo estamos pasando en tal fiesta mientras el GPS dice lo contrario.
Y con esto hemos llegado al final de este minitutorial de acercamiento al GPS. Ya podéis dormir tranquilos, G.G.