Android con API OpenCellid.org + JSON + Google Map (Geolocalizar BTS)

PocPresento en esta oportunidad una pequeña aplicación en Android que integra los siguientes conceptos:

  • Utilizar de un API de OpenCellid.org: Utilizado para obtener datos de la Estación Transceptora Base (BTS) o antena, a la cual se conecta nuestro celular en una comunicación GSM).
  • Utilizar la Clase TelephonyManager: Utilizado para obtener parámetros que tiene nuestro celular para geolocalizar la Estación Transceptora Base (BTS) o antena.
  • Utilizar JSON: Utilizado para manipular la respuesta del API OpenCellid.org con datos de la Estación Transceptora Base (BTS) o antena, a la cual se conecta nuestro celular en una comunicación GSM).
  • Utilizar Clase Interna de Java: Utilizada en la implementación de la Clase interna ManagerNet extiende de AsyncTask.
  • Utilizar Clase AsyncTask: Utilizado para realizar operaciones en segundo plano y publicar los resultados sobre el hilo de interfaz de usuario.
  • Utilizar Clase HttpURLConnection: Utilizado para establece comunicación de HTTP con el API OpenCellid.org.
  • Utilizar un WebView: Utilizado para mostrar el sitio web de Google Map embebido en nuestra aplicación.
  • Utilizar Google Map: Utilizado para geolocalizar la Estación Transceptora Base (BTS) o antena, a la cual se conecta nuestro celular en una comunicación GSM).

Tecnología GSM

Leyendo sobre la tecnología y funcionamiento GSM (Sistema Global para las Comunicaciones Móviles), es el estándar para la comunicación inalámbrica aplicada a teléfonos móviles, que hace uso de la red celular para su funcionamiento, estructura básica del sistema GSM, este se organiza como una red de células radioeléctricas continuas que proporcionan cobertura completa al área de servicio. Cada célula pertenece a una Estación Transceptora Base ó Estación Base (BTS) que opera en un conjunto de canales de radio diferentes a los usados en las células adyacentes y que se encuentran distribuidas según un plan celular, entre sus elementos principales se destaca:

  1. Estación Móvil (MS): que es un dispositivo para comunicarse dentro de la red (teléfono, tablet, pc, etc).
  2. Estación Transceptora Base ó Estación Base (BTS): que es un transmisor/receptor usando para transmitir/recibir señales de la sección de radio de la red.
  3. Centro Conmutador Móvil (MSC): establece y mantiene las llamadas que se hacen en la red.
  4. Controlador de estación base (BSC): controla las comunicaciones entre grupos de estaciones tranceptoras bases (BTS’s) y un solo centro conmutador móvil.
  5. Red de telefonía publica conmutada (PSTN): que es la sección terrestre de la red.

Nuestra Aplicación:

Nuestra aplicación comprende los primeros dos elementos de la estructura de un área celular (GSM), el MS que seria nuestro celular y la Estación Base (BTS) la que proporciona servicio GSM donde estamos ubicados, nuestro objetivo es geolocalizar la Estación Base (BTS)  tomando como insumo datos que proporciona nuestro celular y utilizando la API OpenCellid.org para obtener las coordenadas geográficas de la Estación Base (BTS)  para luego mostrar ubicada la Estación Base (BTS) en Google Map.

Datos sobre el API OpenCellid.org

  1. Web Site: http://opencellid.org/
  2. OpenCellID es el proyecto de colaboración más importante del mundo de la comunidad que recoge las posiciones GPS de las torres de celulares, que se utiliza de forma gratuita, para una multitud de fines comerciales y privados.
  3. API: La mayoría de las llamadas a la API se requiere una clave de API, esta clave de se puede obtener al registrarse aquí .
  4. El API tiene documentación clara sobre su uso.

Datos requeridos para el API

Estos datos son obtenidos por medio de la clase de Android (TelephonyManager) estos datos están en nuestro celular:

  • Cellid o CID: Un número único utilizado para identificar la estación transceptora base GSM de que el teléfono está conectado.
  • LAC: Identifica el área de ubicación del teléfono dentro de una red móvil terrestre pública GSM.
  • MCC: Identifica el país de la red GSM.
  • MNC: Identifica el operador de la red GSM .
  • MCC + MNC: La unión de los dos códigos forma el PLMN (public land mobile network), el cual representa a un único operador.

Manos a la obra con la aplicación:

APIEsquema básico de funcionamiento de nuestra aplicación.


Permisos de la App, en AndroidManifest.xml:

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />

Nota:

  • READ_PHONE_STATE: Para la clase TelephonyManager.
  • ACCESS_COARSE_LOCATION: Para la clase  TelephonyManager método getCellLocation().
  • INTERNET: Para la clase  HttpURLConnection

Explicación de las Clases de la App:

  • Clase “BTS” es un clase de Entidad que representa la Estación Base (BTS).
  • Clase: BTS
  • Metodos: Tiene las propiedades (get and set) y un constructor.

  • Clase “LocalizaBTS” es la parte gráfica de la aplicación, contiene un clase interna “ ManagerNet” que extiende de AsyncTask<URL, Void, BTS> para realizar la conexión a la API en segundo plano y mostrando los resultado en la interfaz gráficas.
  • Clase: LocalizaBTS
  • Variables:
public String KEY_OPENCELLID = "your key"; //KEY de API (OpenCellid.org)
Nota: Obtiene la key registrandose: aquí 
public Integer cid,lac,mcc,mnc;
  • Metodos:
  • private void loadVariables(): Carga las variables necesarias para utilizar el API.
private  void  loadVariables() {
    try {
        TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
        GsmCellLocation location = (GsmCellLocation) tm.getCellLocation(); //Obtener 
         localización de GSM Location
        cid = location.getCid(); // GSM Cell ID (CID) is a generally unique number used to  
         identify each Base transceiver station (BTS)
        lac = location.getLac(); // Location area code (LAC)
        String netoperador = tm.getNetworkOperator(); //Obtener el Identificador de 
         Operador de Servicio (contiene el MCC y MNC)
        if (netoperador != null) {
            mcc = Integer.parseInt(netoperador.substring(0, 3)); //MCC
            mnc = Integer.parseInt(netoperador.substring(3)); //MNC
        }
    }catch (Exception E)
    {
    }
}
  • protected void onCreate(Bundle savedInstanceState): Refleja los resultados de API y Google Map en la interfaz gráfica.
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_get_poc);
        Button btn = (Button)findViewById(R.id.button);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v)  {
                try {
                    // Cargar valores de variables requeridas para el API(OpenCellid)
                    loadVariables();
                    //Url con los parametros necesarios para el API la respuesta sera 
                       recibida en formato: JSON
                    String file = "/cell/get?key=" + KEY_OPENCELLID + "&mcc=" + 
                      mcc.toString() + "&mnc=" + mnc.toString() + "&lac=" + lac.toString() + 
                      "&cellid=" + cid.toString() + "&format=json";
                    URL link = new URL("http","opencellid.org",-1,file);
                    //Instancia de clase interna AsyncTask
                    ManagerNet task = new ManagerNet();
                    task.execute(link);

                }catch (Exception E) {
                     E.printStackTrace();
                }
                }
            }
        );
}

  • Clase: ManagerNet
  • Metodos:
  • protected BTS doInBackground(URL …urls):Realiza la acción de comunicarse con el API y recibir la respuesta en formato JSON.
@Override
protected BTS doInBackground(URL ...urls) {
    BTS cell = null;
    HttpURLConnection urlConnection = null;
    try {
        URL link = urls[0]; // El parametro de URL
        urlConnection = (HttpURLConnection) link.openConnection(); 
        urlConnection.setReadTimeout(10000);
        urlConnection.setConnectTimeout(15000);
        urlConnection.connect();
        // Obtener el estado del recurso
        int statusCode = urlConnection.getResponseCode();
        if (statusCode != urlConnection.HTTP_OK) {
            cell = null;
        } else {
            // Se captura la respuesta de HttpURLConnection GET -> formato JSON
            InputStream in = new BufferedInputStream(urlConnection.getInputStream());
            // Parsear el flujo con formato JSON
            JSONReader jsor = new JSONReader(in);
            cell = jsor.getObject();
        }
        return cell;
    } catch (IOException e) {
        return null;
    }
    finally
    {
        urlConnection.disconnect();
    }
}
  • protected void onPostExecute(BTS cell): Muestra las coordenadas geográficas obtenidas del API y las geolocaliza en Google Map.
@Override
protected void onPostExecute(BTS cell) {

    //Muestra la Longitud y Latitud
    TextView txt = (TextView) findViewById(R.id.textView);
    txt.setText("Longitud: " + cell.getLon().toString() + " Latitud: " +     
     cell.getLat().toString());

    //Muestra los punto (lon, lat) en google map por medio de un control WebView
    WebView webview = (WebView) findViewById(R.id.webView);
    webview.setWebViewClient(new WebViewClient());
    webview.getSettings().setJavaScriptEnabled(true);
    webview.loadUrl("http://maps.google.es/?q=" + cell.getLat().toString() + "%20" + 
     cell.getLon().toString());
}

  • Clase “JSONReader” es una clase de manejo de la respuesta en formato JSON del API.
  • Clase: JSONReader
  • Metodos:
  • public JSONReader(InputStream in): constructor de la Clase.
  • public BTS getObject(): Obtiene el Objeto BTS a partir de la respuesta JSON.
  • private String getStringFromInputStream(InputStream is): Convierte Stream a un String.
  • public BTS readJSONtoObject(JSONObject reader): Convierte un Objeto JSON a un BTS.

Formato de la respuesta en JSON del API:

{
  "lon": -73.245,
  "lat": 42.46,
  "mcc": 310,
  "mnc": 119,
  "lac": 48,
  "cellid": 4127,
  "averageSignalStrength": -90,
  "range": 123,
  "samples": 5,
  "changeable": true,
  "radio": "CDMA",
  "cid": 119,
  "rnc": 48
}

Resumen:

Se destaca la implementación de un API como OpenCellid.org, manejo de respuestas en formato JSON, uso de una clase interna o embebida que extiende de AsyncTask<param,accion,result> para el manejo de acciones en segundo plano y mostrando de resultados sobre e hilo de interfaz de usuario. También algunos conocimientos en la tecnología GSM, geolocalización en Google Map de la Estación Base (BTS) que proporciona servicio a nuestro celular.

MediaFire: El código fuente de la app disponible.

Gracias, comenta y comparte.

Advertisements

One thought on “Android con API OpenCellid.org + JSON + Google Map (Geolocalizar BTS)

  1. Muchas gracias por el código fuente, tengo un proyecto y quería saber justamente lo que enseñaste en la app, estoy aprendiendo programación Android y me cuesta un poco arrancar a programar, esto ayuda un montón!!! Mil Gracias!!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s