Creando aplicación de Bizkaibus para Android (Parte 2)
En este segundo post voy a explicar la parte mas importante de la aplicación: como obtener los tiempos de llegada de los autobuses a cada parada.
Como en toda aplicación web, lo normal es la mayoría de aplicaciones de diseñen en forma de Web Services a los que hacer peticiones HTTP para consultar cierta información. Una de los protocolos que durante bastante tiempo fue muy popular es SOAP (Simple Object Access Protocol), que básicamente es una petición http utilizando el metodo POST en la cual el cuerpo de la petición es una estructura xml con un formato determinado que nos permitirá enviar cierta información que será analizada por el Servicio Web que nos responderá con una estructura XML con la información solicitada.
Utilizando un sniffer de red tipo Wireshark es posible capturar una petición y respuesta de este tipo. La petición de información sobre la parada 48036029 tendrá la siguiente estructura:
[code lang="xml"]
POST http://apli.bizkaia.net/APPS/DANOK/TQWS/TQ.ASMX HTTP/1.1
Host: apli.bizkaia.net
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-es,eu;q=0.8,es;q=0.7,en-us;q=0.5,en;q=0.3,de-de;q=0.2
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Proxy-Connection: keep-alive
Cookie: idioma=CA; RealApli=1056775084.20480.0000
Referer: http://apli.bizkaia.net/apps/danok/tq/Resize.swf?horaEntrada=4885&idiomaEntrada=es
Content-type: text/xml; charset=utf-8
SOAPAction: "http://tempuri.org/LANTIK_TQWS/TQ/GetPasoParada"
Content-length: 393
[/code]
Como vemos es una petición POST donde destacan la cabecera “SOAPAction” y el cuerpo del mensaje que se trata de una estructura XML donde en la etiqueta <strParada> esta completada con el ID de la parada que queremos consultar.
Si la petición esta correctamente formateada, obtendremos una respuesta con la siguiente información:
[code lang="xml"]
HTTP/1.0 200 OK
Date: Mon, 27 Sep 2010 09:16:37 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 1.1.4322
Cache-Control: private, max-age=0
Content-Type: text/xml; charset=utf-8
Content-Length: 5812
X-Cache: MISS from escorpimc03.pandasoftware.local
Proxy-Connection: keep-alive
<GetPasoParadaResult><PasoParada><cabecera>False</cabecera><e1><minutos>47</minutos><metros>17145</metros><tipo>SIN COMUNICACION</tipo></e1><e2><minutos>107</minutos><metros>39990</metros><tipo>NORMAL</tipo></e2><linea>A2610</linea><parada>48036029</parada><ruta>UPV/EHU</ruta></PasoParada><PasoParada><cabecera>False</cabecera><e1><minutos>62</minutos><metros>16803</metros><tipo>NORMAL</tipo></e1><e2><minutos>122</minutos><metros>37277</metros><tipo>NORMAL</tipo></e2><linea>A3511</linea><parada>48036029</parada><ruta>BILBAO</ruta></PasoParada><PasoParada><cabecera>False</cabecera><e1><minutos>7</minutos><metros>754</metros><tipo>NORMAL</tipo></e1><e2><minutos>27</minutos><metros>5529</metros><tipo>NORMAL</tipo></e2><linea>A3621</linea><parada>48036029</parada><ruta>BILBAO</ruta></PasoParada><PasoParada><cabecera>False</cabecera><e1><minutos>11</minutos><metros>1979</metros><tipo>NORMAL</tipo></e1><e2><minutos>71</minutos><metros>21043</metros><tipo>NORMAL</tipo></e2><linea>A3631</linea><parada>48036029</parada><ruta>BILBAO</ruta></PasoParada><PasoParada><cabecera>False</cabecera><e1><minutos>12</minutos><metros>3728</metros><tipo>NORMAL</tipo></e1><e2><minutos>56</minutos><metros>14889</metros><tipo>NORMAL</tipo></e2><linea>A3641</linea><parada>48036029</parada><ruta>ARRIGORRIAGA</ruta></PasoParada><PasoParada><cabecera>False</cabecera><e1><minutos>2</minutos><metros>481</metros><tipo>NORMAL</tipo></e1><e2><minutos>64</minutos><metros>23008</metros><tipo>NORMAL</tipo></e2><linea>A3911</linea><parada>48036029</parada><ruta>BILBAO</ruta></PasoParada><PasoParada><cabecera>False</cabecera><e1><minutos>27</minutos><metros>12575</metros><tipo>NORMAL</tipo></e1><e2><minutos>146</minutos><metros>38793</metros><tipo>NORMAL</tipo></e2><linea>A3912</linea><parada>48036029</parada><ruta>BILBAO</ruta></PasoParada><PasoParada><cabecera>False</cabecera><e1><minutos>16</minutos><metros>7537</metros><tipo>NORMAL</tipo></e1><e2><minutos>77</minutos><metros>31963</metros><tipo>NORMAL</tipo></e2><linea>A3917</linea><parada>48036029</parada><ruta>BILBAO</ruta></PasoParada><PasoParada><cabecera>False</cabecera><e1><minutos>53</minutos><metros>14084</metros><tipo>NORMAL</tipo></e1><e2><minutos></minutos><metros>-1</metros><tipo>INV</tipo></e2><linea>A3919</linea><parada>48036029</parada><ruta>OROZKO (Ibarra)</ruta></PasoParada><PasoParada><cabecera>False</cabecera><e1><minutos>113</minutos><metros>36355</metros><tipo>NORMAL</tipo></e1><e2><minutos></minutos><metros>-1</metros><tipo>INV</tipo></e2><linea>A3919</linea><parada>48036029</parada><ruta>OROZKO Uribiarte</ruta></PasoParada><PasoParada><cabecera>False</cabecera><e1><minutos>38</minutos><metros>20112</metros><tipo>NORMAL</tipo></e1><e2><minutos>157</minutos><metros>85232</metros><tipo>NORMAL</tipo></e2><linea>A3925</linea><parada>48036029</parada><ruta>BILBAO</ruta></PasoParada><PasoParada><cabecera>False</cabecera><e1><minutos>282</minutos><metros>138213</metros><tipo>NORMAL</tipo></e1><e2><minutos></minutos><metros>-1</metros><tipo>INV</tipo></e2><linea>A3925</linea><parada>48036029</parada><ruta>BILBAO</ruta></PasoParada><PasoParada><cabecera>False</cabecera><e1><minutos>96</minutos><metros>33686</metros><tipo>NORMAL</tipo></e1><e2><minutos>216</minutos><metros>80815</metros><tipo>NORMAL</tipo></e2><linea>A3925</linea><parada>48036029</parada><ruta>BILBAO</ruta></PasoParada></GetPasoParadaResult>
[/code]
La información que nos interesa esta dentro de la etiqueta <GetPasoParadaResult> y comos e puede ver los caracteres no alfanuméricos están codificados en HTML. Decodificando esta parte obtenemos una estructura xml, esta vez con la información que nos interesa.
[code lang="xml"]
...
...
[/code]
Comos e puede ver la estructura resultante dispone de diferentes estructuras <pasoParada> que tiene dos elementos <e1> y <e2> que son las dos estimaciones de tiempo que se dan por línea (tanto en minutos como tiempo). En la etiqueta <linea> tenemos información de la línea que sigue dicho autobús y en la etiqueta <ruta> el destino final.
Una vez conocido el sistema de consulta de tiempos toca la labor de chinos de consultar cada parada en la interfaz grafica para obtener su código y así tener una lista que relacione: nombre de la parada, población, dirección, código de la parada, latitud, longitud.
[code lang="css"]
Bengoetxe, Galdakao,Galdakao,48036002,43.23198189686291,-2.857748866081238
Bengoetxe, Galdakao,Bilbao,48036015,43.23243136604213,-2.859540581703186
Aperribai, Galdakao,Bilbao,48036016,43.240374698213465,-2.8738126158714294
Aperribai, Galdakao,Galdakao,48036001,43.24008942056928,-2.873823344707489
Urbi, Galdakao, Galdakao,48036052,43.2392355336108,-2.8744053840637207
Kukullaga, Etxebarri, Bilbao,48029002,43.24677550835569,-2.888430655002594
Kukullaga, Etxebarri, Etxebarri,48029001,43.246728618419084,-2.8887444734573364
...
...
[/code]
















