Linux Admin

Friday, May 11, 2012

IETT'nin sagladigi otobus konum bilgisi

Mobil cihazlar için 2 gencin geliştirdiği gayet güzel çalışan Nerde bu Otobüs adlı bir uygulama var, istanbulda otobüs bekleyen bir çok insanın en büyük yardımcısı, harita üzerinde otobüslerin konumlarını gösteriyor ve bu sayede beklediğim otobüsün bulunduğum durağa ne zaman otobüs geleceğini tahmin edebiliyorum. Aşağıdaki testleri ve denemeleri yapana kadar otobüs konum bilgilerinin sık sık güncellendiğini düşünüyordum, Nerde bu Otobüs uyglamasının internet'teki sss sayfasında da hat bilgilerinin 4 dakikada bir güncellendiği'ne dair bir ibare var. Uygulamanın sağladığı otobüs konumlarının güncellenip güncellenmediğini heniz tam test etmedim ama bu güncelleme sadece İETT'nin sağladığı verileri sorgulama sıklığı olabilir ki İETT zaten en sık yarım saatte bir kez güncelleme yapıyor gibi.

Verileri nereden alıyor bu amcalar, bunun daha düzgünü de yapılabilir diyerek kayınçoyla oturup biraz (2 saatten uzun sürdü hepsi) inceledik. önce http://mobil.iett.gov.tr/ sayfasındaki otobüsüm nerede bağlantısını farkettik, herhalde buralardan alıyorlar verileri diye düşündük. Ama ayrıştırması çok zor bir veri gibi görünüyordu.

Sonra asıl uygulamanın veriyi nasıl çektiğine bakalım dedik ve nasıl yapsak, nasıl yapsak diye düşünürken şöyle bir yöntem bulduk: Benim android telefonumu SSHTunnel ile bilgisayarım üzerinden proxy'ledik ve bilgisayarda wireshark ile trafiği izlerken "nerde bu otobüs"ü açtık hat listesi aldık, otobüs konumlarını aldık, şöyle bir gezindik. Uygulamanın arka tarafındaki servis düz HTTP olduğu için güzelce eriştiği bütün URL'leri alabildik.

Nerde bu Otobüs uygulamasının arka tarafı ASP ile yazılmış, zaten gelistiren cocuklar da Microsoft Student Partner'lar falan, benim tabirimle microsoft'çu çocuklar (maalesef M$ bu yetenekli gençleri daha okulları bitmeden kazanmış bile). Baktık uygulama verileri kendi sitelerinden http://nerdebuotobus.com/getLineBusses.aspx?line=19Z&points=1http://nerdebuotobus.com/getLineStopSchedules.aspx?line=19B&stop=A1871&output=json gibi URL'ler ile çekiyor.

Sonra bu verilerin iett'nin mobil sitesinde bulduğumuzdan çok daha düzgün yapıya sahip olduğu sonucuna varıp başladık fikir yürütmeye. Kendi çapında uygulama geliştiren iki gencin İETT ile anlaşması olamaz, demek ki bu verileri İETT açıktan bir yerlerden sağlıyor dedik. Nedense çok sonra İETT'nin sitesinden de otobüs konumlarının sorgulanabildiğini hatırlayıp bir baktık ki İETT harita sayfalarını gezerken bir yandan firebug açıp izleyince İETT'nin harita arayüzünde gösterdiği verileri zaten javascript/ajax ile xml olarak çektiğini ve Nerde bu Otobüs'çü gençlerin de dolaylı olarak bu XML'i döndüğünü anladık. Hat kodları, duraklar, otobüs konumları falan İETT baştan beri bize sunmuş zaten XML olarak. Nerde bu Otobüs için bunu json'a dönüştüren bir şey yazmışlar anlaşılan, çünkü gelen veri yapısı aynı idi.

İETT'nin XML'leri ortadaydı ve kolayca erişilebilirdi: http://harita.iett.gov.tr/XML/34otog.xml

Benzer şekilde hat kodları, otobüs saatleri ve diğer veriler de başından beri elimizde varmış, boşuna kasmışız Nerde bu Otobüs ile uğraşarak.

İstediğimiz verilere erişebildiğimizi anladıktan sonra bu verilerin ne kadar güvenilir olduğuna geldi sıra, önce iki otobüs hattı için (metrobüs olan 34 ve karşıya sık giden 112'yi seçtim) cron'a bir şey yazayım bir gün sonra bakayım ne sıklıkta güncelleniyor diye biraz izleyeyim diyordum ama dün farkettim ki iki haftadır o cron'ları unutmuşum. Bu sayede sık seferi olan iki otobüs hattı için iki haftalık güncelleme verisi toplamış oldum.

Geçtiğimiz 13 günde 112 ve 34 hatları için 10 dakikaya bir ilgili xml'leri şöyle topladım:

bekir@hede:~$ crontab -e

*/10 * * * * cd /free/iett; wget --header='Referer: http://harita.iett.gov.tr/' http://harita.iett.gov.tr/XML/112otog.xml
5,15,25,35,45,55 * * * * cd /free/iett; wget --header='Referer: http://harita.iett.gov.tr/' http://harita.iett.gov.tr/XML/34otog.xml

Toplanan dosyalar şu şekilde biriktiler:

bekir@hede:/free/iett$ ls -lrt
toplam 54328
-rw-r--r-- 1 bekir bekir   886 Nis 29 02:15 112otog.xml.9
-rw-r--r-- 1 bekir bekir   886 Nis 29 02:15 112otog.xml.8
-rw-r--r-- 1 bekir bekir   886 Nis 29 02:15 112otog.xml.7
-rw-r--r-- 1 bekir bekir   886 Nis 29 02:15 112otog.xml.6
-rw-r--r-- 1 bekir bekir   886 Nis 29 02:15 112otog.xml.5
-rw-r--r-- 1 bekir bekir   886 Nis 29 02:15 112otog.xml.4
-rw-r--r-- 1 bekir bekir   886 Nis 29 02:15 112otog.xml.3
-rw-r--r-- 1 bekir bekir   886 Nis 29 02:15 112otog.xml.2
-rw-r--r-- 1 bekir bekir   886 Nis 29 02:15 112otog.xml.15
-rw-r--r-- 1 bekir bekir   886 Nis 29 02:15 112otog.xml.14
-rw-r--r-- 1 bekir bekir   886 Nis 29 02:15 112otog.xml.13
-rw-r--r-- 1 bekir bekir   886 Nis 29 02:15 112otog.xml.12
-rw-r--r-- 1 bekir bekir   886 Nis 29 02:15 112otog.xml.11
-rw-r--r-- 1 bekir bekir   886 Nis 29 02:15 112otog.xml.10
-rw-r--r-- 1 bekir bekir   886 Nis 29 02:15 112otog.xml.1
...
-rw-r--r-- 1 bekir bekir   673 May 11 02:19 112otog.xml.1662
-rw-r--r-- 1 bekir bekir   673 May 11 02:19 112otog.xml.1661
-rw-r--r-- 1 bekir bekir   673 May 11 02:19 112otog.xml.1660
-rw-r--r-- 1 bekir bekir   673 May 11 02:19 112otog.xml.1659
-rw-r--r-- 1 bekir bekir   673 May 11 02:19 112otog.xml.1658
-rw-r--r-- 1 bekir bekir   673 May 11 02:19 112otog.xml.1657
-rw-r--r-- 1 bekir bekir   673 May 11 02:19 112otog.xml.1656
-rw-r--r-- 1 bekir bekir   673 May 11 02:19 112otog.xml.1655
-rw-r--r-- 1 bekir bekir   673 May 11 02:19 112otog.xml.1654
-rw-r--r-- 1 bekir bekir  1303 May 11 05:41 112otog.xml.1681
-rw-r--r-- 1 bekir bekir  1303 May 11 05:41 112otog.xml.1680
-rw-r--r-- 1 bekir bekir  1303 May 11 05:41 112otog.xml.1679
-rw-r--r-- 1 bekir bekir  1303 May 11 05:41 112otog.xml.1678
-rw-r--r-- 1 bekir bekir  1303 May 11 05:41 112otog.xml.1677
-rw-r--r-- 1 bekir bekir  1303 May 11 05:41 112otog.xml.1676
-rw-r--r-- 1 bekir bekir  1303 May 11 05:41 112otog.xml.1675
-rw-r--r-- 1 bekir bekir 16710 May 11 06:36 34otog.xml.1673
-rw-r--r-- 1 bekir bekir 16710 May 11 06:36 34otog.xml.1672
-rw-r--r-- 1 bekir bekir 16710 May 11 06:36 34otog.xml.1671
bekir@hede:/free/iett$ 


Sonra bu verileri inceleme faslına gelince farkettim ki 10 dakikaya bir durmadan aynı dosyaları almışım, örneğin yukarıda ilk 15 kadar istek sürekli aynı veriyi almış. Bunun anlamı o dosyanın 15*10=150 dakikadır güncellenmediği. Sonra ben de otobüs konumlarını içeren bu XML'lerin ne sıklıkta güncellendiğine bakmak için şunları yaptım, aşağıdaki çıktılar 34 ve 112 hatları için hangi saatte kaç GPS güncellemesi geldiğini gösteriyor.

bekir@hede:/free/iett$ ls 112* | wc -l
1682
bekir@hede:/free/iett$ ls -lrt 112* | cut -d. -f1,2 | sort -u  | awk '{print $8" "$9}' | cut -d: -f1 | sort |uniq -c | sort -n | awk '{print $2, $1/13}' | sort 
00 1.53846
01 1.46154
02 0.230769
05 0.384615
06 0.230769
07 1.07692
08 0.769231
09 1.38462
10 1.84615
11 2.07692
12 1.69231
13 1.23077
14 1.92308
15 2.15385
16 1.84615
17 2.07692
18 1.61538
19 2
2011 0.0769231
20 2
21 1.69231
22 2.23077
23 2

bekir@hede:/free/iett$ ls 34* | wc -l
1674
bekir@hede:/free/iett$ ls -lrt 34* | cut -d. -f1,2 | sort -u  | awk '{print $8" "$9}' | cut -d: -f1 | sort |uniq -c | sort -n | awk '{print $2, $1/13}' | sort 
00 3.92308
01 2.69231
02 1.07692
05 0.692308
06 0.615385
07 1.15385
08 2.23077
09 3.69231
10 3.53846
11 3.53846
12 3.30769
13 3.84615
14 3.53846
15 2.84615
16 3.69231
17 3.46154
18 2.92308
19 3.61538
20 3.23077
21 3.15385
22 3.92308
23 4.30769
bekir@hede:/free/iett$ 

Otobüs konum verileri en yoğun saatlerde ancak 2-3 kez güncelleniyor, gece de 02:00-05:00 arasında servisi de kapatıyorlar gibi, yani her şey yalanmış. İnanmadım bir de IETT'nin harita sayfasında da denedim, maalesef sonuçlar doğru çıktı. Öyle otobüs beklerken falan otobüs konumlarına bakmak çok anlamsızmış.

Bu arada yukarıda bahsettiğim "otobüsüm nerede" bağlantısı sık sık güncelleniyor gibi, doğruluğunu test etmedim ama belki oradaki veri gerçekten daha sık güncelleniyordur.

About Me

My photo

Breakfast rocks, eating is fun, Linux is also fun and all that other good stuff...

At first I was a webmaster who creates pages with FrontPage, but that was not that fun.

Then simply resigned to be able to use Linux in my daily work. After that I worked as a, respectively,
  • desperate customer responsible,
  • software product administrator,
  • not so bad software developer,
  • not so good project manager, and at least
  • system administrator.

Until I found my girl friend, I've always thought everything are as they should be, but apparently they were not. I like my job, love my love, and its getting better day by day.