Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.9.171] |
|
Сообщ.
#1
,
|
|
|
1. В последних наладонниках пошли встроенные GPS приемники. Можно ли как программно получить координаты ?
2. Как программно создать сетевое соединение при установке приложениея ? 3. Как программно подключить его ? 4. Если в момент передачи данных придет входящий звонок, то будет ли обрыв GPRS соединения ? Если да, то восстановится ли она или придется опять его устанавливать ? |
Сообщ.
#2
,
|
|
|
Цитата zss @ Можно, открыть com-порт, к которому "подключен" приемник и прочитать используя NDIS. Можно ли как программно получить координаты ? Цитата zss @ afaik, не будет Если в момент передачи данных придет входящий звонок, то будет ли обрыв GPRS соединения ? |
Сообщ.
#3
,
|
|
|
ANDLL, а ссылочек у тебя не будет по данной теме ?
|
Сообщ.
#4
,
|
|
|
нет, если не считать гугла и msdn
|
Сообщ.
#5
,
|
|
|
Цитата ANDLL @ нет, если не считать гугла и msdn этого мало. Я просто не работал с COM да и тем более с NDIS под CF. |
Сообщ.
#6
,
|
|
|
Ладно, так уж и быть
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 } } Использование: using (g = new GPS("COM7:")) // Выясни к какому COM-порту подлючен твой. К портам 7-8 подключаются Bluetooth навигаторы { //Ну а что тут делать догадаешься. как вариант - sleep(1000) и читать своства Longitude и Latitude } |
Сообщ.
#7
,
|
|
|
ух как все не тривиально...
А кричат, что .NET все могет Добавлено Цитата ANDLL @ afaik, не будет ты уверен ? Но хотябы на время звонка сваязь прервется ? P.S. И, кстати, небыло ответа по поводу создания и установления соединения.... |
Сообщ.
#8
,
|
|
|
Цитата zss @ Ну мож и могет... Кстати, обо всех багах в коде просьба сообщать(хотя бы в личку)А кричат, что .NET все могет Цитата zss @ ты уверен ? http://www.google.com/search?q=afaik |
Сообщ.
#9
,
|
|
|
а почему бы не сделать проще, используя SerialPort?
private SerialPort _serialPort; ... _serialPort = new SerialPort("COM2", 4800, Parity.None); _serialPort.StopBits = StopBits.One; ... _serialPort.Open(); ... string msg = _serialPort.ReadExisting(); и дальше разбить с помощью msg.Split на строки |
Сообщ.
#10
,
|
|
|
Если под Compact Framework 2.0, то тебе нужен SerialPort
Работа с GPS: вычисление длины пути - тут пример работы, а ниже приведу пример подключения порта // Устанавливаем параметры - имя порта и скорость передачи инфы serialPort1.BaudRate = BaudRate; serialPort1.PortName = COMName; try { serialPort1.Open(); } catch { MessageBox.Show("Возникли проблемы с подключением GPS"); } и потом по событию serialPort1_DataReceived 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 |
Сообщ.
#11
,
|
|
|
В примерах WM SDK 6 есть пример работы с GPS
|
Сообщ.
#12
,
|
|
|
Да, с GPS проблем не возникает. а вот с GPRS (((
GPS - справляется запросто serialPort. Касательно GPRS по началу тоже не было проблем. Но, если не поднято подключение GPRS, то в ответ и результат плачевный. Прочитав следующую статью http://mobile-developer.ru/wxwince/kak-programmno-ustanovit-gprs-soedinenie-v-windows-mobile/ попытался настроить и поднять GPRS подключение. Что у меня получилось: 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 ошибка(код моей собственной ошибки). Кто пробовал поднять подключение? Расскажи что да как? Где тут камень подводный? |
Сообщ.
#14
,
|
|
|
ANDLL спасибо большое за ваш пример кода подключения к GPS через dll. Все заработало. Другие методы не работали, потому что порт был занят каким то сервисом - теперь проблем нет. Специально зарегистрировался на форуме чтобы сказать спасибо.
|