👁 146
In-flight развлекухи
Aloha! Cześć! Прывітанне!
Докладываю обстановочку: не так давно у меня был полет из Петербурга в Прибайкалье с пересадкой в Домодедово. До боли известные многим слова «Дамы и господа, приветствуем вас на борту Зеленые Огурцы Airlines» внезапно пополнились фразой
«специально для вас на самолете предусмотрена развлекательная система»
Ого-го! Стало интересно. Так интересно, что вылилось в отдельный пост.
Но сперва немножко откатимся в прошлое.
Вообще, первое «развлечение» на борту самолета в виде показа кинофильма было осуществлено аж в 1921 году в США, во время выставки «Pageant of Progress». Фильм, правда, был немой. Нет, ну а что вы хотели от технологий столетней давности?)0)0)0)))
Со временем авиакомпании вошли во вкус, и так, например, в 1930х годах на телевизоре в салоне можно было наблюдать экспериментальные телевизионные передачи. Был даже такой прикол: оператор с земли снимал взлет самолета, а пассажиры видели это в салоне на экране. Зумеры, залипающие в стримы на twitch, конечно не поймут, но по тем временам это был хайтек. Такую штуку провернули United Airlines в конце 1939 года.
В итоге к концу 1980х — началу 1990х авиапромышленность пришла к тому, что в подголовниках впереди стоящих кресел можно было наблюдать дисплеи, на которых можно было смотреть кинцо, и к которым подключались наушники. Плюс, на части лайнеров, бороздящих небесные просторы, можно до сих пор легко заметить разного рода занятные артефакты – типа всяких разных пультов и разъемов для наушников в подлокотниках.
Понятно, что к 2020 году люди поголовно имеют здоровенные смартфоны, планшеты, лаптопы и еще бог знает что. Поэтому экраны в спинках кресел стали неактуальны, а вот Wi-Fi адаптеры и веб-интерфейсы – вполне. Кстати, про то, как работает доступ в интернет по Wi-Fi в самолете можно почитать у Вастрика.
В итоге, подключившись к Wi-Fi, меня перенаправило на симпатичный локальный портальчик, где можно найти музыку, книжки, кинцо. Ассортимента хватит на долгий полет, но это было неинтересно – господи, да кто из нас не делал сайты и порталы? Механика там довольно понятна. (Мы же все в душе Web Developer’ы) Мы же все видели как устроены самые обычные сайты с картинками, видосиками и прочим.
Куда интереснее выглядела кнопка «Карта полета»
На карте полета есть специальное окошко, где отображается не только время в аэропортах вылета и прибытия, но и скорость, высота, расстояние до пункта назначения.
Выглядит интересно. Согласитесь, вряд ли эти данные будут передаваться откуда-то с земли, учитывая что большая часть России – тупо лес. Сейчас бы в глухом лесу ставить вышку чтоб в самолет данные о самолете и слать, лол. Остается вариант с тем, что эта система автономна. Вопрос насколько?
Попробуем разобраться с двумя следующими вопросами:
- Как отображаются карты и откуда они берутся?
- Как получаются координаты, по которым рисуется самолетик?
Штурман, дай карту! 🗺
Чем удобен веб-интерфейс? Тем, что вооружившись консолью разработчика в браузере можно что-нибудь подсмотреть. Откроем веб-инспектор и посмотрим, что там у нас пришло:
Если посмотреть на картинки, которые летят нам от сервера, то можно обнаружить, что они одного размера – 256×256 пикселей. Они конечно пронумерованы, но логику нумерации восстановить, увы, не удалось. В зависимости от зума, картинки грузятся разными по четкости. Значит, это еще и поделено на слои:
Приглядевшись к предыдущему скриншоту, можно обнаружить еще интересные файлики в .geojson формате.
Выглядят они как-то так:
{"type":"FeatureCollection","features":
[{"type":"Feature","properties":{"1_2":"Yilan"},
"geometry":{"type":"Point","coordinates":[121.75,24.75]}},{"type":"Feature","properties":{"1_2":"Artigas"},
"geometry":{"type":"Point","coordinates":[-56.486020143242115,-30.415987122826664]}},{"type":"Feature","properties":{"1_2":"Baltasar Brum"},
"geometry":{"type":"Point","coordinates":[-57.31997440756845,-30.730024801864317]}},…
GeoJson – круто. Как минимум потому, что с недавних пор в Kibana можно напрямую маппить их на карту 😉 Проиндексируем данные, а потом посмотрим каждый слой отдельно.
Если присмотреться (и на карту России, и на карту США например), то первая мысль приходящая в голову при просмотре слоев такая:
- Слой 2 – что-то совсем небольшое, пригороды, или что-то рядом с важными портами? Вот смотрите. Черногорск – пригород Абакана, Прокопьевск рядом с Новокузнецком, Искитим рядом с Новосибирском, Зеленодольск у Казани, а Дуйсбург, Эссен, Дортмунд, Вупперталь – рядом с Дюссельдорфом.
- Слой 5 – что-то совсем крупное, совсем отдельное? Если посмотреть – Новосибирск отдельно, Красноярск отдельно, Братск, Иркутск, Питер. Но чисто Москвы например вообще на слоях нет. Эээм, штоа?
В принципе, если включать постепенно отображение слоёв в Kibana, то больше подходит мысль, что разработчики постарались просто более-менее равномерно распределить точки по карте, чтобы покрытие было вменяемым. По крайней мере, я пришел к такому выводу.
Резюмируя: Внутри системы автономно запилены карты, которые нарезаны на несколько слоёв, а каждый слой в свою очередь распилен на квадратики. Плюс, точки для отображения на карте также разбиты на несколько слоев.
Штурман, мы где? 🧭
Хехе, ответ в рифму нужен?))0)))0
Не нужен, конечно. Поэтому обратим внимание на несколько вещей.
Вот кусочек файла с исходным кодом от карты:
... }, b = function () {
HttpClient.get('/api/route?t=' + (new Date).getTime(), n, o);
}, w = function () {
HttpClient.get('/api/flightdata?t=' + (new Date).getTime(), t, o);
}, B = function () {
m + 9e5 < (new Date).getTime() ? b() : w(), setTimeout(function () {
B();
}, 5e3);
}, x = function () {… }; ...
У нас тут есть два endpoint’а. Перый это flightdata. Это данные о полете, которые отображаются на панели с данными. Судя по содержимому поля localTime, данные запрашиваются каждые 5 секунд. Запрос по определенному моменту времени идет в формате timestamp:
http://map.azazasystem.aero/api/flightdata?t=1580099771508
Ответ будет выглядеть следующим образом:
{
"lon": "36.020308",
"lat": "57.156326",
"groundSpeed": 507,
"heading": "134.9",
"elapsedFlightTime": "00:27",
"orig": {
"lon": 30.262500762939453,
"lat": 59.800300598144531,
"code": "LED",
"localTime": "2220-01-16T18:25:40"
},
"dest": {
"localTimeAtArrival": "2220-01-16T18:40:10",
"lon": 37.906299591064453,
"lat": 55.408798217773438,
"code": "DME",
"localTime": "2220-01-16T18:25:40"
},
"timeDest": "00:14",
"distDest": "122.3",
"altitude": 37000,
"flightNumber": "KEK9999",
"clearRoute": false,
"displayProjectedPath": false,
"utc": "2220-01-16T15:25:40",
"displayPA": false,
"arincAvailable": true
}
Еще там прилетают данные с route-эндпоинта, которые выглядят вот так:
{
"route": [
{
"lat": 55.400894165039063,
"lon": 37.896450267118567,
"ele": 0.0
},
{
"lat": 55.40350341796875,
"lon": 37.893299775965069,
"ele": 0.0
}, …
Эти данные я взял во время вылета из Петербурга в Москву (сразу после вылета). Это важная ремарка, потому что сейчас мы кое-что заметим.
Вспоминаем, что в Elastic есть еще один интересный тип данных – geo-point. Указываешь в index-mapping, что объект – это гео-точка, а дальше он сам понимает где у тебя широта и долгота. Пара кликов, выпилим ненужное поле из json, визуализируем:
Так вот, присмотревшись, увидим одну полную кривую от Домодедово до Пулково, а вторая кривая – неполная. Вторая – как раз рейс, посреди которого я и достал тот самый путевой файлик. Более того, на карте явно можно разглядеть, на какую полосу самолет садился, а с какой – взлетал.
Вуаля. Тут и никакой Flightradar не нужен 🙂 Значит, у нас еще хранятся данные от предыдущего рейса. Приколясы!
Естественно, в прилетающих данных кроме того встречались параметризованные переменные для всего: язык и локализация, лого, цвет линий, словом всё, что можно было кастомизировать тому, кто будет это использовать.
По итогу.
Что-то интересное удалось достать. Даже что-то удалось подсмотреть. Но… на самом деле это все было довольно очевидно.
С одной стороны оказывается, что многие вещи устроены довольно просто. Ну, то есть распилить карту по кусочкам и слоям, наметить кучу точек для этой карты и привязать это добро к какому-то железу – может быть вполне логичным выводом для добротного ресёрча, когда требуется сделать автономную карту полета для пассажиров в самолете. Плюс с точки зрения фронтенда (для не-«it-шников»: вот этого всего барахла которое у вас рисуется в браузере) входящие данные уже подготовлены и позволяют абстрагироваться от всякой ненужной ерунды, типа «GPS-навигатор мне какие-то единицы и нули шлёт непонятные! ЪУЪ!!!!1».
С другой стороны – нужно понимать, что раз эта тема автономная, то всё нужно красиво упаковать в цельную коробку, обеспечить доступное и понятное обслуживание, протестировать, связать это с разного рода железяками (GPS-навигатор + Wi-Fi адаптер + электропитание + альтиметр (откуда еще высота берется?)). Подозреваю, что когда дело касается авиации, то это делается не только долго, но еще и дорого. Одна большая компания разрабатывает решение, которое будут покупать другие большие компании. Тут будет замешано много бабла, много бумажной волокиты, много вообще всего. Trust me.
И еще одна немаловажная деталь. Это все еще очень дешево по сравнению с остальными вариантами. Достаточно прикинуть сколько будут стоить условные экраны/планшеты в подголовниках (а это еще и закупка других кресел) + система которая будет их оркестрировать vs. тупо один ящик, который можно кинуть под пол. Производитель вообще указывает что вес такой хреновины около 2кг. А ведь все вот эти moving-map systems, audio/video entertainment и прочее – по сравнению с рассмотренной системой такая же дремучая херня, как Nokia N95 по сравнению с iPhone 11.
Короче, всё и просто и сложно одновременно. Но прикольно. Теперь даже в самолёте не помрешь от скуки, имея в руках один лишь девайс. Того гляди, лет через 5-10 можно будет миновать все эти ваши задержки сигналов и по видеосвязи звонить в мессенджерах.
От и до в одиночку такие системы я пока пилить не умею. Писать заключения – тоже. Не скучайте в полётах. Stay tuned! ✈