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:
<br />
POST http://apli.bizkaia.net/APPS/DANOK/TQWS/TQ.ASMX HTTP/1.1<br />
Host: apli.bizkaia.net<br />
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; es-ES; rv:1.9.2.10) Gecko/20100914 Firefox/3.6.10<br />
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8<br />
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<br />
Accept-Encoding: gzip,deflate<br />
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7<br />
Keep-Alive: 115<br />
Proxy-Connection: keep-alive<br />
Cookie: idioma=CA; RealApli=1056775084.20480.0000<br />
Referer: http://apli.bizkaia.net/apps/danok/tq/Resize.swf?horaEntrada=4885&idiomaEntrada=es<br />
Content-type: text/xml; charset=utf-8<br />
SOAPAction: "http://tempuri.org/LANTIK_TQWS/TQ/GetPasoParada"<br />
Content-length: 393</p>
<p><?xml version="1.0" encoding="utf-8"?><br />
<SOAP-ENV:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><br />
<SOAP-ENV:Body><br />
<GetPasoParada xmlns="http://tempuri.org/LANTIK_TQWS/TQ"><br />
<strLinea>*</strLinea><br />
<strParada>48036029</strParada><br />
</GetPasoParada><br />
</SOAP-ENV:Body><br />
</SOAP-ENV:Envelope><br />
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:
<br />
HTTP/1.0 200 OK<br />
Date: Mon, 27 Sep 2010 09:16:37 GMT<br />
Server: Microsoft-IIS/6.0<br />
X-Powered-By: ASP.NET<br />
X-AspNet-Version: 1.1.4322<br />
Cache-Control: private, max-age=0<br />
Content-Type: text/xml; charset=utf-8<br />
Content-Length: 5812<br />
X-Cache: MISS from escorpimc03.pandasoftware.local<br />
Proxy-Connection: keep-alive</p>
<p><?xml version="1.0" encoding="utf-8"?><br />
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><br />
<soap:Body><br />
<GetPasoParadaResponse xmlns="http://tempuri.org/LANTIK_TQWS/TQ"><br />
<GetPasoParadaResult><br />
<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><br />
</GetPasoParadaResult><br />
</GetPasoParadaResponse><br />
</soap:Body><br />
</soap:Envelope><br />
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.
<br />
<GetPasoParadaResult><br />
<PasoParada><br />
<cabecera>False</cabecera><br />
<e1><br />
<minutos>47</minutos><br />
<metros>17145</metros><br />
<tipo>SIN COMUNICACION</tipo><br />
</e1><br />
<e2><br />
<minutos>107</minutos><br />
<metros>39990</metros><br />
<tipo>NORMAL</tipo><br />
</e2></p>
<linea>A2610</linea>
<parada>48036029</parada>
<ruta>UPV/EHU</ruta><br />
</PasoParada><br />
<PasoParada><br />
<cabecera>False</cabecera><br />
<e1><br />
<minutos>62</minutos><br />
<metros>16803</metros><br />
<tipo>NORMAL</tipo><br />
</e1><br />
<e2><br />
<minutos>122</minutos><br />
<metros>37277</metros><br />
<tipo>NORMAL</tipo><br />
</e2></p>
<linea>A3511</linea>
<parada>48036029</parada>
<ruta>BILBAO</ruta><br />
</PasoParada><br />
...<br />
...<br />
</GetPasoParadaResult><br />
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.
<br />
Bengoetxe, Galdakao,Galdakao,48036002,43.23198189686291,-2.857748866081238<br />
Bengoetxe, Galdakao,Bilbao,48036015,43.23243136604213,-2.859540581703186<br />
Aperribai, Galdakao,Bilbao,48036016,43.240374698213465,-2.8738126158714294<br />
Aperribai, Galdakao,Galdakao,48036001,43.24008942056928,-2.873823344707489<br />
Urbi, Galdakao, Galdakao,48036052,43.2392355336108,-2.8744053840637207<br />
Kukullaga, Etxebarri, Bilbao,48029002,43.24677550835569,-2.888430655002594<br />
Kukullaga, Etxebarri, Etxebarri,48029001,43.246728618419084,-2.8887444734573364<br />
...<br />
...<br />