Подробно о файле dbRoot.v5
Последнее изменение: 02/06/2020 13:36:32Общие сведения
dbRoot.v5 - это главный конфигурационный файл-контейнер, в которм определены такие вещи как перечень слоёв, перечень провайдеров (поставщиков контента для слоев и снимков), стили отображения слоёв, список возможных серверов (sky, mars и т.д), номер текущей версии БД и текущий ключ для дешифровки всех передаваемых данных.
На данный момент этот файл может передаваться в двух форматах (условно: первой и второй редакции), отличающихся по своей бинарной структуре, но несущих в итоге одинаковые данные:
- для клиентов 5.1 и младше (младшие версии клиентов) - первая редакция
- для клиентов 5.2 и старше (старшие версии клиентов) - вторая редакция
Причём, клиент 5.2.1.1329 (первый клиент из линейки 5.2) и более поздние поддерживают обе редакции файла (вторая редакция - дефолтная, а первая загружается только при недоступности файла второй редакции).
Данный файл запрашивается у сервера самым первым. При невозможности загрузить этот файл из интернета, клиент пытается загрузить его из кэша (файл первой редакции хранится в dbCache.dat, второй редакции - в dbroot_cache). В случае же, если клиенту не получится загрузить его и из кэша (к примеру, кэш пуст), то работа клиента будет прервана, и будет сообщено, что невозможно соединиться с сервером.
Загрузка данного файла производится каждый раз при запуске клиента (для серверов Небо, Марс и История - раз в сеанс, при переключении в данный режим).
Формат запроса
То, в каком виде клиентом будет сформирован запрос на этот файл зависит от языковых настроек Windows, собственных настроек GoogleEarth, а так же, для старших версий клиента и от версии и типа клиента. Пример типового запроса для режима просмотра Земля:
Запрос файла первой редакции: http://kh.google.com/dbRoot.v5?hl=ru-RU&gl=ru Запрос файла второй редакции: http://kh.google.com/dbRoot.v5?hl=ru-RU&gl=ru&output=proto&cv=5.2.1.1329&ct=free где, hl=ru-RU - язык пользователя gl=ru - расположение пользователя output=proto - формат контейнера cv=5.2.1.1329 - версия клиента ct=free - тип клиента (free/pro)
Описание параметров запросов
Параметр hl говорит серверу, на каком языке нужно отдать dbRoot.v5 (на каком языке будут слои/имена серверов в клиенте). Например, если hl=ru-Ru или просто, hl=ru - то слои будут на русском языке, а если hl=en-GB - то на английском. Данный параметр клиент устанавливает самостоятельно, в зависимости от того, какой выбран язык в настройках программы (см. скрин). Если в настройках GE будет указан язык System default (как это сделано по-умолчению), то язык будет взят из настроек windows, т.е. будет использован тот же язык, что и в windows. Второй параметр gl, говорит серверу о месторасположении пользователя: gl=ru - Россия, gl=US - США и т.д. И в соответствии с этим параметром, глобус, при старте программы, поворачивается именно тем боком, где родина пользователя. Значение берётся из языковых настроек windows: Пуск -> Панель управления -> Язык и региональные стандарты Поврот глобуса происходит следующим образом: клиент GE определяет месторасположение пользователя, как это показано выше, а затем, загружает kml файл соответствующий этому расположению, который, собственно, и устанавливает камеру в соответствии с параметрами метки, пропасанной в kml. Соответствующие kml файлы находятся в папке res, которая расположена в папке с программой. Для gl=ru соответствует kml файл: \res\ru.country\startinglocation.kml. При желании, содержимое этого файла можно отредактировать, и заставить GE ворочать глобус нужным вам боком, и главное - с нужной высотой камеры.
Параметры cv и ct сообщают серверу о версии и типе клиента. На данный момент всегда отдаётся одинаковый dbRoot.v5, но в будущем, возможно, наполнение этого файла так же будет отличаться для различных версий клиента. Это связано с тем, что на данный момент в файле описаны слои для всех типов клиентов, а уже в описании каждого слоя сделана пометка для какого именно клиента предназначен данный слой. Т.о. с целью оптимизации, в будущем, в файл могут быть включены только те слои, что предназначены/поддерживаются данным клиентом. Всё что касается слоёв, так же справедливо и для всех остальных данных, что передаются в данном файле.
Параметр output - формат контейнера. Если этот параметр присутствует и указано значение proto, то возвращается контейнер второй редакции, иначе - первой. А теперь подробнее, о том, что же это за контейнеры.
Формат контейнера dbRoot.v5 первой редакции
Формат первой редакции представляет собой ни что иное, как Си-структуру, со следующими полями:
- type
- TXmldbRoot = record
- Magic : LongWord; // Всегда равно: 0x9464874E
- UnkField : Word; // Всегда равно: 0x66
- Version : Word; // Версия БД
- Key : array [0..1015] of Byte; // Ключ для дешифровки данных (1016 байт)
- Xml : array of Byte; // Зашифрованные xml-данные
- end;
Версия БД
Версия текущей БД хранится в 7 и 8-м байтах dbRoot.v5. Версия лежит в скрытом виде, открывается она следующим образом:
- V = TXmldbRoot.Version xor $4200;
Ключ
Ключ для дешифровки данных начинается с 9-го байта и имеет длину 1016 байт. Для использования в алгоритме дешифровки он должен быть дополнен 8-мью нулями (спереди) до 1024 байт.
Xml-данные
Xml данные - всё остальное после 1024-го байта и до конца файла. Эти данные, как и всё в GoogleEarth, зашифрованы и упакованы в zlib архив.
Формат контейнера dbRoot.v5 второй редакции
Формат второй редакции это Google Protocol Buffer - специальный формат, оптимизированный для передачи бинарных данных по сети. Структуру данных в этом формате принято описывать в .proto файлах c Си-подобным синтаксисом:
- package dbroot;
- message MainContainer {
- required int32 field_01 = 1; // Всегда равно 0
- required bytes key = 2; // Ключ для дешифровки данных (1016 байт)
- required bytes data = 3; // Зашифрованные данные
- }
То, что в dbRoot.v5 первой редакции было xml данными, во второй редакции превратилось в ещё один proto-файл (он также зашифрован и запакован в zlib), редактирование и просмотр которого уже становится намного сложнее. По структуре формата контейнера видно, что здесь так же присутствует одно неизвестное поле (field_01 - версия контейнера?), а вот версия БД уже спрятана на уровень глубже.
Для того, чтобы добраться до основных данных, которые передаются клиенту, была написана специальная утилита - MasterRoot. Эта утилита может как разобрать dbRoot.v5 на составные части, так и собрать из этих частей новый dbRoot.v5 (с исправлениями и дополнениями), который можно смело подать на вход GoogleEarth.
К примеру, правкой dbRoot.v5 можно отключить копирайты, подписываемые гуглом внизу окна: Можно, так же, удалить избранные или даже все слои, а на их место включить свои и получить эксклюзивный dbRoot.v5. Так же возможно запретить какой-нибудь из режимов (Небо, Марс, История), и проч. В общем, для интересующихся - широкое поле для деятельности.
Обновления dbRoot.v5
В заключение, несколько слов об обновлении файла dbRoot.v5. Так вот, хотя гугл и запрашивает каждый раз при старте этот файл, обновляется он гораздо реже, и по сути, в большинстве случаев происходит перезакачка уже имеющихся данных, с соответствующей потерей трафика. Этого можно избежать. Во-первых, обновление dbRoot.v5 можно контролировать вручную, а во-вторых, даже при обновлении dbRoot.v5 на сервере, можно вручную устанавливать версию имеющегося dbRoot-а на нужную. Таким образом можно всегда пользоваться единожды загруженным dbRoot (конечно, до тех пор, пока гугловцы не изменят что-либо кардинально в слоях - в этом случае слои со старого dbRoot.v5 перестанут отображаться, и придётся таки загрузить обновлённый dbRoot.v5).
Ручное слежение за обновлением dbRoot.v5 заключается в периодическом чтении заголовков по url, с которого гугл загружает dbRoot.v5. К примеру, на данный момент заголовок (HEAD) по url http://kh.google.com/dbRoot.v5?hl=ru-RU&gl=ru такой:
HTTP/1.1 200 OK Last-Modified: Wed, 24 Jun 2009 19:08:07 GMT Date: Mon, 08 Jul 2009 16:41:34 GMT Pragma: no-cache Expires: Fri, 01 Jan 1990 00:00:00 GMT Cache-Control: no-cache, must-revalidate Content-Type: application/octet-stream Server: btfe Content-Length: 57090
Нас интересует строчка Last-Modified, в которой сервер нам любезно сообщает, что последнее изменения файла dbRoot.v5 было 24 июня 2009 в 19:08:07 GMT (по Гринвичу). К сожалению, заголовки с полями Last-Modified сервер возвращает не для всех режимов.
Чтобы как-то упростить и автоматизировать процесс чтения заголовков с сервера гугла, была написана утилита - GEUpdater, которая при запуске автоматически проверяет обновления на всех серверах, и выдаёт такое сообщение: GEUpdater Прямые ссылки на dbRoot.v5 первой редакции (доступны для загрузки из браузера):
Земля (rus): http://kh.google.com/dbRoot.v5?hl=ru-RU&gl=ru
Земля (eng): http://kh.google.com/dbRoot.v5?hl=en-GB&gl=US
История (rus): http://khmdb.google.com/dbRoot.v5?db=tm&hl=ru-RU&gl=ru
История (eng): http://khmdb.google.com/dbRoot.v5?db=tm&hl=en-GB&gl=US
Небо (rus): http://khmdb.google.com/dbRoot.v5?db=sky&hl=ru-RU&gl=ru
Небо (eng): http://khmdb.google.com/dbRoot.v5?db=sky&hl=en-GB&gl=US
Марс (rus): http://khmdb.google.com/dbRoot.v5?db=mars&hl=ru-RU&gl=ru
Марс (eng): http://khmdb.google.com/dbRoot.v5?db=mars&hl=en-GB&gl=US
Луна (rus): http://khmdb.google.com/dbRoot.v5?db=moon&hl=ru-RU&gl=ru
Луна (eng): http://khmdb.google.com/dbRoot.v5?db=moon&hl=en-GB&gl=US