Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Kommunicera med GPS-enheten på mobiltfn.

Postades av 2007-08-04 10:18:25 - Johannes Strömberg, i forum asp.net generellt, Tråden har 20 Kommentarer och lästs av 872 personer

Halloj!

Jag har en HTC P3300 (Artemis) med inbyggd GPS och Windows Mobile 5.0.

GPS:en är inställd på COM4 och funkar som den ska. Tänkte nu göra en liten snurra som tar ut GPS-koordinaterna med jämna mellanrum (typ 20 sek) och sänder dem till en server.

Skickandet till servern är inga konstigheter, men hur sjutton gör man för att hämta ut koordinaterna från GPS:en??

Någon som kan peka mig i rätt riktning så vore det riktigt uppskattat.

//Johannes


Svara

Sv: Kommunicera med GPS-enheten på mobiltfn.

Postades av 2007-08-04 11:43:14 - Daniel Hermansson

GPS:en använder troligen NMEA-0183. Skickar ut en sträng innehållande olika sorters GPS Sentence. Googla på NMEA 0183 så får du se vilken Sentence som passar dig. Allt kommer i en långt textsträng med smidiga identifierare så det är bara att parsa ut just det du vill ha. Om det bara är long och lat du vill ha kan du ta nästan vilken Sentence som helst.


Svara

Sv:Kommunicera med GPS-enheten på mobiltfn.

Postades av 2007-08-05 08:36:58 - Johannes Strömberg

Japp, det är NMEA-0183 den skickar ut (enl spec iaf). Men hur läser jag det från COM-porten? Jag har ett SerialPort objekt och har ställt den på rätt COM och har försökt med diverse metoder för att läsa.
Men jag får enbart diverse fel. Allt från att objektet inte stöder Latebinding till helt enkelt bara Exception utan närmare beskrivning.


Svara

Sv: Kommunicera med GPS-enheten på mobiltfn.

Postades av 2007-08-05 10:22:59 - Björn Johansson

Du verkar ju helt klart vara på rätt väg.
Det här har jag använt mig utav att utgå ifrån för liknande saker:
http://blogs.msdn.com/coding4fun/archive/2006/10/31/912287.aspx

Kanske hittar du någon detalj som du missat...annars visa lite kod.


Svara

Sv:Kommunicera med GPS-enheten på mobiltfn.

Postades av 2007-08-05 22:08:45 - Johannes Strömberg

Hmm. Jag hittade en applikation på devx.com som gjorde vad jag ville. Tankade hem koden, modifierade den (vill inte skicka data till servern nu utan bara skriva ut Lat o Long i PDA:n). Men den verkar inte hitta något. Den verkar öppna porten och aktivera GPS:en (vilket märks på lite lampor som blinkar i olika mönster och färger) och om jag öppnar TomTom mitt i det hela så märks det DIREKT att den har fix på satelliter eftersom TomTom DIREKT visar korrekt position och hänger med i rörelser.

Följande kod har jag:

<code>
Public Class Form1
Private WithEvents serialPort As New IO.Ports.SerialPort

Private Sub ConnectGPS(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem1.Click
If serialPort.IsOpen Then
serialPort.Close()
End If

Try
With serialPort
.PortName = "COM4"
.BaudRate = 9600
.Parity = IO.Ports.Parity.None
.DataBits = 8
.StopBits = IO.Ports.StopBits.One
End With
serialPort.Open()
MenuItem1.Enabled = False
MenuItem3.Enabled = True

Catch ex As Exception
MsgBox(ex.ToString)
End Try

End Sub

Private Sub DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles serialPort.DataReceived
TextBox1.BeginInvoke(New myDelegate(AddressOf updateTextBox), New Object() {})
End Sub

Public Delegate Sub myDelegate()
Public Sub updateTextBox()
TextBox1.Text += serialPort.ReadExisting()
Dim lines() As String = TextBox1.Text.Split(vbLf)
If lines.Length < 2 Then
Exit Sub
End If
If TextBox1.Text.Length >= 500 Then
TextBox1.Text = TextBox1.Text.Substring(TextBox1.Text.LastIndexOf("$"))
End If
If lines(lines.Length - 2).StartsWith("$GPGGA") Or lines(lines.Length - 2).StartsWith("$GPRMC") Then
processGPSData(lines(lines.Length - 2))
End If
End Sub

Private Sub processGPSData(ByVal str As String)
Dim rawLatLng As Double
Try
Dim field() As String
field = str.Split(",")
Dim lat, lng As Double
Select Case field(0)
Case "$GPGGA"
'---latitude---
rawLatLng = Convert.ToDouble(field(2))
lat = (rawLatLng \ 100) + _
((rawLatLng - ((rawLatLng \ 100) * 100)) / 60)

'---latitude is negative if South---
If field(3) = "S" Then
lat *= -1.0
End If

'---longitude---
rawLatLng = Convert.ToDouble(field(4))
lng = (rawLatLng \ 100) + _
((rawLatLng - ((rawLatLng \ 100) * 100)) / 60)

'---longitude is negative if West---
If field(5) = "W" Then
lng *= -1.0
End If

'---display the lat and lng---
lblLatTitle.Text = lat
lblLng.Text = lng

'---synchronize with the server---
'sync.PerformSync(ServerIP, ID & ":" & lat & ":" & lng)

Case "$GPRMC"
'---display the speed---
If field(7) = String.Empty Then
lblSpeed.Text = "0 km/h"
Else
lblSpeed.Text = (Convert.ToDouble(field(7)) * 1.85).ToString & " km/h"
End If
End Select
Catch
MsgBox("Ett fel har uppstått")
End Try
End Sub

Private Sub DisconnectGPS(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem3.Click
serialPort.Close()
MenuItem1.Enabled = True
MenuItem3.Enabled = False
End Sub

End Class
</code>

Det känns som att den connectar mot GPS:en som sagt men att inget triggar igång DataReceived.
Vad sjutton ska man göra? Är helt vilse i pannkakan här.

//Johannes


Svara

Sv: Kommunicera med GPS-enheten på mobiltfn.

Postades av 2007-08-06 15:35:24 - Christer Ehrenström

Hejsan

Jag sitter med samma programförsök som du och kan läsa NMEA-strängarna utan problem, dock funkar inte vidaresändningen till servern för mig. Jobbar vidare och hör av mig igen.

En fråga bara: Du säger att TomTom läser GPS.data utan problem men att din applikation inte gör det. Du kan inte ha två applikationer igång samtidigt som läser porten. Den som läser först rensar porten, vilket kan vara en förklaring till att din app inte hittar något.

Dessutom: Har du Nationella inställningar för Sverige så kommer decimapunkt/decimalkomma att ställa till det för dig.

mvh
Christer


Svara

Sv:Kommunicera med GPS-enheten på mobiltfn.

Postades av 2007-08-06 23:30:28 - Johannes Strömberg

Nej. Jag kör inte TomTom och min applikation samtidigt. Jag kör en åt gången. Men om TomTom får synk inom ~30 sekunder och min applikation inte får det alls, då känns det som att något är fel. Den verkar som sagt inte trigga eller avsluta DataReceived eventet.

Läste något om det innan att det inte går att köra det eftersom det är en konstant ström av data, samtidigt som jag hittade lite info om att det finns något som heter GPS_POSITION i WM5 SDK:n.

Ska kolla närmare på det och återkommer jag med.

Om någon har en lösning på problemet så tveka inte att säga till.

//Johannes


Svara

Sv: Kommunicera med GPS-enheten på mobiltfn.

Postades av 2007-08-07 00:36:05 - Christer Ehrenström

Okay Johannes,
helt plötsligt och utan föregående varning började mitt program funka.
Jag skall plocka bort en massa onödigt test-krafs och sen skicka koden till dig i morgon.


Svara

Sv:Kommunicera med GPS-enheten på mobiltfn.

Postades av 2007-08-07 09:52:54 - Johannes Strömberg

Gärna.. Ska bli mycket intressant att se. :)

//Johannes


Svara

Sv:Kommunicera med GPS-enheten på mobiltfn.

Postades av 2007-08-07 10:17:39 - Patrik Löwendahl

lägg gärna upp det här på pellesoft, jag har ocksåe en 3300 som jag tänkte skriva en liten app till.


Svara

Sv: Kommunicera med GPS-enheten på mobiltfn.

Postades av 2007-08-07 20:51:55 - Christer Ehrenström

Hej igen
Applikationen består av Form1.vb och Sync.vb

Här finns bara koden för PDA, alltså ingenting för Servern.
Hoppas detta hjälper dig.

Koden för Form1


Public Class Form1
    '************************************************************
    'Denna kod är till mycket stor del baserad på koden från Wei-Meng Lee's artikel 
    'Take Your Apps Far and Wide with a GPS Tracking System 
    'på http://www.devx.com/wireless/Article/32938/0
    '
    'Jag kunde inte få koden att fungera rakt av, men kom fram till att ett problem
    'är att handdatorer med svensk nationell inställning får problem med koder såsom
    'rawLatLng = Convert.ToDouble(field(2))
    'För att råda bot för detta gör jag ett byte av decimalpunkt mot decimalkomma 
    'varvid jag i denna kod använder strängvariabeln LocSep som innehåller det 
    'tecken som används. (Se Form1_Load)
    '************************************************************


    Public LocSep As String


    '---serial port to connect to the GPS receiver---
    Private WithEvents serialPort As New IO.Ports.SerialPort

    '---IP address of the server---
    Private ServerIP As String = "10.0.1.4" 'Byt ut mot din egen IP-adress

    '---the ID of the user---
    Private ID As String = "1"

    '---use for synchronization---
    Dim sync As New Sync

    '---Connect GPS---
    Private Sub MenuItem1_Click( _
       ByVal sender As System.Object, _
       ByVal e As System.EventArgs) _
       Handles MenuItem1.Click

        '---close the port if it is already open---
        If serialPort.IsOpen Then
            serialPort.Close()
        End If

        '---set the parameters and open the port---
        Try
            With serialPort
                .PortName = "COM6"
                .BaudRate = 9600
                .Parity = IO.Ports.Parity.None
                .DataBits = 8
                .StopBits = IO.Ports.StopBits.One
            End With
            serialPort.Open()
            '---disable the Connect GPS menu item---
            MenuItem1.Enabled = False
            '---enable the Disconnect menu item---
            MenuItem3.Enabled = True
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub

    Private Sub DataReceived( _
           ByVal sender As Object, _
           ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) _
           Handles serialPort.DataReceived
        TextBox1.BeginInvoke(New _
           myDelegate(AddressOf updateTextBox), _
           New Object() {})
    End Sub

    Public Delegate Sub myDelegate()
    Public Sub updateTextBox()
        TextBox1.Text += serialPort.ReadExisting()
        Dim lines() As String = TextBox1.Text.Split(vbLf)
        If lines.Length < 2 Then
            Exit Sub
        End If
        If TextBox1.Text.Length >= 1000 Then
            '---clear until the last $---
            TextBox1.Text = TextBox1.Text.Substring(TextBox1.Text.LastIndexOf("$"))
        End If
        If lines(lines.Length - 2).StartsWith("$GPGGA") Or _
           lines(lines.Length - 2).StartsWith("$GPRMC") Then
            processGPSData(lines(lines.Length - 2))
        End If
    End Sub



    Private Sub processGPSData(ByVal str As String)
        Dim rawLatLng As Double
        Try
            '---separate the GPS data into various fields---
            Dim field() As String
            field = str.Split(",")
            Dim lat, lng As Double
            Select Case field(0)
                Case "$GPGGA"
                    If Convert.ToDouble(field(6)) = 1 Then
                        '---latitude---
                        '*************************************************************
                        'Här sker utbytet av punkt till nationellt decimaltecken
                        '*************************************************************

                        field(2) = Replace(field(2), ".", LocSep)
                        rawLatLng = field(2)

                        '*************************************************************
                        'NMEA-strängen ger en latitud i formatet 5910.1234
                        'vilket skall utläsas som 59 grader och 10.1234 bågminuter
                        'vilket i sin tur omräknas till grader och decimaler av grader enligt
                        'nedanstående formel.
                        '*************************************************************

                        lat = (rawLatLng \ 100) + _
                              ((rawLatLng - ((rawLatLng \ 100) * 100)) / 60)

                        '---latitude is negative if South---
                        If field(3) = "S" Then
                            lat *= -1.0
                        End If


                        '**************************************************************
                        'Samma sak här fast NMEA-strängen innehåller ett tecken mer till vänster om 
                        'decimaltecknet (longituden omfattar ju +180 till -180 grader medan latituden 
                        'ju omfattar +90 till -90.
                        '**************************************************************

                        '---longitude---
                        '*************************************************************
                        'Här sker utbytet av punkt till nationellt decimaltecken
                        '*************************************************************

                        field(4) = Replace(field(4), ".", LocSep)

                        rawLatLng = field(4)
                        lng = (rawLatLng \ 100) + _
                              ((rawLatLng - ((rawLatLng \ 100) * 100)) / 60)

                        '---longitude is negative if West---
                        If field(5) = "W" Then
                            lng *= -1.0
                        End If

                        '---display the lat and lng---
                        lblLat.Text = "Lat:" & lat
                        lblLng.Text = "Lng:" & lng

                        '---synchronize with the server---
                        sync.PerformSync(ServerIP, ID & ":" & lat & ":" & lng)
                    End If
                Case "$GPRMC"
                    If field(2) = "A" Then
                        '---display the speed---
                        If field(7) = String.Empty Then
                            lblSpeed.Text = "Speed: 0 km/h"
                        Else
                            '*************************************************************
                            'Här sker utbytet av punkt till nationellt decimaltecken
                            '*************************************************************

                            field(7) = Replace(field(7), ".", LocSep)
                            lblSpeed.Text = "Speed: " & _
                               (Convert.ToDouble(field(7)) * 1.852).ToString & " km/h"
                        End If
                    End If
            End Select
        Catch ex As Exception
            MsgBox("An error has occurred in processGPSData. ")
        End Try
    End Sub

    '---Disconnect menu item---
    Private Sub MenuItem3_Click( _
       ByVal sender As System.Object, _
       ByVal e As System.EventArgs) _
       Handles MenuItem3.Click
        serialPort.Close()
        MenuItem1.Enabled = True  '---Connect GPS---
        MenuItem3.Enabled = False '---Disconnect---
    End Sub

    '---Server IP menu item---
    Private Sub MenuItem4_Click( _
       ByVal sender As System.Object, _
       ByVal e As System.EventArgs) _
       Handles MenuItem4.Click
        ServerIP = InputBox("Please enter the IP address of server", "Server IP")
    End Sub

    '---ID menu item---
    Private Sub MenuItem5_Click( _
       ByVal sender As System.Object, _
       ByVal e As System.EventArgs) _
       Handles MenuItem5.Click
        ID = InputBox("Please enter your ID", "ID", "1")
    End Sub

    Private Sub Form1_Load( _
       ByVal sender As System.Object, _
       ByVal e As System.EventArgs) _
       Handles MyBase.Load

        'Tar reda på vilket tecken som används som decimaltecken
        LocSep = Mid(1 / 2, 2, 1)

        MenuItem3.Enabled = False
    End Sub

    Private Sub MenuItem2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem2.Click

    End Sub
End Class





Nedanstående kod finns i Sync.vb
Den sköter om synkningen mellan PDA och serverprogrammet


Imports System.Net
Imports System.Net.Sockets

Public Class Sync
    Const portNo As Integer = 3456
    Dim client As Socket

    Public Sub PerformSync( _
       ByVal HostIP As String, _
       ByVal txtData As String)


        Dim RemoteAdd As System.Net.IPAddress = _
           System.Net.IPAddress.Parse(HostIP)
        Dim endPoint As New IPEndPoint(RemoteAdd, portNo)

        Try
            client = New Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp)
            client.Connect(endPoint)
        
            '---send a message to the server
            Dim data As Byte() = _
            System.Text.Encoding.ASCII.GetBytes(txtData)

            '---send the text---
            client.Send(data)
            client.Close()
        Catch
            MsgBox("Kanske inte förbindelse. Kolla att PDA inte är i Flight mode etc...")
        End Try
    End Sub

End Class


Svara

Sv:Kommunicera med GPS-enheten på mobiltfn.

Postades av 2007-08-07 23:23:22 - Patrik Löwendahl

tack.

en annan 3300 fråga, har ni problem med att få kontakt med satelliterna inomhus?


Svara

Sv: Kommunicera med GPS-enheten på mobiltfn.

Postades av 2007-08-07 23:39:39 - Christer Ehrenström

Hej Patrik
Rent generellt gäller att för att få en position krävs fri sikt uppåt, dvs inga tak. T.o.m tät skog kan hindra.

Senare tiders GPS-mottagare med Sirf III-chip är betydligt "kraftfullare" och klarar positioneringen inomhus åxå. Jag har själv ingen egen erfarenhet av detta med en kollega till mig säger sig sitta inne i sitt radhus och få utmärkt positionering.

Vad gäller annan info från satelliterna, exempelvis riktning till dem och deras höjd över horisonten osv så kan det fungera även inomhus.


Svara

Sv: Kommunicera med GPS-enheten på mobiltfn.

Postades av 2007-08-08 08:54:14 - Johannes Strömberg

Det tar längre tid att få synk, men annars så är det inga problem. Sen att den inte får kontakt med samtliga sateliter är väl inte så konstigt.

//Johannes


Svara

Sv:Kommunicera med GPS-enheten på mobiltfn.

Postades av 2007-08-08 09:11:55 - Johannes Strömberg

Halloj.

Testade denna, funkar tyvärr inte på P3300.

Detta är nog dock, efter lite rotande på nätet, så att det aldrig kommer en punkt där DataReceived triggas eftersom den kontinuerligt pumpar data på COM-porten.

Däremot så funkar GpsSample-koden i WM6 SDK:n lysande, enda problemet där är att jag inte kan använda den riktigt eftersom jag inte pratar C# utan endast VB.NET :(

Så nu går jag nog snart ut i skjulet och hamrar sönder telefonen i ren ilska.

//Johannes


Svara

Sv: Kommunicera med GPS-enheten på mobiltfn.

Postades av 2007-08-08 10:19:42 - Johannes Strömberg

Nu har jag kommit en bit på att översätta från C# till VB.NET

Dock så har jag tokfastnat på två rader. Undrar om någon här vet hur man kan göra om eländet till VB.NET

<code>
gps.DeviceStateChanged += new DeviceStateChangedEventHandler(gps_DeviceStateChanged);
gps.LocationChanged += new LocationChangedEventHandler(gps_LocationChanged);
</code>

Jag tänkte mig något i stil med:
<code>
Gps.DeviceStateChanged += New DeviceStateChangedEventHandler(AddressOf gps_DeviceStateChanged)
Gps.LocationChanged += New LocationChangedEventHandler(AddressOf gps_LocationChanged)
</code>

Men det tänkte inte VS2005.

//Johannes


Svara

Sv: Kommunicera med GPS-enheten på mobiltfn.

Postades av 2007-08-08 10:35:41 - Patrik Löwendahl

Kör du WM6 på din 3300 eller funkade det ändå?


Svara

Sv:Kommunicera med GPS-enheten på mobiltfn.

Postades av 2007-08-08 11:44:10 - Thomas Vanhaniemi

Något i stil med...
<code>
AddHandler Gps.DeviceStateChanged, AddressOf gps_DeviceStateChanged
AddHandler Gps.LocationChanged, AddressOf gps_LocationChanged
</code>


Svara

Sv:Kommunicera med GPS-enheten på mobiltfn.

Postades av 2007-08-08 12:40:19 - Johannes Strömberg

Det funkade ändå.

Det är mer eller mindre exakt samma sak som i WM5 SDK:n

//Johannes


Svara

Sv: Kommunicera med GPS-enheten på mobiltfn.

Postades av 2007-08-09 10:22:34 - Johannes Strömberg

Aha. Tack. :)

Nu har jag försökt med steg 2 i den här lilla mojängen.
Den skall rapportera tillbaks till en server var 20:e sekund.
Servern ligger på webben så vad jag gjorde var att stoppa in
en webbrowser kontroll och peka den mot

http://www.doman.com/trace/posupd.aspx?lat=LATITUD&lon=LONGITUD&spd=HASTIGHET&hea=RIKTNING

Då ville jag dessutom bara ha ut positioneringsuppgifterna var 20:e sekund
också. Men det fick jag tydligen inte. Jag använder fortfarande WM6 SDK:n
och öppnar GPS:en. Allt blinkar som det ska, sen var 20:e sekund så anropar jag

t ex: position.Latitude

Men får inte ett jota tillbaks.

Någon som vet varför?

//Johannes


Svara

Sv:Kommunicera med GPS-enheten på mobiltfn.

Postades av 2007-08-09 14:18:52 - Johannes Strömberg

Nu är jag ALLDELES för trött igen.

Måste ju anropa gps.Getposition() först..


//Johannes


Svara

Nyligen

  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo
  • 14:25 Tips på verktyg för att skapa QR-k
  • 14:23 Tips på verktyg för att skapa QR-k
  • 20:52 Fungerer innskuddsbonuser egentlig

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 169
27 953
271 705
720
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies