Fernsteuerung per WLAN

Anfängerfragen zum Programmieren mit PureBasic.
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: Fernsteuerung per WLAN

Beitrag von Derren »

Du hast keinen Server erstellt. Du verbindest dich mit dem Server auf der Drohne. Dass das überhaupt funktioniert wundert mich ehrlich gesagt.
CreateNetworkServer() brauchst du. Die Drohne schickt dir dann die Daten zu diesem Server.
Signatur und so
derschutzhund
Beiträge: 328
Registriert: 06.06.2013 20:37
Computerausstattung: Satellite A210-19Z, Samsung Netbook N130, VPAD10

Re: Fernsteuerung per WLAN

Beitrag von derschutzhund »

Derren hat geschrieben:Du hast keinen Server erstellt. Du verbindest dich mit dem Server auf der Drohne. Dass das überhaupt funktioniert wundert mich ehrlich gesagt.
CreateNetworkServer() brauchst du. Die Drohne schickt dir dann die Daten zu diesem Server.
Ok, also für mein Verständnis:
Bei den Netzwerken die ich kenne, gibt es einen Server und viele Clients.
Ich bin davon ausgegangen, dass der Server die Drone ist. Praktisch könnte das so sein, weil da im Grunde die Rechenleistung eines PC drin steckt und weil das Senden der Befehle mit OpenNetworkConnection funktioniert.
Die Drone könnte also der Server sein oder?
Kann es auch so sein, dass man für jeden Kanal 5554, 5555, 5556, 5559 entweder einen Server oder einen Client erstellen muss. Woher weiß man dann aber was man braucht?
Satellite A210-19Z, Samsung N130, VPAD10, WinXP, Win7, PuppyLinux, PB 5.24, 5.31. 5.70
Elektronik, Mikrocontroller, CNC-Technik, 3D-Druck
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Fernsteuerung per WLAN

Beitrag von ts-soft »

Bei Netzwerken, die ich kenne, gibt es viele Server (Hosts), sowie viele Server (Dienste) und noch mehr Clients :wink:

Der Server ist der Ansprechpartner Deiner Drohne, der Client spricht den Server auf der Drohne an.
Es werden also 3 Server auf Deinem PC erwartet, wenn Du alle Nachrichten benötigst. Sollte aber alles in dieser
PDF stehen, die ich nicht gelesen habe.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
derschutzhund
Beiträge: 328
Registriert: 06.06.2013 20:37
Computerausstattung: Satellite A210-19Z, Samsung Netbook N130, VPAD10

Re: Fernsteuerung per WLAN

Beitrag von derschutzhund »

ts-soft hat geschrieben:Bei Netzwerken, die ich kenne, gibt es viele Server (Hosts), sowie viele Server (Dienste) und noch mehr Clients :wink:

Der Server ist der Ansprechpartner Deiner Drohne, der Client spricht den Server auf der Drohne an.
Es werden also 3 Server auf Deinem PC erwartet, wenn Du alle Nachrichten benötigst. Sollte aber alles in dieser
PDF stehen, die ich nicht gelesen habe.
Ich finde das wirklich toll, dass du so viel weißt, sogar ohne die Doku gelesen zu haben.
Ist wirklich genial! Find ich absolut super! :mrgreen:
Satellite A210-19Z, Samsung N130, VPAD10, WinXP, Win7, PuppyLinux, PB 5.24, 5.31. 5.70
Elektronik, Mikrocontroller, CNC-Technik, 3D-Druck
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Fernsteuerung per WLAN

Beitrag von ts-soft »

Warum soll ich die Doku lesen, wenn ich die nötige Hardware nicht habe?
Der Rest sind Grundlagen. Ohne diese wird das wohl sehr langwierig, wenn überhaupt :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Fernsteuerung per WLAN

Beitrag von edel »

Laut Doku verbindet sich deine Software nur als Client zu deinem Modell. Du musst also 2 Verbindungen aufbauen (OpenNetworkConnection), was du ja auch schon getan hast. Warum du allerdings keine Nachrichten empfaengst, kann ich dir nicht sagen.
- chris -
Beiträge: 195
Registriert: 24.08.2005 19:52
Wohnort: Stadtallendorf

Re: Fernsteuerung per WLAN

Beitrag von - chris - »

So funktioniert das, schon mal bei mir:

Die Drone ist der Server mit der IP 192.168.1.1

Code: Alles auswählen


EnableExplicit

#DQ = Chr(34)

Define *buffer, ARc.i, ARn.i, command$
Define t1.i, t2.i, CEvent.i, recData.i, *recBuffer, n.i
Define header.l, state.l, seq_nr.l, vision.l, id1.w, size1.w, id2.w, size2.w
Define ctrl_s.l, vbat_p.l, theta.f, phi.f, psi.f, altitude.l, vx.f, vy.f, vz.f

If InitNetwork() = 0
  End
EndIf

*buffer = AllocateMemory(1024)
If *buffer = 0
  End
EndIf

*recBuffer = AllocateMemory(1024)
If *recBuffer = 0
  End
EndIf

ARc = OpenNetworkConnection("192.168.1.1", 5556, #PB_Network_UDP)

If Arc

  ARn = OpenNetworkConnection("192.168.1.1", 5554, #PB_Network_UDP)

  If ARn

    ;Send one packet to NAVDATA_PORT
    PokeA(*buffer + 0, 1)
    PokeA(*buffer + 1, 0)
    PokeA(*buffer + 2, 0)
    PokeA(*buffer + 3, 0)

    SendNetworkData(ARn, *buffer, 4)

    t1 = ElapsedMilliseconds()

    Repeat

      CEvent = NetworkClientEvent(ARn)

      If CEvent = #PB_NetworkEvent_Data
        recData = ReceiveNetworkData(ARn, *recBuffer, 1024)
        Debug "recData: " + Str(recData)
        Break
      EndIf

      t2 = ElapsedMilliseconds()

      If (t2 - t1) >= 5000
        Debug "Break"
        Break
      EndIf

      Delay(1)

    ForEver

    If recData > 0

      If recData = 24

        header = PeekL(*recBuffer + 0)
        state  = PeekL(*recBuffer + 4)
        seq_nr = PeekL(*recBuffer + 8)
        vision = PeekL(*recBuffer + 12)

        Debug "header: " + Hex(header)
        Debug "state: " + RSet(Bin(state), 32, "0")
        Debug "seq_nr: " + seq_nr
        Debug "vision: " + vision

        ;Check status bit mask is activated: AR_DRONE_NAVDATA_BOOTSTRAP
        If state & 1 << 10 = 1 << 10

          ;Send AT command (AT*CONFIG=1,"general:navdata_demo","TRUE")
          command$ = "AT*CONFIG=1," + #DQ + "general:navdata_demo" + #DQ + "," + #DQ + "TRUE" + #DQ + Chr(13)
          Debug command$
          PokeS(*buffer, command$, Len(command$), #PB_Ascii)
          SendNetworkData(ARc, *buffer, Len(command$))

          t1 = ElapsedMilliseconds()

          Repeat

            CEvent = NetworkClientEvent(ARn)

            If CEvent = #PB_NetworkEvent_Data
              recData = ReceiveNetworkData(ARn, *recBuffer, 1024)
              Debug "recData: " + Str(recData)
              Break
            EndIf

            t2 = ElapsedMilliseconds()

            If (t2 - t1) >= 5000
              Debug "Break"
              Break
            EndIf

            Delay(1)

          ForEver

          If recData > 0

            If recData = 24

              header = PeekL(*recBuffer + 0)
              state  = PeekL(*recBuffer + 4)
              seq_nr = PeekL(*recBuffer + 8)
              vision = PeekL(*recBuffer + 12)

              Debug "header: " + Hex(header)
              Debug "state: " + RSet(Bin(state), 32, "0")
              Debug "seq_nr: " + seq_nr
              Debug "vision: " + vision

              ;Send AT command (ACK_CONTROL_MODE)
              command$ = "AT*CTRL=2,5,0" + Chr(13)
              PokeS(*buffer, command$, Len(command$), #PB_Ascii)
              SendNetworkData(ARc, *buffer, Len(command$))

            EndIf

          EndIf

        EndIf

      ElseIf recData > 24

        header = PeekL(*recBuffer + 0)
        state  = PeekL(*recBuffer + 4)
        seq_nr = PeekL(*recBuffer + 8)
        vision = PeekL(*recBuffer + 12)

        Debug "header: " + Hex(header)
        Debug "state: " + RSet(Bin(state), 32, "0")
        Debug "seq_nr: " + seq_nr
        Debug "vision: " + vision

        id1   = PeekW(*recBuffer + 16)
        size1 = PeekW(*recBuffer + 18)
        
        Debug ""
        Debug "id1: " + Str(id1)
        Debug "size1: " + Str(size1)

        ;NAVDATA_DEMO_TAG
        If id1 = 0

          ctrl_s   = PeekL(*recBuffer + 20)
          vbat_p   = PeekL(*recBuffer + 24)
          theta    = PeekF(*recBuffer + 28)
          phi      = PeekF(*recBuffer + 32)
          psi      = PeekF(*recBuffer + 36)
          altitude = PeekL(*recBuffer + 40)
          vx       = PeekF(*recBuffer + 44)
          vy       = PeekF(*recBuffer + 48)
          vz       = PeekF(*recBuffer + 52)

          Debug "ctrl_s: " + RSet(Bin(ctrl_s), 32, "0")
          Debug "vbat_p: " + Str(vbat_p)
          Debug "theta: " + StrF(theta)
          Debug "phi: " + StrF(phi)
          Debug "psi: " + StrF(psi)
          Debug "altitude: " + Str(altitude)
          Debug "vx: " + StrF(vx)
          Debug "vy: " + StrF(vy)
          Debug "vz: " + StrF(vz)

        EndIf

        If recData > 24 + size1
          
          id2   = PeekW(*recBuffer + 16 + size1)
          size2 = PeekW(*recBuffer + 18 + size1)
          
          Debug ""
          Debug "id2: " + Str(id2)
          Debug "size2: " + Str(size2)

        EndIf

      EndIf

    EndIf

    CloseNetworkConnection(ARn)

  EndIf

  CloseNetworkConnection(ARc)

EndIf

End

PB v5.72 x86/x64
Windows 10 Pro 64bit
derschutzhund
Beiträge: 328
Registriert: 06.06.2013 20:37
Computerausstattung: Satellite A210-19Z, Samsung Netbook N130, VPAD10

Re: Fernsteuerung per WLAN

Beitrag von derschutzhund »

@Chris
So funktioniert das, schon mal bei mir:
Ich bekomme auch einen Datensatz zurück! :allright:

Was ich die letzte Zeit immer anders gemacht habe ist, dass ich die Befehle über 5554 zu senden versucht habe.
Jetzt ist klar, dass alles was vom PC an die Drone geht über 5556 läuft!

Vielen, vielen Dank für das Progrämmchen, damit kann ich jetzt erst mal weiter experimentieren!

Und das Ganze ist um so erstaunlicher als das es eigentlich garnicht gehen kann weil, ... auf dem PC wird ja kein Server definiert, obwohl der doch unbedingt auf dem PC gebraucht wird :mrgreen:
Irgendwie muss ich mir die Grundlagen doch nochmal genauer anlesen :mrgreen:

LG

Wolfgang
Satellite A210-19Z, Samsung N130, VPAD10, WinXP, Win7, PuppyLinux, PB 5.24, 5.31. 5.70
Elektronik, Mikrocontroller, CNC-Technik, 3D-Druck
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: Fernsteuerung per WLAN

Beitrag von Derren »

Sorry, hab das falsch gelesen -_- Anscheinend brauchst du tatsächlich keinen Server sondern verbindest dich nur mit der Drohne als Client.
Signatur und so
derschutzhund
Beiträge: 328
Registriert: 06.06.2013 20:37
Computerausstattung: Satellite A210-19Z, Samsung Netbook N130, VPAD10

Re: Fernsteuerung per WLAN

Beitrag von derschutzhund »

So funktioniert das, schon mal bei mir:

Die Drone ist der Server mit der IP 192.168.1.1
Hallo chris,

noch mal vielen Dank für das Beispielprogramm! :bounce:
Habe wirklich viel daraus gelernt! Nur so macht es Sinn!
Inzwischen kann ich ständig alle Daten aus der Drone auslesen und in einer einfachen, grafischen Oberfläche anzeigen.

Die Signalstärke mit der die Drone den PC empfängt habe ich bisher nicht gefunden kann ich bei den Dronenprofis aber noch mal nachfragen. Kannst du mir sagen, wie ich die WLAN-Signalstärke, die am PC angkommt, ermitteln kann?
Ideal wäre wenn ich die Signalstärke in beiden Richtungen hätte um dann gezielt die Reichweite erhöhen zu können.

Bei der Darstellung der Flugwinkel Roll, Pitch, Yaw hätte ich gerne ein kleines Flugzeug, welches sich nach den, von der Drone empfangenen Winkeln, dreht. Habe dazu in den Beispielen ein Programm gefunden, bei dem sich ein Roboter ständig dreht. Das könnte ich als Basis nehmen, da ich bisher noch nichts mit 3D in PB gemacht habe.
Weißt du, wo ich ein kleines Flugzeug als .mesh bekommen kann?

Wenn das Wetter wieder besser ist, mache ich dann den ersten Testflug!

Im nächsten Schritt muss ich dann das Video irgendwie auf den Bildschirm bekommen. Hast du dazu auch einen Tip?

LG

Wolfgang
Satellite A210-19Z, Samsung N130, VPAD10, WinXP, Win7, PuppyLinux, PB 5.24, 5.31. 5.70
Elektronik, Mikrocontroller, CNC-Technik, 3D-Druck
Antworten