Announcement

Collapse
No announcement yet.

GPRS-Anbindung

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • GPRS-Anbindung

    Hallo,

    ich habe zwar immer mal wieder kleinere "Sachen" in VBA programmiert, jedoch gar keine Kenntnisse in der Entwicklung von Anwendungen für PocketPCs...

    Zu meinem Anliegen:
    Ich habe einen ASUS A696 (W-LAN, Bluetooth) mit Windows Mobile 6 und TomTom 6, bzw. Destinator 6 als Navigationsprogramm...
    Ich würde jetzt gerne eine Anwendung haben, mit der ich auf "Buttondruck" die aktuelle Position mit einem Statuszusatz (da reicht eine Ziffer) an den heimischen PC übermitteln würde, wo die Position in geeigneter Weise (z.B. in Google-Maps) angezeigt wird...
    Umgekehrt möchte ich gerne Zielkoordinaten vom heimischen PC an den Pocket PC übertragen, wo diese in eine geeignete Navigationsoftware (TomTom6 soll da eine "Schnittstelle" haben) eingebunden wird...

    Ich bin mir sicher das dies funktionieren kann...
    Nur wie ?

    Ich habe da nicht die geringste Ahnung von...
    Wer hat einen entsprechenden Quellcode oder könnte mir diesen schreiben?
    (...und welches Tool nutze ich zum Testen und Erstellen der Anwendung ?? Microsoft Visual Basic 2008 Express Edition ?)

    Hülfe!
    Und schon mal vorab vielen Dank für die Antworten...
    Frank
    ASUS A696 mit WM 6
    MS VisualStudio 2005 (bevorzugt mit VB)

  • #2
    Hallo,
    als Entwicklungsumgebung kann ich nur Visual Studio 2005 empfehlen.
    Die Aufgabenstellung lässt sich ansonsten vielfältig angehen. Und müsste demnach noch spezifiziert werden. Ein Quellcode in vb.net, der die aktuelle GPS Position irgendwohin sendet ist schnell geschrieben, aber wie soll die Applikation Deinen Heim PC finden. Welche Applikation auf dem Heim PC nimmt die Daten entgegen? oder soll lieber der Umweg über eine (z.B. mysql) Datenbank und einem Webserver genommen werden? Und der Weg zurück? Der PPC hat zwar eine IP, aber wenn man z.B. mit einer t-mobile Karte einen PPC direkt ansprechen will, muss man den Zugriffspunkt umschreiben, da die seit ein oder zwei Jahren einen Proxy zwischenschalten um Traffic durch pings zu verhindern. Oder soll der PPC in Intervallen auch eine Brückenseite abfragen?

    Für TOMTOM gibt es im übrigen ein ausgezeichnetes SDK um Koordinaten zu übergeben, wenn man also - auf welchem Weg auch immer - Koordinaten vom Heimpc an den PPC übermittelt hat, kann man diese in TomTom ausgezeichnet verwenden.

    Comment


    • #3
      Lösungsansatz?

      Hallo TimP,
      mein PC ist hier über eine FritzBox! und DynDNS (über selfhost.de) dauerhaft mit dem Internet verbunden.
      Vom Prinzip komme ich da von überall und zu jeder Zeit via FTP auf einen Allnet "Server"...

      Die Applikation auf dem HeimPC fehlt natürlich auch noch...
      Ich dachte da an eine ausführbare Datei, die einfach nur regelmäßg (z.B. Minutentakt) eine bestimmte Datei vom "Server" abfragt und bei einer Aktualisierung dieser Datei den Inhalt (also Status und Position) anzeigt (die Position am Besten direkt in Google Maps per Direktlink).

      Der Weg zurück??
      Tja, da habe ich leider gar keine Idee...
      So wie der HeimPC?
      Also eine (andere) Datei auf dem "Server" abfragen?

      Für TOMTOM gibt es im übrigen ein ausgezeichnetes SDK um Koordinaten zu übergeben...
      Das klingt ja schon mal supi!

      Viele Grüße
      Frank
      ASUS A696 mit WM 6
      MS VisualStudio 2005 (bevorzugt mit VB)

      Comment


      • #4
        OK, ich kann nur in vb.net denken, aber da würde ich folgendes machen:
        Für den PC:
        -Ein Formular mit einem Webbrowse Control erstellen
        -Beim laden des Formulares einen Thread starten der die Koordinaten ausliest
        -Wenn sich die Koordinatenim Webbrowse Control ändern , Google Maps direkt mit den Koordinaten aufrufen.
        -Gleichzeitig für das Webbrowse Control eine navigated Event erstellen
        -Beim navigieren innerhalb des Elements die URL parsen (nach koordinaten durchsuchen
        -Wenn sich da koordinaten finden lassen diese per Knopfdurck in eine zweite Datei speichern.

        Das bedeutet bis hierher:
        Mann hat ein Programm auf dem Rechner das die Koordinaten des mobilen Endgerätes abfragt, direkt sichtbar in Google maps anzeigt und wenn man die Position in Google maps manuell ändert, kann man die gewählte position direkt an das mobile Endgerät übertragen.

        Auf dem mobilen Endgerät:
        Hier wird es etwas schwieriger, es gibt leider so viele verschiedene Endgeräte und nicht alle können das Gleiche.
        So wäre es z.B. mit einem externen GPS Gerät das an einen definierten Port gekoppelt ist unmöglich gleichzeitig zu navigieren und die eigene Position zu versenden, währen bei Geräten mit eingebautem GPS Modul zumeist eine WM Verwaltung auf einen virtuellen Port existiert, die mehreren Anwendungen gleichzeitig den Zugriff auf die GPS Daten erlaubt. Das ist aber noch recht verbuggt und verlangsamt ggf das gesamte Gerät extrem.
        Idealerweise würde ich für die Nutzung eines solchen Programmes Devices vorschreiben, die das gleichzeitig können, denn nbur so kann man vom PC eine Anweisung zum navigieren geben und dann zeitgleich verfolgen ob das mobile gerät auch losfährt.
        Nun also einen Thread starten der immer die aktuelle Position ausliest und an den server sendet und zeitgleich immer auslesen, ob eine Anweisung zum navigieren vorliegt. Wird eine Anweisung gefunden, nachfragen ob die navigation gestartet werden soll.

        Wenn Der Zielpc wie in Deinem Fall statisch am Netz hängt, kann man die GPS Position auch direkt an den PC an einen beliebigen Port senden. Die Application auf dem Rechner würde diesen Port dann öffnen und man schreibt anstelle des Intervalls zum auslesen der Datei einfach ein Event auf den Port. wenn Daten vom gerät gesendet werden erkennt das Programm dann ohne Verzögerung das Eintreffen einer neuen Position und kann die google maps Anzeige aktualisieren.

        Comment


        • #5
          Hallo,

          Für den PC:
          -Ein Formular mit einem Webbrowse Control erstellen
          OK...
          -Beim laden des Formulares einen Thread starten der die Koordinaten ausliest
          -Wenn sich die Koordinatenim Webbrowse Control ändern , Google Maps direkt mit den Koordinaten aufrufen.
          -Gleichzeitig für das Webbrowse Control eine navigated Event erstellen
          -Beim navigieren innerhalb des Elements die URL parsen (nach koordinaten durchsuchen
          -Wenn sich da koordinaten finden lassen diese per Knopfdurck in eine zweite Datei speichern.

          Das bedeutet bis hierher:
          Mann hat ein Programm auf dem Rechner das die Koordinaten des mobilen Endgerätes abfragt, direkt sichtbar in Google maps anzeigt und wenn man die Position in Google maps manuell ändert, kann man die gewählte position direkt an das mobile Endgerät übertragen.
          Ja, genau...
          So dachte ich mir das!

          Auf dem mobilen Endgerät:
          Hier wird es etwas schwieriger [...]
          So wäre es z.B. mit einem externen GPS Gerät das an einen definierten Port gekoppelt ist unmöglich gleichzeitig zu navigieren und die eigene Position zu versenden, währen bei Geräten mit eingebautem GPS Modul zumeist eine WM Verwaltung auf einen virtuellen Port existiert, die mehreren Anwendungen gleichzeitig den Zugriff auf die GPS Daten erlaubt. Das ist aber noch recht verbuggt und verlangsamt ggf das gesamte Gerät extrem.
          Ähhh...
          Also, es handelt sich um einen ASUS A696 mit eingebautem GPS...

          Idealerweise würde ich für die Nutzung eines solchen Programmes Devices vorschreiben, die das gleichzeitig können, denn nbur so kann man vom PC eine Anweisung zum navigieren geben und dann zeitgleich verfolgen ob das mobile gerät auch losfährt.
          mhmm...
          (So langsam oute ich mich hier ja total...)
          Nun also einen Thread starten der immer die aktuelle Position ausliest und an den server sendet und zeitgleich immer auslesen, ob eine Anweisung zum navigieren vorliegt. Wird eine Anweisung gefunden, nachfragen ob die navigation gestartet werden soll.
          Jo, so ungefähr dachte ich mir das...
          Nur das es eigentlich nicht notwendig ist immer die Position zum PC zu übertragen, sondern nur auf Anfrage.
          Wichtiger ist, das ein Status (frei/erreichbar/nicht stören oder so) mit der Position übermittelt wird!

          Wenn Der Zielpc wie in Deinem Fall statisch am Netz hängt, kann man die GPS Position auch direkt an den PC an einen beliebigen Port senden. Die Application auf dem Rechner würde diesen Port dann öffnen und man schreibt anstelle des Intervalls zum auslesen der Datei einfach ein Event auf den Port. wenn Daten vom gerät gesendet werden erkennt das Programm dann ohne Verzögerung das Eintreffen einer neuen Position und kann die google maps Anzeige aktualisieren.
          Klingt noch besser...
          Und umgekehrt?

          Und zu guter Letzt:
          Wer kann mir das alles schreiben?
          Meine begrenzten Fähigkeiten scheint das doch deutlich zu übersteigen...
          Vielleicht würden ja auch diverse Vorlagen (Quellcode) reichen...

          VG
          Frank
          ASUS A696 mit WM 6
          MS VisualStudio 2005 (bevorzugt mit VB)

          Comment


          • #6
            Angefangene Arbeit

            Hallo,

            lang ist's her und ich habe mich mal an die Arbeit gemacht...
            Auf dem PC läuft erstmal gar nichts.
            Ich hatte massive Probleme mit dem Übertragen von Daten vom PPC weg und habe das jetzt mit "Net.WebRequest" gelöst, wobei ich vom Prinzip her Formulardaten übertrage...
            Code:
                    Try
                        Dim WebAdress As New Uri(str_FileName)
                        Dim myWebRequest As Net.WebRequest = Net.WebRequest.Create(WebAdress)
                        myWebRequest.Method = "POST"
                        ' Create a new string object to POST data to the Url.
                        Dim postData As String = "Kennung" & ChrW(61) & Kennung & ChrW(38) + _
                                                    "Grund" & ChrW(61) & Grund & ChrW(38) + _
                                                    "Inhalt" & ChrW(61) & Nachricht & ChrW(38) & _
                                                    "Laengengrad" & ChrW(61) & Länge & ChrW(38) & _
                                                    "Breitengrad" & ChrW(61) & Breite & ChrW(38) & _
                                                    Grund + ChrW(61) + "Von " & Kennung & " um " & Zeit & " versendet."
                        Dim byte1 As Byte() = encoding.GetBytes(postData)
                        ' Set the content type of the data being posted.
                        myWebRequest.ContentType = "text/css"
                        ' Set the content length of the string being posted.
                        myWebRequest.ContentLength = byte1.Length
                        Dim newStream As IO.Stream = myWebRequest.GetRequestStream
                        newStream.Write(byte1, 0, byte1.Length)
                        newStream.Close()
                    Catch ex As Exception
                        Senden = "Fehler bei Datenübertragung!"
                        Exit Function
                    End Try
            Also habe ich auf den Server ein Perlskript zum verarbeiten gelegt, dass (bislang) eine HTML-Seite generiert, auf der die gewünschten Informationen drinstehen.
            Mit der "Serverlösung" halte ich auch für eine gute Sache, da so die Daten von jedem beliebigen Rechner via Internetbrowser abgefragt werden können.
            Ein nächster Schritt wäre eine Internetseite, die aufbereitete Daten aus einer "Perlskript" generierten XML ausliest und über ein Google-API verarbeitet und anzeigt...

            So weit so gut...

            Ich habe jetzt nur ein massives Problem damit, dass der PPC Daten vom Server Abfragen/Auslesen kann.
            Viele nette Net-Klassen oder Objekte (oder wie das heißt) stehen unter Compact Framework nicht zur Verfügung... Genau genommen nur WebRequest, WebResponse und das ganze nochmal mit HTTP...
            Ich sehe da zwei Optionen, habe aber leider gar keine Ahnung wie die umzusetzen sind...
            1.) Der PPC spricht ein Perl-Skript an, dass direkt eine Antwort zurückschickt...
            2.) Der PPC fragt regelmäßig eine Serverseite (html oder txt oder so) ab, um Informationen dort herauszulesen...

            Und dann noch etwas:
            Zur Zeit habe ich die Portabfragen in einer Timerschleife untergebracht...
            Ich weiß, doof, weil hängt...
            Ich kenne mich aber gar nicht mit Threads aus!
            Habe jetzt mal versucht einen Hintergrundthread einzurichten:
            Code:
            Dim GPSThread As New Threading.Thread(AddressOf ThreadObject.GPSThread)
            Im "MyBase.Load" habe ich dann den
            Code:
            GPSThread.Start()
            ...
            Aber wie kriege ich da "Rückgabewerte" zurück...
            Der Thread soll ja als Endlosschleife laufen und immer die aktuellsten Positionsdaten enthalten, nur wie kriege ich die da Raus?

            Hätte da nochmal jemand einen Tipp?
            Ich bin programmiertechnischer Vollrentner und kenne mich mit diesen "modernen" Programmiertechniken mit Klassen und Objekten nicht wirklich aus...

            Vielen Dank
            Frank
            ASUS A696 mit WM 6
            MS VisualStudio 2005 (bevorzugt mit VB)

            Comment


            • #7
              Das Abholen von Daten ist einfach, eine webrequest hat auch immer eine Webresponse. Kurzer Beispielcode um den Inhalt einer textdatei im netz in eine String Variable zu kriegen:
              Code:
              Dim sendRequest As Net.WebRequest
              Dim sendResponse As Net.WebResponse
              Dim url as string = "http://www.server.de/textdatei.txt"Dim str_r As System.IO.StreamReader
              Dim result As String = ""
              
              sendRequest = System.Net.HttpWebRequest.Create(url)
              sendRequest.Method = "GET"
              sendRequest.Timeout = 30000
              sendResponse = sendRequest.GetResponse
              
              str_r = New System.IO.StreamReader(sendResponse.GetResponseStream(), System.Text.Encoding.UTF7)
              result = str_r.ReadToEnd
              str_r.Close()
              sendResponse.Close()
              sendResponse = Nothing
              sendRequest = Nothing
              das ganze sollte natürlich noch eine Fehlerbehandlung kriegen, im Einfachsten Fall einen Try catch mit ex as system.net.webexception.
              Etwas (aber nicht viel) komplizierter wird es, wenn die Request noch ein Login durchführen muss, oder ssl warnung unterdrückt werden sollen.

              Das mit dem threading ist auch kein grosses Geheimnis, Du schreibst einfach eine sub mit einer Endlosschleife gibst diese sub als address of bei der dimensionierung des thread an und startest den dann:

              Code:
              Dim mythread As New System.Threading.Thread(AddressOf control_thread)
              Dim threading as boolean = true
              dann irgendwo:
              Code:
              mythread.start
              und nicht die Sub vergessen:
              Code:
              Public Sub control_thread()
                      On Error Resume Next
                      While Threading
                          System.Threading.Thread.Sleep(900)
                          If Not Threading Then Exit Sub
                          Application.DoEvents()
                          'Do some stuff
                      End While
              Auch hier wird es wieder etwas komplizierter, wenn der Thread auf cont´rols zugreifen soll, dafür brauchst Du dann eine weitere sub die über invoke aufgerufen wird:
              Deklaration:
              Code:
              Public Delegate Sub myDelegate()
              aufruf aus den Thread:
              Code:
              Me.Invoke(New myDelegate(AddressOf control_all))
              und die sub mit Zugriffsrechten:
              Code:
              Public Sub control_all()
              'diese sub kann auf das Formular zugreifen
              End sub

              Comment


              • #8
                Hi Tim,

                ist das mit dem

                sendRequest = System.Net.HttpWebRequest.Create(url)

                sinniger als

                sendRequest = System.Net.WebRequest.Create(url)

                ???
                Ich habe es mit der zweiten Variante versucht...
                Und wo liegt da der Unterschied?
                Ich hatte es versucht mit:

                Dim newChkStream As IO.Stream = webResp.GetResponseStream

                Aber da kann ich ja wohl nur byteweise auslesen...

                Testen kann ich es jedoch leider erst so in 1 bis 2 Stunden...
                Ich kriege meinen Emulator nicht dazu auf's Web zuzugreifen...

                Zum Thema Thread:
                Dim threading as boolean = true
                Ist das notwendig, und wenn ja, wofür?
                Gleiche Frage für die "while Threading" - Schleife im Unterschied zu einer "Do ... Loop" und das "Application.doEvents"...

                Aber bereits jetzt tausendfachen Dank...
                VG
                Frank
                ASUS A696 mit WM 6
                MS VisualStudio 2005 (bevorzugt mit VB)

                Comment


                • #9
                  Dann viel Spaß beim testen
                  ob webrequest oder httpweb ist egal so weit ich weiss...

                  Dim threading as boolean = true
                  ist eine globale variable die im thread wieder bei while Threading benutzt wird.
                  Zu Deiner Frage, nein es ist nicht notwendig, die globale variable bietet aber die Möglichkeit den thread anzuhalten. wenn Du ne Endlosschleife ohne application doevents, ohne system.threading.thread.sleep() und ohne eine variable um die Schleife zu stoppen machst, dann wird Dein Arbeitsspeicher abgesaugt und beim beenden des threads wirst Du auf nem MDA probleme kriegen.
                  Der geplante abluf beim schliessen des Programmes ist dann:

                  mythread.Abort()
                  Threading = False

                  erst durch das Threading = False unterbricht der Thread dann seine Endlosschleife. Das Threading mittlerweile überhaupt false ist merkt er duch application.doevents und mythread.abort kann ausgeführt werden.
                  Ich finde das auch etwas unglücklich, dan unzähligen Problemen mit Multithreading auf dem MDA bin ich allerdings zu dem Schluss gekommen, das diese wenig elegante Vorgehensweise in vb.net notwendig ist

                  Comment


                  • #10
                    Ah ja, OK...
                    So weit so klar...

                    Ich hätte jetzt gedacht mit dem "myThread.Abort()" sei es getan, aber gut...
                    Den Thread anhalten (z.B. wenn über ein Formular Einstellungen geändert werden, auf die der Thread zurückgreifen soll), ginge ja wohl genauso und anschließend den Thread neu starten...

                    Der Thread soll jedoch nicht auf irgendwelche Formulare oder deren Inhalt zurückgreifen (lediglich auf die Registrierung), sondern verschiedene Werte (Längen- und Breitengrad als Minimum...) auslesen und "zwischenspeichern".
                    Auf diese Werte/Variablen des Threads wollte ich dann von extern (also dem eigentlichen Hauptprogramm) zurückgreifen, bzw. diese mit dem aktuellen Inhalt auslesen...
                    Oder kann ich die entsprechenden Variablen einfach global definieren?
                    Und wenn ja, wo? In der "Thread-Klasse", in einem Modul, der Hauptform oder wo?

                    VG
                    Frank
                    ASUS A696 mit WM 6
                    MS VisualStudio 2005 (bevorzugt mit VB)

                    Comment


                    • #11
                      ja, der Thread kann auf globale Variablen zugreifen, ich dimensioniere die immer in einer eigenen Klasse (public class globals oder so). Das hat den vorteil das ich beim Programmieren mit gliobals. eine Liste der zur verfügung stehenden globalen variablen angezeigt bekomme
                      Edit:
                      Innerhalb der Klasse empfiehlt es sich bei großen Programmen noch structures unterzubringen, dann greife ich auf meine globalen variabölen mit globals.gps oder global.web, ..., globals.controls, usw. zu. Sehr übersichtlich.

                      Comment


                      • #12
                        Threading...

                        Hallo,

                        ich habe das jetzt mal mit dem Thread probiert und...
                        Gngngn!

                        Im Moment macht die Anwendung gar nichts mehr!
                        Habe es (ungefähr) so probiert:
                        Code:
                        Public Sub control_thread()
                                On Error Resume Next
                                While Threading
                                    If Not Threading Then Exit Sub
                                    Application.DoEvents()
                                    'Do some stuff z.B. port.readline() ... port.writeline()...
                                End While
                        Trotz port timeouts von 50 hängt die Anwendung...
                        Zu viele Portzugriffe?
                        Hätte ich das "System.Threading.Thread.Sleep(900)" unbedingt drin lassen sollen?
                        Ich wollte die ausgelesenen GPS-Daten eigentlich sehr engmaschig "durchschleifen" um diese mit einem Navigationsprogramm nutzen zu können...
                        (Habe zwar das entsprechende TomTom SDK, kriege es jedoch nicht in die Anwendung eingebunden! Ist eine ".lib" die ich laut Doku einfach "linken" soll... Nur wie? Und wie nutze ich das C# SDK in VB.Net ? Der TomTom-Support ist da sehr schweigsam... )

                        Oder hätte ich doch die "Public Delegate Sub myDelegate()" einbauen sollen, da die Ports im Hauptformular eingebunden sind?

                        VG
                        Frank
                        ASUS A696 mit WM 6
                        MS VisualStudio 2005 (bevorzugt mit VB)

                        Comment


                        • #13
                          Thread

                          Hallo,

                          ich habe immer noch Probleme mit dem Thread...
                          Ich denke das Problem liegt tatsächlich darin, dass ich versuche aus dem Thread heraus auf die Ports zuzugreifen, die ich jedoch in das Hauptformular eingebunden hatte.
                          Das mit dem "invoke" funktioniert nicht:
                          Fehler 1 "invoke" ist kein Member von "ARBO_Statusgeber_WM5.clThread".
                          Komisch, oder?

                          VG
                          Frank
                          ASUS A696 mit WM 6
                          MS VisualStudio 2005 (bevorzugt mit VB)

                          Comment


                          • #14
                            Sorry, bin etwas in Eile und zwischen zwei Urlauben, aber kurz geantwortet:
                            Um einen Post auszulesen würde ich nicht einen Thread erstellen, sondern das Event abfangen.Einfaches Fallbeispiel:
                            Code:
                            Dim readeddata as string = ""
                             Friend WithEvents serial As New System.IO.Ports.SerialPort("COM6", 115200, IO.Ports.Parity.None, 8, IO.Ports.StopBits.One)
                            Public Delegate Sub myDelegate()
                            
                                Public Sub serial_getdata(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles serial.DataReceived
                                    readeddata += serial.ReadExisting
                                    Me.Invoke(New myDelegate(AddressOf settext))
                                End Sub
                                Private Sub settext()
                                    TextBox.Text = readeddata
                                End Sub

                            Comment


                            • #15
                              Hallo Tim,

                              das mit dem "invoke" funktioniert nicht ("kein Member")!
                              Und da es sich um GPS-Daten handelt würde ich ja hier eine Endlosschleife haben, da dauernd Daten empfangen werden!
                              => kein Gewinn...

                              Ich schätze es wäre einfacher die Ports im Thread selber zu deklarieren, da ja nur der thread darauf zugreift...
                              Nur wie kriege ich die da rein??

                              Naja, schaun mer ma...
                              VG
                              Frank
                              ASUS A696 mit WM 6
                              MS VisualStudio 2005 (bevorzugt mit VB)

                              Comment

                              Working...
                              X