Привет!
Ты наверное сейчас занят решением проблемы взлома очередного мега-супер-гипер сервака, но знаешь ли ты, что такое GPS и как с ним обращаться?! Если нет, то тебе сюда! В этой статье я расскажу тебе о том, как работают GPS приемники, как получить с них информацию, а так же как самому написать простенькую программу для работы с GPS-модулем.
GPS (Global Positioning System, Система Глобального Позиционирования) была введена в действие США в 1994 году. Состоит она из 24 спутников и наземных приемных комплексов, коим может являться и твой GPS-навигатор или GPS-модуль (в дальнейшем навигатор). Для точного определения координат твой навигатор должен видеть минимум 4 спутника. В недалеком прошлом точность определения координат вне территории США (а точнее для потребителей не из США) была искусственно снижена, но не так давно это ограничение было убрано и теперь ты можешь определять свое местоположение даже в тайге с точностью до нескольких метров.
На пальцах все это работает так: твой навигатор получает информацию с каждого из видимых спутников, которые являются для него как бы маяками. Внутри навигатора находится микропроцессор с зашитой в него программой, которая на основе полученных данных и высчитывает твое местоположение.
В настоящее время в продаже имеется огромное количество GPS-навигаторов и GPS-модулей для КПК и ноутбуков. GPS-навигатор это GPS-приемник с экраном, на котором отображается информация о твоем местоположении, а GPS-модуль – это GPS-приемник, который подключается к компьютеру и передает всю навигационную информацию программе, которая с ним работает. Все они в принципе отличаются только форм-фактором и принципиальных различий в работе не имеют. Но нас с тобой больше интересует каким же все таки образом он общается с компьютером и как вытащить из него информацию. Сейчас все расскажу и покажу.
Какого бы форм-фактора (COM, USB, BlueTooth и т.п.) не был GPS-модуль, он будет логически связан с компьютером через COM-порт, т.е. при подключении создается соединение по последовательному порту. Навигационная информация в большинстве случаев передается по протоколу NMEA. Это самый распространенный протокол передачи для GPS-модулей. Хотя есть и другие протоколы, но мы их рассматривать не будем.
Ну а теперь самое время узнать как же сделать софтину для работы со всем этим хозяйством. Скажу сразу, что мне не очень хочется сейчас объяснять как тыкать в кнопки в том же
VB, статья носит больше ознакомительный характер. Для тех кто в танке я объясню подобно процесс создания программы в следующих статьях.
Я освещу лишь наиболее важные моменты и я думаю у тебя все получится. Скажу сразу, что ваять прогу можно в любых языках программирования, лишь бы была возможность работы с последовательным портом и со строками.
Первое с чего нужно начать это с открытия COM-порта. Почти все приемники по умолчанию имеют установки: скорость 9600 бит/с, 8/N/1. Как только ты откроешь порт тебе сразу с интервалом в секунду будет приходить навигационная информация примерно такого вида:
$GPGGA,143345.264, 0936.23,N,06354.15,E, 0,06,0.0,230.6,M,0.0,M,0.0,0345*76
$GPRMC,143345.26, A,0936.23,N,06354.15, E,0.0,0.0,230306,0.0,E,A*45
$GPGSA,A,3,03, 04,05,07,11,12,0.0,0.0,0.0*Е2
$GPGSV,1,1,06,05,67,120,20*34
Теперь приступим к разбору:
Данные передаются в виде предложений. Формат предложений следующий:
$AAAAA[, <данные> ]*hh<CR><LF>, где
$ - символ начала предложения (код 24h);
AAAAA - пятисимвольный адрес (имя) предложения;
[, <данные> ] - список полей данных разделенных запятыми (код 2Сh);
* - признак контрольной суммы (код 2Ah);
hh - контрольная сумма;
<CR><LF>, - конечный ограничитель (коды 0Dh и 0Ah).
Типы полей данных.
Тип поля | Обозначение | Определение |
Специальный формат полей |
||
Статус | A | Поле одного символа. А= да, данные достоверны, предупредительного сигнала нет. V= нет, данные не достоверны, есть сигнал предупреждения. |
Широта | llll.ll | Поле постоянной/переменной длины: градусы-минуты доли минуты. 2 знака градусов, 2 знака минут и переменное число знаков долей минуты. Если первый знак градусов или минут отсутствует, то его заменяют нулем с тем, чтобы сохранить постоянное число знаков. Децимальная точка и последующие знаки долей минут являются дополнительными и могут не использоваться, если не нужно большое разрешение. |
Долгота | yyyyy.yy | Поле постоянной/переменной длины: градусы-минуты и доли минуты. 3 знака градусов, 2 знака минут и переменное число знаков долей минуты. Если первые знаки или первый знак минут отсутствует, то их заменяют нулем для того, чтобы сохранить постоянное число знаков. Децимальная точка и последующие знаки долей минут являются дополнительными и могут не использоваться, если не нужно большое разрешение. |
Время | hhmmss.ss | Поле постоянной/переменной длины: часы/минуты/секунды и доли секунды. 2 знака часов, 2 знака минут, 2 знака секунд и переменное число знаков долей секунд. В качестве первого знака часов, минут, секунд может быть поставлен ноль, для сохранения постоянного числа знаков. Если не требуется высокая точность, то децимальная точка и доли секунд могут быть опущены. |
Определенные поля | Некоторые поля специально предназначаются для размещения заранее определенных постоянных величин, чаще всего буквенных обозначений. Признаком таких полей является наличие одного или нескольких знаков. |
Поля цифровых величин
Переменное число | x.x | Цифровое поле постоянной или переменной длины для целых и дробных чисел. Первый и последний знаки могут быть заменены нулями. Децимальная точка и дробная часть являются дополнением и могут быть опущены, если не требуется высокое разрешение. |
Шестнадцатеричное постоянной длины | hh | Только шестнадцатеричное число постоянной длины, старший значащий бит слева. |
Информационные поля
Изменяемый текст | c—c | Поле знаков изменяемой длины. |
Постоянное буквенное поле | aa | Поле постоянной длины, включающее в себя большие или малые буквенные знаки. |
Постоянное цифровое поле | xx | Поле постоянной длины, включающее в себя цифровые знаки. |
Постоянное текстовое поле | cc | Поле знаков постоянной длины.ъ |
Примечания:
1. Пробелы могут быть использованы только в полях текстов изменяемой длины.
2. Отрицательный знак “-” (код 2Dh) является первым знаком поля, если в нем приводятся отрицательные величины. При использовании отрицательного знака в полях фиксированной длины их длина увеличивается на единицу. При положительных величинах знак опускается.
GGA – Данные определения места по GPS
Время место и данные относящиеся к обсервации.
$GPGGA,hhmmss.sss,llll.ll,a,yyyyy.yy,a,x,xx,x.x,x.x,M,x.x,M,x.x,xxxx*hh<CR><LF>
Полями данного предложения являются:
1. hhmmss.sss – время навигационных определений;
2. llll.ll,a – широта, N/S;
3. yyyyy.yy,a – долгота, E/W;
4. x – показатель качества обсервации: 0 = нет данных, 1 = обсервация получена, 2 = обсервация в дифференциальном режиме;
5. xx – число используемых спутников;
6. x.x – величина горизонтального геометрического фактора (HDOP);
7. x.x,M – высота антенны над уровнем моря (геоидом), м;
8. x.x,M – превышение геоида над эллипсоидом WGS84, м;
9. x.x – устаревание дифференциальных поправок, то есть время в секундах с момента получения последней дифференциальной поправки, нулевое поле используется в случае выключения дифференциального режима;
10. xxxx – идентификатор дифференциальной станции 0ё1023.
RMC – Рекомендуемый минимальный набор данных по GPS и ГЛОНАСС
Время, дата, координаты и курс счисляемые аппаратурой.
$GPRMC,hhmmss.ss,A,llll.ll,a,yyyyy.yy,a,x.x,x.x,xxxxxx,x.x,a,a*hh<CR><LF>
Полями данного предложения являются:
1. hhmmss.ss – время;
2. A – статус (A/V);
3. llll.ll,a – широта, N/S;
4. yyyyy.yy,a – долгота, E/W;
5. x.x – скорость в узлах;
6. x.x – курс в градусах;
7. xxxxxx – дата: dd/mm/yy (день/месяц/год);
8. x.x,a – магнитное склонение в градусах, E/W;
9. a – индикатор режима: A = автономная обсервация, D = дифференциальный режим, N = данные недостоверны.
GSA – Фактор ухудшения точности, используемые для навигации спутники
$GPGSA,a,x,xx, ... ,xx,x.x,x.x,x.x*hh<CR><LF>
Полями данного предложения являются:
1. a – режим управления количеством определяемых координат: М = ручное, указан режим, А = автоматическое переключение;
2. x – режим работы: 1 = обсервация невозможна, 2 = определяются две координаты, 3 = определяются три координаты;
3. xx...xx – номера спутников используемых для решения навигационной задачи, количество полей равно количеству каналов приемника, для GPS используются номера 1ё32, для WAAS 33ё64, для ГЛОНАСС 65ё96;
4. x.x – общий геометрический фактор ухудшения точности (PDOP);
5. x.x – горизонтальный геометрический фактор ухудшения точности (HDOP);
x.x – вертикальный геометрический фактор ухудшения точности (VDOP).
GSV – Видимые спутники
Число спутников в зоне радиовидимости, номер спутника, угол возвышения, азимут и отношение сигнал/шум. Одно предложение может содержать информацию об 1 до 4 спутников, дополнительные данные о спутниках передаются в следующих предложениях. Номер предложения указывается в первых двух полях данных. Для спутниковых систем зарезервированы следующие номера: для GPS 1-32, для WAAS 33-64, для ГЛОНАСС 65-96.
$GPGSV,x,x,xx,xx,xx,xxx,xx, ... ,xx,xx,xxx,xx*hh<CR><LF>
Полями данного предложения являются:
1. x – общее число сообщений;
2. x – номер сообщения;
3. xx – общее число спутников в зоне радиовидимости;
4. xx – номер спутника;
5. xx – угол возвышения спутника, градусы 00-90;
6. xxx – азимут истинный, градусы 000-360;
7. xx – отношение сигнал/шум 00-99 дБ, если спутник не сопровождается не передается.
Примечание: поля 4, 5, 7 повторяются для 2, 3 и 4 спутников.
Ну вот теперь, имея описание протокола NMEA и драйвер прямые_руки.sys можешь приступать к построчному разбору пакетов и созданию мега программулины )))).