Эмулировать GPS или последовательное устройство - PullRequest
7 голосов
/ 02 ноября 2009

Можно ли получить данные о местоположении из Google Gears , Google Gelocation API или любого другого веб-интерфейса API (например, Fire Eagle ) в таких формат, который отображается в другом программном обеспечении как устройство GPS?

Мне пришло в голову прочитать эти ответы на мой вопрос, касающийся определения местоположения Wi-Fi на Super User, что, если бы я мог эмулировать GPS-модуль, многие из этих веб-служб могли бы действовать как «бедняги «GPS для менее полезного программного обеспечения, которое требует этого.

Является ли GPSD опцией?

Желательно OSX и Python, но мне будет интересна любая реализация.

Ответы [ 4 ]

4 голосов
/ 12 ноября 2009

В списке рассылки Python есть очень похожий поток , в котором упоминаются виртуальные COM-порты Windows и обсуждаются возможности псевдо-tty в Unix. Если приложения, которые вы хотите использовать, позволяют вводить определенный файл устройства tty, это может быть самый простой маршрут. (Если не попросить авторов предоставить API плагина для того, что вы пытаетесь сделать, или купить себе Bluetooth-мышь $ 20 .)

Вы используете OS X?

В коде Google есть проект macosxvirtualserialport , который предоставляет графическую оболочку для некоторых функций утилиты socat . Я бы посоветовал взглянуть на socat, если вы видите потенциал в псевдо-tty маршруте. Я полагаю, что вы могли бы использовать socat для связи канала из программы Python с псевдо-tty.

Большинство родных приложений Mac будут запрашивать IOServiceMatching для устройства с kIOSerialBSDRS232Type, и я сомневаюсь, что псевдо-tty будет отображаться как служба IOKit.

В этом случае, если вы не можете найти проект, в котором уже реализована такая вещь, вам потребуется реализовать драйвер, как описано в этом Как создать виртуальный COM-порт поток. Если вы собираетесь создать драйвер устройства, вы можете использовать IOKit из-за этого вероятного запроса IOServiceMatching. Вы можете найти проект Apple16X50Serial, упомянутый в этом посте, в верхней части списка открытых исходных кодов Apple (перейдите на главную страницу и выберите более старую версию ОС, если вы хотите нацелиться на что-то предварительно. -10,6).

Если ваше приложение наиболее полезно с данными в реальном времени (например, приложение RouteBuddy, упомянутое в ветке списка рассылки Python , может регистрировать текущие позиции ), тогда вам нужно будет получать обновления из ваших веб-источников (надеюсь, они поддерживают длинные (опрос) и преобразовать их в базовые NMEA RMC предложения. Вы не хотите делать это из своего кода драйвера. Вместо этого разделите вашу работу на части ядра и пользователя, которые могут взаимодействовать, и поместите как можно меньше кода в часть ядра.

Если вы хотите, чтобы приложения читали и записывали в эти веб-службы, лучше всего имитировать устройство Garmin. Garmin более или менее задокументировал свой протокол в файле IntfSpec.pdf, включенном в их Device Interface SDK . Опять же, вы хотели бы разбить как можно больше на код пользовательского пространства.

Мне не удалось найти проект или утилиту, которая реализует сторону ядра виртуального последовательного интерфейса на основе IOKit, но я был бы удивлен, если бы где-нибудь там не было ни одного сокрытия. К сожалению, большинство ответов, которые я нашел на этот вопрос, были такими: разработчик велел заняться написанием текста .

2 голосов
/ 05 ноября 2009

Я не совсем уверен, как выполнить то, что вы просите, но я могу дать некоторое представление о том, как вы могли бы начать , чтобы выполнить это. Итак, вот так:

Устройство GPS для большинства систем отображается как не более чем последовательное устройство - например, COM-порт, если вы работаете с Windows, / dev / ttySx, если вы используете * nix. По определению, особая обязанность последовательного порта - передавать данные по шине по одному блоку за раз. Таким образом, из этого логически следует, что если вы хотите эмулировать присутствие устройства GPS, вы должны собрать данные, которые вы потребляете, и поместить их в поток, который каким-то образом действует как активный последовательный порт.

Однако есть некоторые сложности, которые вы могли бы рассмотреть:

  • Большинство устройств GPS не просто отправляют данные о местоположении; есть также информация о местонахождении спутников, качестве фиксации, направлении и т. д. С другой стороны, никто не сделал никаких правил, согласно которым у вас есть , чтобы сделать все эти данные доступными. Вероятно, есть еще кое-что, но я признаю, что мне нужно больше исследовать в этой области.
  • Я не уверен, насколько быстро вы можете получать данные при работе с Google Локатором и т. Д., Но любые задержки при получении обязательно приведут к видимым паузам в потоке данных вашего "последовательного порта". Опять же, это может быть не таким сложным, как кажется, потому что известно, что устройства GPS в любом случае «пропускают» данные по шине, но я определенно буду следить за этим. Вы хотите убедиться, что всегда есть излишки данных, а не недостаток.

По пути вам также придется преобразовывать полученные координаты в действительные предложения GPS. Вы можете найти спецификации для них, но я бы определенно подружился со стандартом NMEA - несмотря на то, что это ошибочный стандарт, с ним, похоже, все согласны.

Надеюсь, это помогло вам, по крайней мере, немного. Есть ли какие-либо подробности, относящиеся к вашей проблеме, которые, по вашему мнению, могут быть полезны для ответа на этот вопрос?

1 голос
/ 12 ноября 2009

Посмотрите на Franson GPS Gate , который позволяет вам подключаться к Google Планета Земля, среди прочего (например, имитация GPS и т. Д.). Только для Windows, но я думаю, что вы могли бы получить некоторые полезные идеи из этого.

0 голосов
/ 11 ноября 2009

Я не особо разбирался в этом, но вы рассматривали вопрос об использовании SDK Skyhook ? Это может предоставить вам то, что вы ищете. Он доступен для всех основных настольных и мобильных ОС.

...