PCCar.ru - Ваш автомобильный компьютер

PCCar.ru - Ваш автомобильный компьютер (http://pccar.ru/index.php)
-   Bluestacks (http://pccar.ru/forumdisplay.php?f=132)
-   -   iCarDS + Bluestacks + Яндекс.Навигатор (http://pccar.ru/showthread.php?t=19528)

sirota 20.10.2015 17:14

Цитата:

Сообщение от Lexx09 (Сообщение 340930)
У меня нет ее.

Планируете продолжить изыскания в плане работы GPS в блюстаке без костылей?

Lexx09 21.10.2015 12:14

Цитата:

Сообщение от sirota (Сообщение 340932)
Планируете продолжить изыскания в плане работы GPS в блюстаке без костылей?

Не планирую, а продолжаю потрошить Bluestacks.:yes2:

В папке /data/downloads нашел приложение BlueStacksLocationProvider.apk. Это приложение запрашивает координаты у функции UpdateGpsCoordinates.

Приложение состоит из двух сервисов и одного класса.

Первый сервис "GpsServiceStartReceiver" - автозагружаемый, и после автозагрузки запускает второй сервис "GpsService". Т.к. в Bluestacks версий 0.9.х.х и выше время до срабатывания автозагрузки составляет секунд 30, то первый сервис запустится через это время, и только потом "пойдут" координаты.

Второй сервис "GpsService" просто запускает класс "QueryCoordinates", который в фоне циклически запрашивает координаты у функции UpdateGpsCoordinates и устанавливает их в качестве текущих. Но делает это как-то странно, а именно:
  • Каждые 20 сек посылается запрос к функции UpdateGpsCoordinates для получения координат.
  • Затем, в течение следующих 20 сек, эти полученные координаты устанавливаются в качестве текущих каждые 2 сек.
И так в бесконечном цикле. Это видно на 1-м и 2-м скриншотах (цифры после "Received result" - это координаты).

Еще нашел вот что - если в папке /data создать файл gps_debug_log, то в логах Android появятся записи приложения BlueStacksLocationProvider.apk. Примеры на первых 5-ти скриншотах:
  • 1-й и 2-й скриншоты - координаты берутся из реестра (GpsMode=1, GpsSource=8).
  • 3-й, 4-й и 5-й скриншоты - координаты берутся с датчика местоположения (GpsMode=1, GpsSource=2).
На 3-м скриншоте видно, что функция UpdateGpsCoordinates координаты не выдает, т.к. не соблюдаются условия.

Декомпилировал BlueStacksLocationProvider.apk и изменил так, чтобы координаты запрашивались и устанавливались каждую секунду. Но все равно осталась проблема, что координаты приложениями не определяются в реальном времени, а определяются только в момент запуска, и то после нескольких перезапусков.

Поковырявшись в BlueStacksLocationProvider.apk решил заменить провайдера "network" на "gps". Теперь заработало так, как надо. При изменении координат в реестре они, не более, чем через секунду, обновляются в эмуляторе, и приложения их сразу видят. Правда, в логах появилось ругательство "Provider gps unknown" (4-й скриншот).

В реестре координаты меняются при наличии датчика местоположения (при этом GpsSource становится равным 2). Но функция UpdateGpsCoordinates выдает координаты только, если GpsSource=8. Изменил HD-Frontend.exe таким образом, чтобы координаты из реестра выдавались при GpsSource=2. Получилась такая цепочка:
  1. Мой самописный эмулятор GPS передает координаты в GpsGate.
  2. GpsGate через виртуальный COM-порт выдает координаты виртуальному датчику местоположения GpsDirect.
  3. Bluestacks видит этот датчик и в реальном времени обновляет координаты в реестре.
  4. BlueStacksLocationProvider.apk каждую секунду запрашивает координаты у функции UpdateGpsCoordinates и устанавливает их в качестве текущих.
По такой схеме все заработало! :yes4: 5-й скриншот. Но в Яндекс.Навигаторе вместо дельтаплана - зеленый кружок с буквой Я, который перемещается рывками каждую секунду (6-й скриншот, маленький зеленый кружок - это откуда был рывок).

Для работы этой схемы мне пришлось:
1. Изменить HD-Agent.exe для работы с датчиком местоположения в Win7.
2. Изменить HD-Frontend.exe для выдачи координат из реестра при GpsSource=2.
3. Изменить BlueStacksLocationProvider.apk для увеличения скорости получения и установки координат; так же сменил провайдера с "network" на "gps".

Можно еще попробовать:
  • Увеличить скорость запроса координат до 10 раз в секунду. Но не думаю, что рывки пропадут.
  • Протестировать на реальном GPS-приемнике с датчиком местоположения (например, на VK-172).
Конечно, в идеале было бы неплохо добиться чтения координат в реальном времени из COM-порта или датчика местоположения без промежуточной записи в реестр и чтения оттуда, тем более, что так вроде изначально работает, но плохо...

PS: Долго мучался с тем, что мои изменения, внесенные в HD-Frontend.exe никак не отражались на работе, все работало по старому. В итого выяснил, что вместо моего правленного HD-Frontend.exe запускается скомпилированный (native image) из папки c:\windows\assembly\nativeimages_v2.0.50727_32\hd-frontend\17a65e6ccd86293d8908aa427c0f3d54\hd-frontend.ni.exe
Нашел это с помощью PETools при запущенном Bluestacks. Просто так этот файл и папку удалить нельзя. Пришлось загружаться с LiveCD и уже оттуда удалять.

http://s018.radikal.ru/i506/1510/a1/810a02901c43t.jpg http://s006.radikal.ru/i215/1510/af/9bbe52643999t.jpg http://i016.radikal.ru/1510/51/80ea6c55d89bt.jpg http://s017.radikal.ru/i403/1510/25/3d06cbea1b0ft.jpg http://s019.radikal.ru/i611/1510/c0/e7da61baf8c1t.jpg http://s005.radikal.ru/i212/1510/63/099d774a72bdt.jpg

sirota 21.10.2015 12:24

Даааа...потрошитель ты знатный :shok:

Lexx09 21.10.2015 12:48

Честно говоря, у себя никаких проблем не наблюдаю с традиционной связкой GpsGate+GPSBridge даже в гибридном спящем режиме, которым начал недавно пользоваться.

Если уснул с открытым навигатором в Bluestacks, то при просыпании все нормально продолжает работать после того, как модем автоматически подключится к сети. Из мелочей:
  • Спонтанное пропадание кнопки iCarDS, наложенной на Bluestacks. Это я поправлю своим скриптом. В цикле буду проверять - если кнопка не видна, то вытащу ее поверх окна Bluestacks.
  • Один раз iCarDS не смог подключиться к виртуальному COM-порту GpsGate.
Была, правда, одна железячная проблема... GPS и модем давным-давно были подключены к хабу D-Link DUB-H7, который питался от NSD15-12S5. И все это недавно как начало глючить со страшной силой - то интернет отвалится, то GPS, то все сразу и по сто раз за день. В диспетчере устройств вместо хаба - "Unknown device", обновление конфигурации не помогает, только перетыкание USB-кабеля. Надоело это, убрал хаб, а GPS и модем воткнул в системник. Теперь полет нормальный. :smile2:

Потрошу скорее из спортивного интереса.

Glouck 22.10.2015 06:59

Цитата:

Сообщение от Lexx09 (Сообщение 340997)
Не планирую, а продолжаю потрошить Bluestacks.:yes2:

Восхищаюсь... Большое и полезное дело ты затеял...

Цитата:

Но в Яндекс.Навигаторе вместо дельтаплана - зеленый кружок с буквой Я, который перемещается рывками каждую секунду (6-й скриншот, маленький зеленый кружок - это откуда был рывок).
Это, похоже, будет проблемой из-за того, что координаты берутся из реестра. Для нормальной работы навигаторов надо передавать и остальную информацию с приемника - скорость, азимут, время и т.п.

Я так понимаю, что заставить использовать BS режим GpsSource = 1 вообще не реально, т.к. это не реализовано в самом BS?

Lexx09 23.10.2015 15:30

Исправил BlueStacksLocationProvider.apk - увеличил скорость запроса координат до 10 раз в секунду. Как и предполагал, рывки не пропали, дельтаплан не появился.

Нашел, как сделать вывод еще одних логов работы с GPS:
  1. В реестре в разделе HKLM\SOFTWARE\BlueStacks\Guests\Android\Config создать строковый параметр GpsDebugLogs со значением yes.
  2. Создать папку C:\TEMP\BlueStacks, в ней появится файл gps.log.

vasekbfg 23.10.2015 17:03

Цитата:

Сообщение от Lexx09 (Сообщение 339289)
Возникла кое-какая идея причины такого некорректного поведения GPSBridge. Экспериментально проверил. Подтвердилась.

А предположил я то, что GPSBrdige конфликтует сам с собой, а именно - сервис при каждом запуске создает новый поток, который пытается получить данные с TCP-порта, а т.к. порт занят другим, ранее созданным, потоком, то возникает ошибка.

Накликал 10 раз по иконке GPSBridge и посмотрел логи (отфильтровано по ошибкам):
http://i65.fastpic.ru/big/2015/0930/...8695cdad68.png

В логах видно, что сообщения об ошибках от GPSBridge идут не раз в 10 сек, а массово.

Для 100% уверенности проверил количество потоков:
http://i71.fastpic.ru/big/2015/0930/...843ad7c32a.png

Их 10! И каждый пытается подключиться к TCP-порту. По правильному, поток должен быть один, и его можно остановить, запустить, перезапустить. Косяк разработчиков.

присоединюсь к трабле, похоже и у меня такая штука возникает , при потере координат только перезапуск помогает , наверное убиваются лишние потоки бриджа , уже есть какое-то решение этого косяка?

Lexx09 26.10.2015 15:48

Цитата:

Сообщение от sirota (Сообщение 326620)
:yes2:
Как сделать, что бы после старта блюстака( v 0.9.23...), работала экранная клавиатура.
Сейчас после старта работает физическая...захожу в настройки....выключаю физическую, теперь можно набирать пальцем на экранной...но после перезагрузки опять включена физическая :dntknw:

Отписался на 4pda.

Krysanov 26.10.2015 20:07

Цитата:

Сообщение от Lexx09 (Сообщение 341531)
Отписался на 4pda.

А мне вот это помогло
http://pccar.ru/showpost.php?p=331962&postcount=382

Lexx09 27.10.2015 00:42

Krysanov, при таком способе физическая клавиатура вообще насовсем отключается. А в моем способе ее можно включить в настройках. Хотя, и включать не обязательно... Физическая клавиатура продолжает работать даже, когда отображается экранная.


Часовой пояс GMT +4, время: 20:21.

Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot