In-flight развлекухи 🚀

👁 146

In-flight развлекухи

Aloha! Cześć! Прывітанне!

Докладываю обстановочку: не так давно у меня был полет из Петербурга в Прибайкалье с пересадкой в Домодедово. До боли известные многим слова «Дамы и господа, приветствуем вас на борту Зеленые Огурцы Airlines» внезапно пополнились фразой 

«специально для вас на самолете предусмотрена развлекательная система»

Ого-го! Стало интересно. Так интересно, что вылилось в отдельный пост.

Но сперва немножко откатимся в прошлое. 

Вообще, первое «развлечение» на борту самолета в виде показа кинофильма было осуществлено аж в 1921 году в США, во время выставки «Pageant of Progress». Фильм, правда, был немой. Нет, ну а что вы хотели от технологий столетней давности?)0)0)0)))

Пассажиры смотрят фильм "Howdy Chicago!" во время полёта на Aeromarine 75 "Santa Maria" компании Aeromarine Airways. Фото: журнал Motion Picture News, 27 августа 1921 года
Пассажиры смотрят фильм «Howdy Chicago!» во время полёта на Aeromarine 75 «Santa Maria» компании Aeromarine Airways. Фото: журнал Motion Picture News, 27 августа 1921 года

Со временем авиакомпании вошли во вкус, и так, например, в 1930х годах на телевизоре в салоне можно было наблюдать экспериментальные телевизионные передачи. Был даже такой прикол: оператор с земли снимал взлет самолета, а пассажиры видели это в салоне на экране. Зумеры, залипающие в стримы на twitch, конечно не поймут, но по тем временам это был хайтек. Такую штуку провернули United Airlines в конце 1939 года.

А это уже 1968 год. Слыш, развлекайся! http://images.flysas.com

В итоге к концу 1980х — началу 1990х авиапромышленность пришла к тому, что в подголовниках впереди стоящих кресел можно было наблюдать дисплеи, на которых можно было смотреть кинцо, и к которым подключались наушники. Плюс, на части лайнеров, бороздящих небесные просторы, можно до сих пор легко заметить разного рода занятные артефакты – типа всяких разных пультов и разъемов для наушников в подлокотниках.

Те самые мониторы в подголовниках. Типа «высокие технологии».

Понятно, что к 2020 году люди поголовно имеют здоровенные смартфоны, планшеты, лаптопы и еще бог знает что. Поэтому экраны в спинках кресел стали неактуальны, а вот Wi-Fi адаптеры и веб-интерфейсы – вполне. Кстати, про то, как работает доступ в интернет по Wi-Fi в самолете можно почитать у Вастрика.

В итоге, подключившись к Wi-Fi, меня перенаправило на симпатичный локальный портальчик, где можно найти музыку, книжки, кинцо. Ассортимента хватит на долгий полет, но это было неинтересно – господи, да кто из нас не делал сайты и порталы? Механика там довольно понятна. (Мы же все в душе Web Developer’ы) Мы же все видели как устроены самые обычные сайты с картинками, видосиками и прочим.

Куда интереснее выглядела кнопка «Карта полета»

На карте полета есть специальное окошко, где отображается не только время в аэропортах вылета и прибытия, но и скорость, высота, расстояние до пункта назначения.

Выглядит интересно. Согласитесь, вряд ли эти данные будут передаваться откуда-то с земли, учитывая что большая часть России – тупо лес. Сейчас бы в глухом лесу ставить вышку чтоб в самолет данные о самолете и слать, лол. Остается вариант с тем, что эта система автономна. Вопрос насколько?

Попробуем разобраться с двумя следующими вопросами:

  • Как отображаются карты и откуда они берутся?
  • Как получаются координаты, по которым рисуется самолетик?

Штурман, дай карту! 🗺

Чем удобен веб-интерфейс? Тем, что вооружившись консолью разработчика в браузере можно что-нибудь подсмотреть. Откроем веб-инспектор и посмотрим, что там у нас пришло:

Full House, так сказать. Тут у нас и json’ы, и картинки, на любой вкус, размер и цвет.

Если посмотреть на картинки, которые летят нам от сервера, то можно обнаружить, что они одного размера – 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 не нужен 🙂 Значит, у нас еще хранятся данные от предыдущего рейса. Приколясы!

UPD: Откуда данные о местоположении попадают в коробку?
Подсказал человек, который работает с авиатехникой. Спасибо, Андрей! Далее цитата:

«Данные в коробочку поступают от ответчика (SSR) — он же всю инфу скидывает на Землю (диспетчерам, флайтрадару итд) через геостационарный спутник связи. Сам SSR получает данные от бортовых датчиков (GPS, ГЛОНАСС в основном — это уже навигационные спутники)»

Естественно, в прилетающих данных кроме того встречались параметризованные переменные для всего: язык и локализация, лого, цвет линий, словом всё, что можно было кастомизировать тому, кто будет это использовать.

Кто производитель этого добра? Кто эксплуатант?

Исходя из комментариев в самом начале исходников, выходит так, что разработчиком этого является технологическое подразделение Lufthansa. Глянув их крайне несодержательный блог, можно сделать вывод, что систему покупают различные авиакомпании по всему миру. Ну, а почему бы и нет, исполнение действительно добротное. Моё увожение.

По итогу.

Что-то интересное удалось достать. Даже что-то удалось подсмотреть. Но… на самом деле это все было довольно очевидно.

С одной стороны оказывается, что многие вещи устроены довольно просто. Ну, то есть распилить карту по кусочкам и слоям, наметить кучу точек для этой карты и привязать это добро к какому-то железу – может быть вполне логичным выводом для добротного ресёрча, когда требуется сделать автономную карту полета для пассажиров в самолете. Плюс с точки зрения фронтенда (для не-«it-шников»: вот этого всего барахла которое у вас рисуется в браузере) входящие данные уже подготовлены и позволяют абстрагироваться от всякой ненужной ерунды, типа «GPS-навигатор мне какие-то единицы и нули шлёт непонятные! ЪУЪ!!!!1». 

С другой стороны – нужно понимать, что раз эта тема автономная, то всё нужно красиво упаковать в цельную коробку, обеспечить доступное и понятное обслуживание, протестировать, связать это с разного рода железяками (GPS-навигатор + Wi-Fi адаптер + электропитание + альтиметр (откуда еще высота берется?)). Подозреваю, что когда дело касается авиации, то это делается не только долго, но еще и дорого. Одна большая компания разрабатывает решение, которое будут покупать другие большие компании. Тут будет замешано много бабла, много бумажной волокиты, много вообще всего. Trust me.

И еще одна немаловажная деталь. Это все еще очень дешево по сравнению с остальными вариантами. Достаточно прикинуть сколько будут стоить условные экраны/планшеты в подголовниках (а это еще и закупка других кресел) + система которая будет их оркестрировать vs. тупо один ящик, который можно кинуть под пол. Производитель вообще указывает что вес такой хреновины около 2кг. А ведь все вот эти moving-map systems, audio/video entertainment и прочее – по сравнению с рассмотренной системой такая же дремучая херня, как Nokia N95 по сравнению с iPhone 11.

Короче, всё и просто и сложно одновременно. Но прикольно. Теперь даже в самолёте не помрешь от скуки, имея в руках один лишь девайс. Того гляди, лет через 5-10 можно будет миновать все эти ваши задержки сигналов и по видеосвязи звонить в мессенджерах.

От и до в одиночку такие системы я пока пилить не умею. Писать заключения – тоже. Не скучайте в полётах. Stay tuned! ✈