GPS мониторинг авто или домашнее задание на вечер

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

Все же мысли о сохранении информации о положении авто у меня крутились в голове, да и хотелось просто найти интересное занять на досуг. НА этих мыслях я решился на покупку т. н. персонального GPS — трекера. Особо к моделям не присматривался, у все примерно одно и тоже, но очень важной особенностью такой как настройка на собственный сервер обладали не многие из перебранных кандидатов. В итоге мой выбор пал на персональный GPS трекер китайской компании Xexun — Xexun TK102-2. После еще нескольких часов выискивания как все настраивается и кучи различных мануалов я решил, что нужно уже купить и посмотреть что это такое. Кому интересна информация о трекере и о написании собственного «сервера» для трекера, прошу подкат.


На формах разных компаний, предоставляющие услуги GPS мониторинга, писали и предупреждали что гуляет куча подделок и что есть вероятность нарваться на них, что якобы внешне не отличить и т. д., если вы не приоритете товар у них, но я пошел проверенным путем и заказал приблуду на ebay, пришлось правда подождать 4 недели, ну да ладно — пришел.

Кратко о трекере:
Стандарт связи: GSM 850, GSM 900, GSM 1800, GSM 1900
GPS-чипсет: SiRF Star III
Спутниковая система навигации: GPS
Технические характеристики:
Чувствительность отслеживания: -159 dBm
«Горячий» старт 2 секунды
«Холодный» старт 35 секунд
Точность 5 метров
Рабочая температура от -10 до +65 С°

Функции
Удаленное управление SMS
Контроль скорости, начала передвижения
Сигнал «низкий уровень заряда»

Габариты и вес
Длина 64 мм
Ширина 46 мм
Толщина 17 мм
Вес 50 г

Память
Поддержка карт памяти SD
Передача данных GPRS

Горячие клавиши и индикация
Тревожная кнопка: отправка текущих координат, отправка сигнала SOS через SMS
Индикация: зеленый светодиод

Аккумулятор
Тип аккумулятора Li-ion
Емкость аккумулятора 860 мАч
Время работы в обычном режиме до 12 часов
Время работы в режиме ожидания до 80 часов

Пришел девайс в такой коробочке, которая, кстати говоря, была довольно не плохо сделана.



Само же устройство выполнено из приятного на ощупь прорезиненного пластика.



Вид изнутри с уже установленной симкой.


В комплекте так же лежало зарядное для сменного аккумулятора и для самого трекера.


Очень жаль, что в коробке небыло никакого ПО для проверки работоспособности трекера, но благо есть сервисы которые позволяют относительно просто для простого (извиняюсь за тавтологию) человека зарегистрировать и себя и девайс и посмотреть как это все работает, но это не для меня об этом я писал в начале топика.

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

Первым делом я опробовал опросить трекер по смс — получил координаты и мигом проверил в картах — отлично, следующий этап это настройка на свой сервер, но т. к. у меня сервера своего нет, а есть белый IP я недолго думая написал консольное приложение на C# и решил посмотреть, что там приходит с трекера, а с трекера приходила следующая строка:
«130402213013,+79637**3***,GPRMC,173013.000,A,6146.4979,N,03421.2399,E,1.92,21.48,020413,,,A*5B,F,, imei:*************,00,-16.4,F:3.73V,0,139,49646,250,99,1478,68A7\n\r»

Звездочки в полях с номером телефона (2) и в поле imei я написал специально.
Собственно описание этой строки было и в самой инструкции, но не всей полностью, кое с чем пришлось по разбираться например: выяснить что такое за GPRMC, но и это тоже не сложно т.к. информации полно.

Одним из основных непонятных моментов для меня стало то, что координаты приходят не совсем точно несколько десятков километров в сторону, хотя тут же приходит смс с нормальными координатами. Это доставляло не мало раздражения, потому что к тому моменту я уже написал небольшую программку которая все парсит и сохраняет в xml файл (об этом чуть позже). Решение не лежало на поверхности, потому что я просто не понимал как сформулировать запрос в Google чтобы найти нужную информацию в итоге несколько дней в подряд я читал различные технические спецификации о морской и не только навигации и статьи о работе GPS приемников. Оказалось все достаточно просто координаты приходили в формате WGS-84 и их необходимо было перевести в «обычные» т. е. те, которые подойдут например Яндекс Картам. Собственно с приходом «WGS-84» круг сузился и тут же нашлись формулы и все посчиталось.

Отдельно, хочу написать о программке, которой я занимался по вечерам, для того чтобы принимать данные с трекера. Я выбрал язык c# как наиболее удобный для себя, в универе лабы предпочитал делать на нем в силу его кажущейся простоты, однако. Однако, все чему учили в универе и чему я учился сам — не пригодилось в данном проекте. Например о многопоточности я не слышал ни разу в курсе о C#. Да да. Работы с сетью не было тоже. В общем пришлось разбираться и читать все самому.

Обо всем по порядку.
Для начала стартует метод ServerStart, который заставляет слушать входище соедения, за одно запускает метод, который порождает новый поток который ожидает «клиентов». При подключении клиента порождается еще один поток, который принимает данные с трекера. Все достаточно просто.
        public void ServerStart()
        {
            isServerRunning = true;
            listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            // Определяем конечную точку, IPAddress.Any означает что наш сервер будет принимать входящие соединения с любых адресов
            Point = new IPEndPoint(IPAddress.Any, port);
            // Связываем сокет с конечной точкой
            listener.Bind(Point);
            // Начинаем слушать входящие соединения
            listener.Listen(10);

            socketAccepter();
        }

public void socketAccepter()
        {
            // Запускаем цикл в отдельном потоке, чтобы приложение не зависло
            Thread th = new Thread(delegate()
            {
                while (isServerRunning)
                {
                    // Создаем новый сокет, по которому мы сможем обращаться клиенту
                    // Этот цикл остановится, пока какой-нибудь клиент не попытается присоединиться к серверу
                    Socket client = listener.Accept();

                    //client.ReceiveTimeout = 20000;
                    // Теперь, обратившись к объекту client, мы сможем отсылать и принимать пакеты от последнего подключившегося пользователя.
                    // Добавляем подключенного клиента в список всех клиентов, для дальнейшей массовой рассылки пакетов
                    clients.Add(client);

                    // Начинаем принимать входящие пакеты
                    Thread thh = new Thread(delegate()
                    {
                        messageReciever(client);
                    });

                    thh.Name = "Recieving bags " + DateTime.Now.ToString();
                    thh.Start();
                    threads.Add(thh);
                }
            });
            th.Name = "Accepting Connecton " + threads.Count;
            th.Start();
            threads.Add(th);
        }


Метод который, принимает сообщения. Много раз слышал «За бесконечные циклы нужно сжигать на костре», в виду своей не опытности или правильней сказать не грамотности в данном вопросе, решил пока что использовать так, потом после прочтения нужной литературы попробую написать так как это было бы правильно. Хотя на самом деле я не заметил, чтобы у меня начиналось пожирание процессора, были моменты когда одно ядро полностью загружалось процессом ввиду этого цикла, но после я отладил и стал использовать метод Recieve который останавливает выполнение потока до тех пор пока не придет сообщение от трекера, в общем используется та же самая логика что и с listener.Accept().

        public void messageReciever(Socket client)
        {
            int i = 0, av = 0;
            double t = 0;
            string[] data;
            string[] messages;
            char[] spliter = { '\n', '\r' };
            string message = "";
            
            while (isServerRunning && client.Connected == true)
            {
                try
                {
                    // Сюда будем записывать принятые байты
                    byte[] bytes = new byte[2048];
                    // Принимаем
                    av = client.Receive(bytes);
                    if (av != 0)
                    {

                        message = Encoding.UTF8.GetString(bytes).Remove(av);
                        messages = message.Split(spliter, System.StringSplitOptions.RemoveEmptyEntries);
                        for (i = 0; i < messages.Length; i++)
                        {
                            data = messages[i].Split(',');
                            if (double.TryParse(data[0], out t))
                                saver.parseData(data);
                            //else
                                //MessageBox.Show(messages[i].ToString());

                        }
                    }
                    else
                    {
                        continue;
                    }

                }
                catch //(Exception e)
                {
                    //MessageBox.Show(e.Message + " " + e.StackTrace, "Метод Message Reciever");
                }
            }
            threads.Remove(Thread.CurrentThread);
            Thread.CurrentThread.Abort();
        }


На это в общем то и хочу закончить, единственное что я хочу дополнить, так это, что от сохранения данных в xml файл я решил отказаться, т. к. толком не разобрался как синхронизировать потоки между собой и часто получалось, что файл был открыл одним потоком, а к нему пытается достучаться уже другой поток. Проблему блокировок возложил на СУБД — MySQL. Ах да, парсинг данных разделенных запятой я думаю тоже не нужен в особом представлении, а подключение C# к MySQL достаточно просто и дружелюбно происходит, тем более что MySQL предоставляет все коннекторы.

На данный момент, я планирую расширить функционал этого приложения и накидать веб морду для того чтобы начать все-таки визуализировать перемещения. С веб мордой тоже есть определенные трудности, а именно: определился какие карты использовать, ну собственно изучение API карт. Опыта работы с API каких либо карт нет, но думаю в неспешном порядке так же вечерами все и будет изучаться.

Спасибо тем кто прочел, и отдельное спасибо НЛО.

Приложение
Share post
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 41

    0
    Как будете подключать в авто? Круто бы было если он работал от прикуривателя и от аккумулятора.
      0
      На самом деле пока что просто забрасываю его в машину на несколько суток, когда опрашиваю его смотрю на напряжение на аккумуляторе, при не необходимости забираю домой и заряжаю. А от прикуривателя можно зарядить, например, используя универсальное зарядное, с usb на выходе.
        0
        Зимой в мороз как в машине жил?
      0
      mrpostrock в своем сервисе я использую leaflet в связке с cloudmade тайлами.
      И вопрос, за одину отправку с трекера на сервер, трекер отправляет только одну координату?
        0
        От трекера прилетает вот что: «130402213013,+79637**3***,GPRMC,173013.000,A,6146.4979,N,03421.2399,E,1.92,21.48,020413,,,A*5B,F,, imei:*************,00,-16.4,F:3.73V,0,139,49646,250,99,1478,68A7\n\r» здесь и координаты и все что угодно, бывает из-за задержек или не качественной связи приходит и парами и по три штуки, приходится разделять и записывать все по отдельности.
        0
        Хм, думал передатчик будет дешевле. Под мою сигналку гпс модуль стоит столько же, но подключается штатно, нет проблем с зарядкой и будет сразу нормальная веб морда. Т.е. единственная выгода в чуть большей приватности, ну и конечно же для тех у кого нет сигналки или она не поддерживает гпс. Жаль.
          0
          Моя автосигнализация не поддерживает gps. Кроме того как установить в машину можно найти и другое применение, например засунуть своему ребенку в портфель.) Да и с готовой мордой тоже нет проблем, можно выбрать любую, которая понравится ну и соответственно поддерживает Ваш приемник.
          +5
          WGS-84 тут не при чем, те же Яндекс.Карты тоже используют WGS-84.

          Скорее всего, вы имели в виду, что координаты приходят в формате градусы/минуты/доли минут, и для использования в веб-картах их надо переводить в формат градусы/доли градуса.
            0
            Странно, значит что-то в статье было напутано или яне правильно понял. Спасибо за корректировку, перечитаю еще разок.
              +2
              Если быть совсем точным, то WGS84 — это система географических координат.

              А то, как эти координаты были представлены (строка, начинающаяся с GPRMC и заканчивающаяся контрольной суммой после "*") — это часть протокола NMEA 0183, предназначенного для связи различных навигационных устройств. И в этом протоколе действительно принято передавать координаты как GGMM.MM gggmm.mm (с буквой полушария) тогда как в картографических API принято использовать десятичный формат GG.GGGGG ggg.ggggg и вместо буквы полушария — знак (южное и западное обозначаются отрицательным значением).
              Еще стоит обратить внимание на букву, которая идет во втором поле после времени — в случае, если там не «А» эту точку стоит выбросить, как недостоверную, или каким-то образом пометить.
                0
                Протокол NMEA 0183 прочитал, когда разбирался со строчкой, там все основные моменты выяснил. Была только путаница с координатами.
            0
            Кстати, есть у меня такой же трекер (ну или аналогичный, кто их, китайцев разберет?). Тоже писал свой сервер, с веб-интерфейсом, и все это даже работало. Но у моего экземпляра выявилась очень неприятная особенность — поработав некоторое время, он толи засыпал, толи зависал. Соотвественно, новые координаты не приходили, на звонки он отвечал через раз. Такие зависания могли продолжаться порядка часа, затем он вновь выходил на связь. Так что, для серьезного применения он не годится, только как игрушка.
              0
              Такого поведения не замечал, было что я звонками замучивал его когда писал программу, тогда он вообще вырубался, но через минутку приходил в чувство.
              На офф. сайте есть проверка имея трекера там можете узнать такой же или аналогичный. Я имею ввиду: может подделка попалась?
              0
              А что за разьем ЮСБ на нем находится? Купил такой же на ибее, в комлекте была только американская вилка и все, Не один из меюшихся проводов к нему не подошел
                0
                Покопался в своей куче проводов и нашел там единственный подходящий: это оказался видео кабель от камеры для телевизора. Я думаю, что этот usb нужен только для зарядки.
                  0
                  Похоже это UC-6E mini USB разъем, как в фотоаппаратах: Mini-USB 8 pin — pinoutsguide.com
                    0
                    Это не USB, там расшит Serial порт.
                    К нему подключается кабель для перепрошивки.
                    Я меня нет навыка владения паяльника с такими мелкими контактами, поэтому подключится у меня не получилось.
                    0
                    Есть нормальные трекеры с питанием от акб автомобиля и есть интернет серисы для них, позволяющие в реальном режиме отслеживать их
                      0
                      Это только за женой следить, угонщикам эти трекеры не помеха. Мониторится gsm активность вокруг машины, если есть, то включается глушилка и вперед.
                        0
                        Можно настроить отправку координат раз в час, например. Так будет менее заметно.
                          0
                          Я себе вот такое чудо поставил. avtoblast.ru/catalog/gps-tracker/gps-t-15
                          Правда до интерфейса дело пока не дошло.

                          Порадовало время автономной работы. Уже полгода не требует зарядки. Опрос пока идет раз в сутки.

                          И глушилки только если сразу включать. Основное время девайс спит и не подает признаков жизни. Включается по таймеру, проверяет наличие команд, засыпает.
                            0
                            Работает по тому же принципу в том смысле, что команды так же присылает через tcp? Есть возможность настроить на свой сервер?
                            0
                            Хм… а интересно, можно ли мониторить мониторинг gsm активности?
                            0
                            Вот бы сервер по сбору данных с трекера для роутера написать, все равно он все время включен…
                              0
                              В плане обеспечения безопасности авто gps трекер довольно сомнительное удовольствие, угонщики давно научились глушить gsm/gps сигнал.
                              Лучше потратить деньги на установку хорошего иммобилайзера + замка капота, ну или самый бюджетный вариант — замок на рулевой вал.
                                0
                                Контроль скорости, начала передвижения

                                Там акселерометр стоит, или он только по GPS это определяет?
                                  0
                                  Да какая разница что там стоит, устройство не сможет передать никакие данные, т.к. gsm сигнал будет заглушен
                                    0
                                    Потерять GPS сигнал гораздо проще (например, в гараже), поэтому и спрашиваю, как он определяет движение.
                                    0
                                    Видимо есть какой-то датчик, т.к. на сайте производителя заявлено:
                                    Vibration alert
                                    0
                                    70-80 баксов и время работы 12 часов. А почему не взять дешевенького смарта-китайчонка на ондроеде с дохлым железом, но хорошей батареей + gps + gsm + фоновый сервис, который будет отсылать координаты через таймаут? Экран будет все время выключен, энергия будет тратится только на установку связи, отправку + поднятие gps.
                                      0
                                      Например, потому что в этом трекере GPS-антенна в несколько раз больше размером, чем в смартфоне, что неминуемо сказывается на устойчивости определения координат.
                                        0
                                        Если заехать в тоннель или под мост — никакая антенна не спасет. Про глушилки уже было сказано. Просто со смартом получается более дешевый и простой вариант в плане реализации и допиливания под себя (свое приложение).
                                          0
                                          В тоннеле — не спасет, ничто, при применении глушилки — тоже. А вот в плотной застройке координаты со смартфона могут плясать так, что окажутся в соседних дворах. И совершенством приложения никак не удастся улучшить устойчивость приема.
                                            0
                                            Отраженный сигнал от высоток — это проблема, и антенна никак не улучшит ситуацию. Да и нужно ли такое точное положение, если известно, что машина все-равно находится в радиусе 100м от точки парковки? Появляется еще один потенциальный бонус — местоположение по базовым станциям опсосов. Ну или на худой конец можно расковырять железку и вывести антенну наружу с произвольным расширением — фантазия не ограничена ничем, включая заточку софта подо все эти ухищрения. В готовых решениях такой фокус не пройдет.
                                            Я к чему веду — готовое решение хорошо, когда оно занимает свою нишу по выполнению функций и по соответствующей стоимости. 70 баксов за такое — это очень много.
                                              –1
                                              Речь не о multipath-эффектах, а об ослаблении сигналов.
                                      0
                                      Симка морозостойкая? У меня при -20 связь ложилась полностью. В сигнализации стоит морозостойкая симка от MTC с тарифом «телеметрия», в -30 все работает.
                                        0
                                        Симка самая обычная от билайна с тарифом «Go» проблем пока что не было.
                                        0
                                        У меня есть другая фиговина, на самой плате написано tk-203, думаю что здесь такая же схемотехника.
                                        Для своего спарсил все команды, которые он шлёт:

                                        Все команды которые передаются на сервер"

                                        Если послать на устройство:
                                        ARM (поставить на охрану): imei:353579010300000,L
                                        подтверждение: imei:353579010300000,lt,1104192102,+79039000000,F,160211.000,A,5501.7300,N,08258.4156,E,5.88,;

                                        DisARM (снять с охраны): imei:353579010300000,M
                                        подтверждение: imei:353579010300000,mt,1104192104,+79039000000,F,160441.000,A,5501.7140,N,08258.3789,E,0.80,;

                                        Активироать реле: imei:353579010300000,J
                                        подтверждение: imei:353579010300000,jt,1104192106,+79039000000,F,160618.000,A,5501.7217,N,08258.3670,E,1.36,;

                                        Деактивировать реле: imei:353579010300000,K
                                        подтверждение: imei:353579010300000,kt,1104192107,+79039000000,F,160740.000,A,5501.7271,N,08258.3674,E,0.38,;

                                        Время на терминале: imei:353579010300000,I,+1 (вместо +1 можно набрать от -12 до +12)
                                        подтверждение: imei:353579010300000,it,1104191509,+79039000000,F,160956.000,A,5501.7447,N,08258.3403,E,0.63,;

                                        Превышение скорости: imei:353579010300000,H,060 (вместо 060 можно выбрать от 010 до 300, возможно что километров)
                                        подтверждение: imei:353579010300000,ht,1104191711,+79039000000,F,161111.000,A,5501.7351,N,08258.3638,E,1.67,;

                                        Охрана, отключить уведомления: imei:353579010300000,E
                                        подтверждение: imei:353579010300000,et,1104191716,+79039000000,F,161600.000,A,5501.7180,N,08258.3894,E,0.92,;

                                        Охрана, включить уведомления: imei:353579010300000,G
                                        подтверждение: imei:353579010300000,gt,1104191713,+79039000000,F,161335.000,A,5501.7222,N,08258.3841,E,1.07,;

                                        Частота обновления (посылки координат): imei:353579010300000,C,05m (вместо 05m (5 минут) можно задать: 10s,15s,20s,30s,01m,05m,10m,30m,01h,05h,10h,24h)
                                        подтверждение: отсутствует, присылаются текущие координаты (imei:353579010300000,tracker,1104191726,+79039000000,F,162643.000,A,5501.7157,N,08258.4016,E,2.35,;)

                                        Запросить текущие координаты: imei:353579010300000,B
                                        подтверждение: отсутствует, присылаются текущие координаты (imei:353579010300000,tracker,1104191727,+79039000000,F,162754.000,A,5501.7275,N,08258.3626,E,0.36,;)

                                        Опасно, потеря терминала через GPRS (вернуть через SMS — «adminip123456 ip_address port»)!
                                        Переключить в режим SMS-уведомления: imei:353579010300000,N
                                        Подтверждение: imei:353579010300000,nt,1104191730,+79039000000,F,163037.000,A,5501.7209,N,08258.3811,E,0.24,;

                                        — При включении устройство соединяется с сервером, посылая какие-то данные, в том числе и: imei:353579010300000,A;
                                        в этот момент сервер отправляет данные о регистрации: LOAD
                                        После этого устройство опять посылает свой IMEI: 353579010300000
                                        на что сервер отвечает: ON

                                        — Регистрация событий:
                                        Кнопка SOS: imei:353579010300000,help me,0000000000,+79039000000,L,;
                                        Включение питания (зажигания) ACC: imei:353579010300000,acc alarm,0000000000,+79039000000,L,;
                                        Открытие двери: imei:353579010300000,door alarm,0000000000,+79039000000,L,;
                                        Работа от аккумулятора: imei:353579010300000,ac alarm,0000000000,+79039000000,L,;

                                        В данном случае:
                                        353579010300000 — IMEI
                                        +79039000000 — номер установленной SIM карты в устройстве

                                        P.S.
                                        Извиняюсь, не знаю как засунуть под спойлер, habracut не работает :(
                                          0
                                          Вот отличное решение для работы с картами и визуализацией координат(сам такую использую): GMap.NET
                                          Умеет работать с разными картами(имеет класс провайдера карт), как то яндекс, гугл, опенстритмап и еще кучу разных. Полностью опенсорс.

                                          Кодом проекта поделитесь с коллективом?
                                            0
                                            Прицепил ссылку. Извиняюсь, что долго правил: обрыв оптоволокна был до моего района.
                                            0
                                            кто-то знает как перепрошить эту приблуду, чтобы она включалась на 10 минут каждые 4 часа? Чтобы время жизни батареи продлить для тех, кто хочет найти украденное после угона, но не хочет ежедневно заряжаться?

                                            Only users with full accounts can post comments. Log in, please.