Немного поковырялся во внутренностях Bluestacks по поводу GPS...
Для начала посмотрел реестр. В ветке HKLM\SOFTWARE\BlueStacks\Guests\Android\Config есть такие параметры:
- GpsComPort
- GpsLatitude
- GpsLongitude
- GpsMode
- GpsSource
Поискал эти слова в файлах BlueStacks, нашел в нескольких.
Начал с HD-Agent.exe. Нашел в нем форму GpsSettings, которая, вероятно, служит для настройки работы с GPS. В этом же файле есть функция, которая, если GpsMode<>1, добавляет меню показа этой формы в контекстное меню иконки агента в трее. Но эта функция ниоткуда не вызывается. Правкой HD-Agent.exe не удалось отобразить этот пункт меню.
Далее в HD-Agent.exe нашел возможные значения параметра GpsSource:
- 1 - GPS_SOURCE_HW_DEVICE (Hardware device) - координаты берутся из COM-порта, указанного в параметре GpsComPort (порт указывается не просто цифрой, а полностью - "COM1", "COM2" и т.д.)
- 2 - GPS_SOURCE_WIFI (Wifi triangulation)
- 4 - GPS_SOURCE_IP (IP based GeoLocation)
- 8 - GPS_SOURCE_USER (User specified location) - координаты берутся из реестра (параметры GpsLatitude и GpsLongitude)
Потом разбирался с HD-Frontend.exe. Нашел в нем функцию UpdateGpsCoordinates. Сюда по логам, она вызывается каждые 20 сек. В логах такие есть записи:
Код:
NFO Inside UpdateGpsCoordinates
HTTPHandler: POST request from 127.0.0.1:7055
INFO Stopping Gps Service, gpsMode = 1, gpsSource = 0, IsWindows7AndBelow() = True
Эта функция в двух случаях берет координаты из реестра и куда-то отправляет:
- Если GpsMode=1 и GpsSource=8
- Если GpsMode=1 и GpsSource<>8 и Windows версии 8 и выше
Проверил работу с COM-портом. Прописал GpsMode=1, GpsSource=1, GpsComPort=COM2 (виртуальный порт в GpsGate). Выяснил, что обращение к COM-порту происходит только один раз и только в момент запуска приложения, требующего GPS. При этом в GpsGate мелькнет надпись "1 client connected". Во время дальнейшей работы приложения обращений к COM-порту нет. Причем, с первого раза координаты все равно не определяются. Нужно приложение пару раз перезапустить, тогда координаты определятся.
Проверил работу с получением координат из реестра. Прописал GpsMode=1, GpsSource=8, GpsLatitude и GpsLongitude - какие-то координаты. Координаты определяются, но так же, как и в предыдущем случае - приложение нужно пару раз перезапустить, тогда оно увидит правильные координаты (прописанные в реестре).
Далее решил разобраться с датчиком местоположения (на основе VK-172). В логах нашел такие строки:
Код:
INFO Need Windows 8 or Higher for GpsLocator to work.
Т.е., данные с датчика местоположения берутся только в Win8 и выше. Странное ограничение, ведь в Win7 тоже есть датчики местоположения. Решил исправить это недоразумение и пропатчил HD-Agent.exe. В логах появились такие записи:
Код:
HD-GpsLocator INFO LocationChanged
HD-GpsLocator INFO the registry path returned is Software\BlueStacks\Guests\Android\Config
HD-GpsLocator INFO the registry path returned is Software\BlueStacks\Guests\Android\Config
HD-GpsLocator INFO Latitude: 45.014058
HD-GpsLocator INFO Longitude: 39.050568
Судя по логам, координаты берутся с датчика практически в реальном времени. Встречается 9 таких записей за секунду. При этом также обновляются координаты в реестре. Но приложения, запущенные в Bluestacks, координаты в реальном времени не видят.
С помощью
GpsDirect можно эмулировать датчик местоположения, получая данные с какого-либо COM-порта. Bluestacks с таким датчиком работать будет.
Для работы с датчиком местоположения, в момент запуска Bluestacks GpsSource не должен быть равен 8. После запуска Bluestacks и подключения к датчику местоположения GpsSource становится равным 2.
В общем, возможность для работы с GPS в реальном времени есть, но не реализована полностью. Возможно, причина в той части Bluestacks, которая эмулирует Android, т.к. в Windows-части координаты считываются и отсылаются.