На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
Модераторы: maxim84_, juice
  
> GPS и GPRS
    1. В последних наладонниках пошли встроенные GPS приемники. Можно ли как программно получить координаты ?
    2. Как программно создать сетевое соединение при установке приложениея ?
    3. Как программно подключить его ?
    4. Если в момент передачи данных придет входящий звонок, то будет ли обрыв GPRS соединения ? Если да, то восстановится ли она или придется опять его устанавливать ?
    Ждем с нетерпением гастарбайтеров из США на стройках родины и в структуре ЖКХ
      Цитата zss @
      Можно ли как программно получить координаты ?
      Можно, открыть com-порт, к которому "подключен" приемник и прочитать используя NDIS.
      Цитата zss @
      Если в момент передачи данных придет входящий звонок, то будет ли обрыв GPRS соединения ?
      afaik, не будет
        ANDLL, а ссылочек у тебя не будет по данной теме ?
        Ждем с нетерпением гастарбайтеров из США на стройках родины и в структуре ЖКХ
          нет, если не считать гугла и msdn
            Цитата ANDLL @
            нет, если не считать гугла и msdn

            этого мало. Я просто не работал с COM да и тем более с NDIS под CF.
            Ждем с нетерпением гастарбайтеров из США на стройках родины и в структуре ЖКХ
              Ладно, так уж и быть
              ExpandedWrap disabled
                using System;
                using System.ComponentModel;
                using System.IO;
                using System.Runtime.InteropServices;
                using System.Text;
                using System.Threading;
                 
                namespace gpLoc
                {
                    class GPS : IDisposable
                    {
                        public double Longitude { get; private set; }
                 
                        public double Latitude { get; private set; }
                 
                        [DllImport("Coredll", SetLastError = true)]
                        static extern IntPtr CreateFile(
                                        string filename,
                                        uint fileaccess,
                                        [MarshalAs(UnmanagedType.U4)]FileShare fileshare,
                                        int securityattributes,
                                        [MarshalAs(UnmanagedType.U4)]FileMode creationdisposition,
                                        int flags,
                                        IntPtr template);
                 
                        [DllImport("Coredll", SetLastError = true)]
                        static extern bool ReadFile(IntPtr hFile, ref byte lpBuffer, uint
                        nNumberOfBytesToRead, ref uint lpNumberOfBytesRead, IntPtr lpOverlapped);
                 
                        [DllImport("Coredll", SetLastError = true)]
                        static extern int CloseHandle(IntPtr hFile);
                 
                        private readonly IntPtr gps;
                        private bool disposed;
                        private readonly FileStream lg;
                        private readonly StreamWriter lgw;
                        private readonly Thread t;
                 
                        public GPS(string file)
                        {
                            gps = CreateFile(file, 0x80000000, 0, 0, FileMode.Open, 0, new IntPtr(0));
                            if (gps.Equals(new IntPtr(-1)))
                                throw new Win32Exception(Marshal.GetLastWin32Error(),"Cannot open gps data");
                            /*lg = new FileStream("zZz.txt", FileMode.Create);
                            lgw = new StreamWriter(lg);*/
                            t = new Thread(reader);
                            t.Start();
                        }
                 
                        private void reader()
                        {
                            
                            var b = new byte[1000];
                            var text = "";
                            while(true)
                            {
                                var readed = 0u;
                                if(!ReadFile(gps, ref b[0], (uint)b.Length, ref readed, IntPtr.Zero))
                                    return;
                                if(readed == 0)
                                {
                                    Thread.Sleep(100);
                                    continue;
                                }
                                text += Encoding.ASCII.GetString(b, 0, (int)readed);
                                var lines = text.Split('\n');
                 
                                if (string.IsNullOrEmpty(lines[lines.Length - 1]))
                                    text = "";
                                else
                                    text = lines[lines.Length - 1];
                 
                                for(var i = 0; i < lines.Length - 1; i++)
                                {
                                    stringReceivied(lines[i]);
                                }
                            }
                        }
                 
                        private void stringReceivied(string s)
                        {
                            if (lgw != null)
                                lgw.WriteLine("::" + s);
                            if (s.StartsWith("$GPGGA"))
                                locationReceivied(s.Split(','));
                        }
                 
                        private void locationReceivied(string[] s)
                        {
                            if (lgw != null)
                                lgw.WriteLine("!!lat: " + s[2] + "; lon: " + s[4]);
                            try
                            {
                                location(double.Parse(s[2]), double.Parse(s[4]));
                            }
                            catch(FormatException)
                            {}
                        }
                 
                        private void location(double _latitude, double _longitude)
                        {
                            Latitude = _latitude ;
                            Longitude = _longitude;
                        }
                 
                        #region IDisposable Members
                 
                        void IDisposable.Dispose()
                        {
                            if (disposed)
                                return;
                            disposed = true;
                            if (t != null)
                                t.Abort();
                            CloseHandle(gps);
                            if(lgw!=null)
                                lgw.Close();
                            if (lg != null)
                                lg.Close();
                        }
                 
                        #endregion
                    }
                }

              Использование:
              ExpandedWrap disabled
                                using (g = new GPS("COM7:")) // Выясни к какому COM-порту подлючен твой. К портам 7-8 подключаются Bluetooth навигаторы
                                {
                                    //Ну а что тут делать догадаешься. как вариант - sleep(1000) и читать своства Longitude и Latitude
                                }
              Тестировался только с одним навигатором, так что возможно придется в stringReceivied пересмотреть проверку на подстроку.
                ух как все не тривиально...

                А кричат, что .NET все могет :)

                Добавлено
                Цитата ANDLL @
                afaik, не будет

                ты уверен ? Но хотябы на время звонка сваязь прервется ?

                P.S. И, кстати, небыло ответа по поводу создания и установления соединения....
                Ждем с нетерпением гастарбайтеров из США на стройках родины и в структуре ЖКХ
                  Цитата zss @
                  А кричат, что .NET все могет
                  Ну мож и могет... Кстати, обо всех багах в коде просьба сообщать(хотя бы в личку)
                  Цитата zss @
                  ты уверен ?

                  http://www.google.com/search?q=afaik
                    а почему бы не сделать проще, используя SerialPort?
                    ExpandedWrap disabled
                      private SerialPort _serialPort;
                      ...
                      _serialPort = new SerialPort("COM2", 4800, Parity.None);
                      _serialPort.StopBits = StopBits.One;
                      ...
                      _serialPort.Open();
                      ...
                      string msg = _serialPort.ReadExisting();

                    и дальше разбить с помощью msg.Split на строки
                    Сообщение отредактировано: Avtopilotik -
                      Если под Compact Framework 2.0, то тебе нужен SerialPort
                      Работа с GPS: вычисление длины пути - тут пример работы, а ниже приведу пример подключения порта
                      ExpandedWrap disabled
                                    // Устанавливаем параметры - имя порта и скорость передачи инфы
                                    serialPort1.BaudRate = BaudRate;
                                    serialPort1.PortName = COMName;
                        try
                                    {
                                        serialPort1.Open();
                                    }
                                    catch
                                    {
                                        MessageBox.Show("Возникли проблемы с подключением GPS");
                                    }


                      и потом по событию serialPort1_DataReceived
                      ExpandedWrap disabled
                                private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
                                {
                                    //Самая обычная функция получения строки GPS от модуля
                                    //Уделите внимание тому, что некоторые GPS любят отдавать неполные строки, а потом остатки кидать вдогонку =)
                                    String s = serialPort1.ReadExisting();
                                }


                      Если необходимо использовать Compact Framework 1.1, то поможет эта тема - Работа с GPS под CF 1.1
                      Мой текущий проект http://baphomethpge.blogspot.com

                      Разве не прелесть? =)))
                      ExpandedWrap disabled
                        >>> bool b; if (b.ToString().Length==4) MessageBox.Show("True!");
                        >>> if (0 < -this.Position.Y) {...}

                      ExpandedWrap disabled
                        >>>for i:= 100 to round(d) do scaleMap:=scaleMap-0.003;
                        В примерах WM SDK 6 есть пример работы с GPS
                          Да, с GPS проблем не возникает. а вот с GPRS (((
                          GPS - справляется запросто serialPort.
                          Касательно GPRS по началу тоже не было проблем. Но, если не поднято подключение GPRS, то в ответ и результат плачевный.
                          Прочитав следующую статью http://mobile-developer.ru/wxwince/kak-programmno-ustanovit-gprs-soedinenie-v-windows-mobile/ попытался настроить и поднять GPRS подключение.
                          Что у меня получилось:
                          ExpandedWrap disabled
                                        ConnectionInfo ci = new ConnectionInfo();
                                        IntPtr phConnection = IntPtr.Zero;
                                        uint status = 0;
                             
                                        ci.cbSize = (uint)Marshal.SizeOf(ci);
                                        ci.dwParams = CONNMGR_PARAM_GUIDDESTNET;
                                        ci.dwFlags = CONNMGR_FLAG_PROXY_HTTP;
                                        ci.dwPriority = CONNMGR_PRIORITY_USERINTERACTIVE;
                                        ci.bExclusive = 0;
                                        ci.bDisabled = 0;
                                        ci.hWnd = IntPtr.Zero;
                                        ci.uMsg = 0;
                                        ci.lParam = 0;
                             
                                        if (ConnMgrEstablishConnectionSync(ref ci, ref phConnection, INFINITE, ref status) != S_OK &&
                                           status != CONNMGR_STATUS_CONNECTED)
                                            return 102;                         //002 - Код ошибки - не удалось поднять GPRS
                                        //Ниже считаем, что все успешно и работаю с GPRS.

                          Константы, библиотеки и структуры... все взято со статьи указанной выше.
                          Но у меня всегда возникает 102 ошибка(код моей собственной ошибки). Кто пробовал поднять подключение? Расскажи что да как? Где тут камень подводный?
                            zss, я когда-то делал ВОТ ТАК
                              ANDLL спасибо большое за ваш пример кода подключения к GPS через dll. Все заработало. Другие методы не работали, потому что порт был занят каким то сервисом - теперь проблем нет. Специально зарегистрировался на форуме чтобы сказать спасибо.
                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                              0 пользователей:


                              Рейтинг@Mail.ru
                              [ Script Execution time: 0,1771 ]   [ 18 queries used ]   [ Generated: 16.09.19, 16:33 GMT ]