Как получить данные с GPS на WinCE 6 автонавигаторе?

Уже голову сломал?

Что только не делал для чтения NMEA данных с GPS приемника автонавигатора. Не получается.

Навител весит на 7 порту. И естественно он занят для моей программы. Microsoft говорит, что начиная с 6-й версии WinCE поддерживается промежуточный драйвер gps — gpsapi.dll. Но в навигаторе нет такой библиотеки. Не работает!

Ладно. Но как считать данные с COM-порта, если он занят!? Ведь wolfcomahent это как-то делает. Правда когда он работает не работает Navitel. Ну бог с ним, поменяю у него порт потом. Как заставить мою программу на C# читать данные с этого 7-го порта при выключенном Navitel-е.

Пожалуйста, помогите. c# wince 6.0
  • 0
  • 14 августа 2012, 16:50
  • admin
  • 1

Определение доступности GPS в Android

Эта статья, надеюсь, станет хорошим подспорьем начинающим в области программирования под Android. А может даже и матерые профи что-нибудь почерпнут.

Итак, понадобилось мне как-то определять, доступен ли в настоящее время GPS-фикс. Казалось бы, LBS (location-based service) — вещь перспективная и популярная, и Google, прекрасно это понимая, предоставит простой в обращении инструмент для их разработки. Ага, разбежался… Не так-то все и просто, поэтому приходится в определенной мере изощряться.

Ну и в чем тут у нас собственно проблема? Проблема в определении текущего местоположения пользователя. Видов существует несколько, но ТЗ велит использовать GPS и позиционирование по сотовым вышкам. Задача — определить текущие координаты с максимальной точностью, т.е. в идеале по GPS. Если он недоступен, то по вышкам. Если есть сигнал GPS, то все легко и просто — берем со спутника координаты и делаем с ними что угодно. Если сигнала нет, то при обработке координат вы рискуете нарваться на null, в чем очень мало хорошего, а при недолжной обработке исключений может быть еще и что-нибудь с печальными последствиями. Значит, надо как-то определить, а есть ли у нас фикс?

Ну что ж, проблема видна — будем решать!

Начнем с ковыряния LocationManager. Есть в нем занятное свойство isProviderEnabled(), возвращающее булево значение. Ура? Рано… Это значение всего лишь характеризует, включен GPS-приемник вашего телефона или нет (собственно, можно было и по названию догадаться). Первый блин получился как всегда, идем дальше.

Залезем во внутренности LocationListener. Что мы видим? Ба, да это обработчик onStatusChanged()! В идеале реагирует на изменение статуса провайдера, выставляя соответствующие значения. В идеале… Не реагирует он ни на что начиная с андроида версии 2.1! С грустью проходим мимо.

Продолжим? Конечно продолжим! Очевидным выглядит следующий финт ушами — сравнение времени последнего пришедшего фикса с текущим системным временем. Казалось бы, логично — раз фикс старый, то GPS недоступен. Не совсем так: фиксы приходят только при движении, соответственно можно перепутать недоступность спутников с простым сидением на месте. Согласитесь, будет не совсем приятно, если вы сидите себе сидите, и тут вдруг — оппа! — и ваш телефон решил, что вы телепортнулись метров на 400-500. Снова не то, но приемчик запомним — пригодится.

Теперь посмотрим в сторону GpsStatus.Listener, реализующий метод onGpsStatusChanged(int event). Переменная event может принимать несколько значений, нас же интересует GPS_EVENT_SATELLITE_STATUS. Возникновение такого события говорит о том, что ваш приемник анализирует GPS-спутники. Вот это-то нам и надо! Дальше все просто и понятно — берем текущий статус GPS и вытаскиваем из него доступные спутники. В самом простом случае нас просто интересует их количество.

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

Итак, дальше все ну совсем замечательно — смотрим количество спутников, если их меньше четырех, то фикса никакого нет и быть не может, значит используем другие методы позиционирования (уж извините, но конкретную реализацию описывать не буду). Этот метод можно скрестить с сопоставлением времен, описанным на пару абзацев выше. Так можно выставить определенный период «доверия» фиксу

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

P.S. Ни в коем случае не претендую на авторство указанных методов, т.к. все найдено исключительно с помощью гугла. Целью статьи является сбор всей информации в одну кучу и кое-какое ее структурирование для того, чтобы следующие путешествующие в сказочный мир навигации и программирования мобильных устройств с маленьким зеленым существом не тратили время и нервы.
P.P.S. Очевидно, что метод далек от идеала, поэтому его совершенствование продолжается. Любая помощь и критика (объективная) только приветствуется!

Источник статьи

Работа с GPS на Android

Создадим новый проект Android в Eclipse. Дадим ему название, например: GPSTest, а активности — GPSTestAction.
Откроем GPSTestAction.java и добавим строчки:

( Читать дальше )

Работа с GPS на Windows Mobile

Была задача, написать приложение, которое с определенным интервалом времени получает координаты GPS приемника телефона и отправляет их в удаленную базу данных, а за тем выводит на Яндекс-карту. Долго искал каким способом это лучше осуществить и нашел его у себя на компьютере.

1. Открываем проект gps.sln (путь: c:\program files\windows mobile 6 sdk\samples\pocket pc\cs\gps);
2. Строим решение, получаем dll;
3. Подключаем полученую dll как ссылку к своему проекту;
4. Добавляем
using Microsoft.WindowsMobile.Samples.Location;


Объявляю глобальные переменные, что бы в них всегда хранились актуальные данные координат

double Latitude = 0;
        double Longitude = 0;


5. Инициализируем и включаем gps (я это делал в
Form.Load
):

updateDataHandler = new EventHandler(UpdateData);
                gps.DeviceStateChanged += new DeviceStateChangedEventHandler(gps_DeviceStateChanged);
                gps.LocationChanged += new LocationChangedEventHandler(gps_LocationChanged);
                if (!gps.Opened)
                {
                    gps.Open();
                }

6. Добавим функции:

void UpdateData(object sender, System.EventArgs args)
            {
                //получаем обновленные данные с GPS
                if (gps.Opened)
                {
                    if (device != null)
                    {
                        WriteLog(DateTime.Now.ToUniversalTime() + " Can not turn on your GPS device!");  
                    }

                    if (position != null)
                    {

                        if (position.LatitudeValid)
                        {
                            //выводим широту
                            Latitude = position.Latitude;
                        }

                        if (position.LongitudeValid)
                        {
                            //выводим долготу
                            Longitude = position.Longitude;
                        }
                    }
                }
            }

            void gps_DeviceStateChanged(object sender, DeviceStateChangedEventArgs args)
            {
                device = args.DeviceState;
                Invoke(updateDataHandler);
            }

            protected void gps_LocationChanged(object sender, LocationChangedEventArgs args)
            {
                position = args.Position;
                Invoke(updateDataHandler);

            }

Когда мне надо получить координаты я делаю так:

//работает ли GPS
                                    if (!position.LatitudeValid) 
                                    {
                                       //не работает
                                    }
else
{
 double lat = latitude;
 double lon = longitude;
}

Кординаты представленны как тип double, но можно представить как градусы, минуты и секунды для этого надо

position.Latitude
заменить на
position.LatitudeInDegreesMinutesSeconds;


Все отлично работает!