C/C++ (Arduino) TCP-Client für eigene Anwendungen

Alles, was nicht in die anderen Kategorien passt.
Antworten
Nachricht
Autor
Benutzeravatar
Basti189
Beiträge: 17
Registriert: 23.03.2016 14:46:27
Aktuelle Projekte: Java Zusi3Schnittstelle
Arduino zusi3Schnittstelle
PhilipsHue Schnittstelle
ZusiLightControl
Wohnort: Kassel

C/C++ (Arduino) TCP-Client für eigene Anwendungen

#1 Beitrag von Basti189 »

Hallo zusammen,

ein ähnliches Thema, aber eher an die Arduino/ESP8266 Freunde gedacht.
Ich habe schon öfters gelesen, dass viele Arduinos nutzen für ihre Führertische und dort immer mit extra PCs gearbeitet werden, die dann Serial wieder dem Arduino mittteilen was er zu machen hat etc...
Für mich irgendwie doof und so habe ich mir gedacht, nehme ich meine in Java geschriebene Schnittstelle für Zusi und portieren sie einfach Mal auf den Arduino, oder in meinem Fall dem ESP8266, da dieser schon WLAN von Haus aus hat :)
Gesagt getan, läuft. Man ist in auch mit IoT Geräten unabhängig und kann den Mikrocontroller selbständig seine Aufgaben machen lassen. Bis jetzt kann die Bibliothek nur die Verbindung aufbauen und von Zusi die Version Auslesen etc, aber ich habe auch gestern erst damit angefangen. Die Bibliothek ist so aufgebaut, dass sie mit dem Stream an sich arbeitet und nicht speziell an den ESP gebunden ist, somit ist ein Einsatz auf Arduinos mit Ethernet-Shield ohne Probleme machbar.
Hoffe, der eine oder andere hat da Interesse dran :)

Lg
Zuletzt geändert von Basti189 am 10.08.2018 16:17:23, insgesamt 1-mal geändert.
Es grüßt mit ZP1 der Basti

Benutzeravatar
Basti189
Beiträge: 17
Registriert: 23.03.2016 14:46:27
Aktuelle Projekte: Java Zusi3Schnittstelle
Arduino zusi3Schnittstelle
PhilipsHue Schnittstelle
ZusiLightControl
Wohnort: Kassel

Re: C/C++ (Arduino) TCP-Client für eigene Anwendungen

#2 Beitrag von Basti189 »

Quellcode für den Arduino wurden released!

https://github.com/Basti189/Zusi3Schnittstelle" target="_blank

Um das nochmal deutlich zu sagen, der Mikrocontroller arbeitet vollständig alleine und braucht nicht per USB an einem Computer zu hängen!

Vielleicht auch interessant für zukünftig gebaute Zusi 3 Pro Simulatoren, die Mikrocontroller für sich arbeiten zu lassen, anstatt die Ansteuerung über die Serielle Schnittstelle laufen zu lassen :)
Denke da an einen Einsatz Richtung ESP8266 / ESP32 mit LAN-Interface ;)

Liebe Grüße und viel Spaß
Zuletzt geändert von Basti189 am 23.08.2018 16:04:44, insgesamt 1-mal geändert.
Es grüßt mit ZP1 der Basti

Benutzeravatar
Basti189
Beiträge: 17
Registriert: 23.03.2016 14:46:27
Aktuelle Projekte: Java Zusi3Schnittstelle
Arduino zusi3Schnittstelle
PhilipsHue Schnittstelle
ZusiLightControl
Wohnort: Kassel

Re: C/C++ (Arduino) TCP-Client für eigene Anwendungen

#3 Beitrag von Basti189 »

Kleiner Tipp für diejenigen, die nicht auf WiFi setzen oder kein WiFi zur Verfügung haben.

https://www.olimex.com/Products/IoT/ESP ... e-hardware" target="_blank

Werde ich mir jetzt bestellen und damit mal rumspielen, somit hätte man eine Kabelgebundene Lösung ;)

Mit Versandkosten ~10€ liegt man dann doch so hoch, dass man sich auch bei Amazon für 36€ diese Variante holen kann :D

https://www.amazon.de/ESP32-GATEWAY-Pla ... rds=olimex" target="_blank

Lg
Zuletzt geändert von Basti189 am 07.09.2018 11:32:14, insgesamt 1-mal geändert.
Es grüßt mit ZP1 der Basti

Benutzeravatar
Basti189
Beiträge: 17
Registriert: 23.03.2016 14:46:27
Aktuelle Projekte: Java Zusi3Schnittstelle
Arduino zusi3Schnittstelle
PhilipsHue Schnittstelle
ZusiLightControl
Wohnort: Kassel

Re: C/C++ (Arduino) TCP-Client für eigene Anwendungen

#4 Beitrag von Basti189 »

Die Schnittstelle arbeitet nun auch Fehlerfrei mit dem ESP32 mit WiFi oder Ethernet zusammen.
Erfolgreich getestet mit dem NodeMCU-32S und dem Olimex ESP32-Gateway.

Liebe Grüße
Es grüßt mit ZP1 der Basti

lipkegu
Beiträge: 145
Registriert: 14.12.2022 23:09:43
Aktuelle Projekte: (FIS) Linguatec Anna 15
Wohnort: Berlin Marzahn (Nord)
Kontaktdaten:

Re: C/C++ (Arduino) TCP-Client für eigene Anwendungen

#5 Beitrag von lipkegu »

Ich habe das mit den Pins verdrahtet, aber nichts passiert.
Der Client ist verbunden, aber die PZB anzeigen werden nicht auf den LEDs angezeigt.

Code: Alles auswählen

for (int j = 0; j < subNode->getNodes()->size(); j++) {
          Node *itemNode = subNode->getNodes()->get(j);
          if (itemNode->getIDAsInt() == Status_Zugbeeinflussung) {
            for (int k = 0; k < itemNode->getNodes()->size(); k++) {
              Node *pzbNode = itemNode->getNodes()->get(k);
              if (pzbNode->getIDAsInt() == 0x03) {
                for (int l = 0; l < pzbNode->getAttribute()->size(); l++) {
                  Attribute *attr = pzbNode->getAttribute()->get(l);
                  boolean state = attr->getDATAAsBoolean();
                  switch (attr->getIDAsInt()) {
                    case 5:                     //1000Hz
                      digitalWrite(12, state);  //D3
                      break;
                    case 6:                     //55
                      digitalWrite(16, state);  //D0
                      break;
                    case 7:                    //70
                      digitalWrite(5, state);  //D1
                      break;
                    case 8:                    //85
                      digitalWrite(4, state);  //D2
                      break;
                    case 10:                    //500Hz
                      digitalWrite(13, state);  //D7
                      break;
                    case 11:                    //Befehl 40
                      digitalWrite(14, state);  //D5
                      break;
                  }
                }
              }
            }
          }
        }
Starte ich den Fahrplan Köln -Düsseldorf mit RE 26856, so bleiben die LEDs erloschen obwohl 85in Zusi-Display leuchtet.
Zusi 3 (Steam & Stick)

Benutzeravatar
nonesense
Beiträge: 527
Registriert: 15.07.2006 12:50:10
Aktuelle Projekte: QDmi
Fahrpult Einheitsführerstand
Ludmilla
Wohnort: Köln
Kontaktdaten:

Re: C/C++ (Arduino) TCP-Client für eigene Anwendungen

#6 Beitrag von nonesense »

lipkegu hat geschrieben: 29.11.2023 16:16:05Ich habe das mit den Pins verdrahtet, aber nichts passiert.
Hast du die Pins auch als Ausgang definiert?
lipkegu hat geschrieben: 29.11.2023 16:16:05Der Client ist verbunden, aber die PZB anzeigen werden nicht auf den LEDs angezeigt.
Hießt beim TCP-Server von Zusi wird dein Arduino aufgelistet?
lipkegu hat geschrieben: 29.11.2023 16:16:05Starte ich den Fahrplan Köln -Düsseldorf mit RE 26856, so bleiben die LEDs erloschen obwohl 85in Zusi-Display leuchtet.
Daran wirds liegen. Hätt'ste mal besser die Siegstrecke genommen.
Hast du Vorwiderstände verwendet?

Benutzeravatar
F. Schn.
Beiträge: 7135
Registriert: 24.10.2011 18:58:26

Re: C/C++ (Arduino) TCP-Client für eigene Anwendungen

#7 Beitrag von F. Schn. »

nonesense hat geschrieben: 30.11.2023 16:01:40
lipkegu hat geschrieben: 29.11.2023 16:16:05Starte ich den Fahrplan Köln -Düsseldorf mit RE 26856, so bleiben die LEDs erloschen obwohl 85in Zusi-Display leuchtet.
Daran wirds liegen. Hätt'ste mal besser die Siegstrecke genommen.
Lass dich von einem - sorry - echt dummen Scherz nicht abhalten, solche Infos dazu zu schreiben. Das hilft uns in den meisten Fällen deutlich, wobei es in dem Fall eher nur Details wie z.B. die PZB-Variante geht.

Ansonsten wäre trotzdem erst mal der Tipp, die Leuchtmelder erst mal mit einem einfachen Code zum Laufen zu bekommen, z.B. mit einem Code für an und dann einem Code für aus, oder mit einem Blink-Code. Wenn das nicht geht -> Siehe Rückfragen 1 und 3 von nonsense (PS: Wenn du keine Vorwiderstände verwendet hast, könnte der Arduino möglicherweise jetzt schon defekt sein). Zweiter Schritt wäre zu kontrollieren, was Zusi->Konfiguration->Netzwerk anzeigt. Einmal, ob der Client überhaupt gelistet ist, zum anderen (Doppelklick) ob die richtigen Größen aboniert worden sind. Davon würde dann der 3. Schritt abhängen.

PS: Nebenfund: Auf der Homepage fehlt die die Prüfung des ersten Knotens auf 0x0002. Er fängt erst mit der Prüfung auf 0x000A an.
Diese Signatur möchte folgendes bekannter machen: ZusiWiki · ZusiSK: Streckenprojekte · YouTube: Objektbau für Zusi · euirc: Zusi-Chat

lipkegu
Beiträge: 145
Registriert: 14.12.2022 23:09:43
Aktuelle Projekte: (FIS) Linguatec Anna 15
Wohnort: Berlin Marzahn (Nord)
Kontaktdaten:

Re: C/C++ (Arduino) TCP-Client für eigene Anwendungen

#8 Beitrag von lipkegu »

Der ESP wird mir als Fahrpult-Client in Zusi angezeigt (Doppelklick auf den Client, zeigt auch Status-Zugeeinflussung) und die PINs werden im Democode auf OUTPUT
(https://github.com/Basti189/Zusi3Schnit ... no.ino#L27) gesetzt.

Ich verwende 5V LEDs mit vorwiederständen (Diese sind ab Werk vor der LED unter einem Schrumpfschlauch eingelötet). Die leuchten auf den Breadboard mit 3,3V , (am 3,3 Volt-Pin) auch auf :)
https://www.amazon.de/5Volt-20cm-Anschl ... p_3_i&th=1

Mein ESP ist ein (ESP8266 12-E)
Zusi 3 (Steam & Stick)

Benutzeravatar
F. Schn.
Beiträge: 7135
Registriert: 24.10.2011 18:58:26

Re: C/C++ (Arduino) TCP-Client für eigene Anwendungen

#9 Beitrag von F. Schn. »

Dann bitte noch meine Fragen.
Diese Signatur möchte folgendes bekannter machen: ZusiWiki · ZusiSK: Streckenprojekte · YouTube: Objektbau für Zusi · euirc: Zusi-Chat

lipkegu
Beiträge: 145
Registriert: 14.12.2022 23:09:43
Aktuelle Projekte: (FIS) Linguatec Anna 15
Wohnort: Berlin Marzahn (Nord)
Kontaktdaten:

Re: C/C++ (Arduino) TCP-Client für eigene Anwendungen

#10 Beitrag von lipkegu »

Ok ich habe offenbar den Fehler gefunden. ICh habe den Fahrsimulator gestartet, wie auch mit dem Code... im Serial-Monitor kann ich sehen, dass der ESP 8266 einen SEGFAULT hat und rebootet. Deshalb leuchten die LEDs auch nur gefühlt alle 1 Sekunde auf. Ich kann den GDB leider nicht anhängen, (falls einer weiß wie man den 8266 remote attachen kann, könnte ich evtl den fehler beheben, da ich nicht weiß wie ich den da rankriege (USB Remote-Debug). Ich habe deshalb begonnen die Klasse neuzuschreiben.

Eine Mischung aus. Bastis Projekt und dem hier vorliegenen Fahrpult-Code, welcher mir Einblick auf das Anmelden an Zusi gibt. Ich habe eine Verbindung zu ZUSI, jedoch ist da ein Problem mit den Packets. Meine frage ist, verlangt Zusi BIG oder Little-Endianess?.
Zuletzt geändert von lipkegu am 03.12.2023 10:50:54, insgesamt 1-mal geändert.
Zusi 3 (Steam & Stick)

Benutzeravatar
F. Schn.
Beiträge: 7135
Registriert: 24.10.2011 18:58:26

Re: C/C++ (Arduino) TCP-Client für eigene Anwendungen

#11 Beitrag von F. Schn. »

Bei den meisten Fst-Bauern hat sich dieser Code in "plain C" etabliert, ich hatte den Code dann mal hier in einem Beitrag "zusammengefasst": viewtopic.php?p=274144#p274144

Weitere Alternaitven siehe hier: viewtopic.php?f=73&t=12650

Nachtrag: Wenn du einen µProzessor nicht ordentlich debuggen kannst: Nutze die Serielle Ausgabe als Status und gebe an verschiedenen Stellen aus, was der Prozessor gerade macht und taste dich so an die Stelle heran, wo er abstürzt.
Wenn die serielle Ausgabe nicht funktioniert, nutze die LEDs als Status-Leuchtmelder. Beispiel: 1000 Hz LM 1x mit aktiver Warteschleife blinken lassen, sobald er Neustartet, und dann im Code den 500er und den Befehl an passender Stelle mit aktiver Verzögerung toogeln lassen, und schauen, wie weit er kommt und in welcher Zeile er abstürzt.
Diese Signatur möchte folgendes bekannter machen: ZusiWiki · ZusiSK: Streckenprojekte · YouTube: Objektbau für Zusi · euirc: Zusi-Chat

lipkegu
Beiträge: 145
Registriert: 14.12.2022 23:09:43
Aktuelle Projekte: (FIS) Linguatec Anna 15
Wohnort: Berlin Marzahn (Nord)
Kontaktdaten:

Re: C/C++ (Arduino) TCP-Client für eigene Anwendungen

#12 Beitrag von lipkegu »

F. Schn. hat geschrieben: 03.12.2023 10:49:47 Bei den meisten Fst-Bauern hat sich dieser Code in "plain C" etabliert, ich hatte den Code dann mal hier in einem Beitrag "zusammengefasst": viewtopic.php?p=274144#p274144

Weitere Alternaitven siehe hier: viewtopic.php?f=73&t=12650
Aus dem ZIP-Archiv des 1. Posts gibt es dieses Beispiel:

Code: Alles auswählen

 #define NUM_SEND_HELLO 27
  byte hello[NUM_SEND_HELLO];
[b]  hello[0] = 0x17; // PACKET_LENGTH (4 bytes)
  hello[1] = 0x00;
  hello[2] = 0x00;
  hello[3] = 0x00;[/b]
[b]  hello[4] = 0x00; // HELLO (2 bytes)
  hello[5] = 0x01;[/b]
  hello[6] = 0x01; // VERSION (1 byte)
  hello[7] = 0x02; // CLIENT_TYPE (1 byte)
  hello[8] = 0x12; // IDENTIFICATION LENGTH
  hello[9] = 0x46; // "F"
  hello[10] = 0x61; // "a"
  hello[11] = 0x68; // "h"
...
  hello[26] = 0x29; // ")"
  client.write(hello, NUM_SEND_HELLO);
  state = STATE_WAITING_FOR_ACK;
  break;
Da bekomme ich von Zusi ein leeres ACK zurück (laut Wireshark).
Zusi 3 (Steam & Stick)

Benutzeravatar
F. Schn.
Beiträge: 7135
Registriert: 24.10.2011 18:58:26

Re: C/C++ (Arduino) TCP-Client für eigene Anwendungen

#13 Beitrag von F. Schn. »

Tja, dann jetzt die Preisfrage, warum ich nicht den ersten Beitrag verlinkt habe, sondern den, den ich verlinkt habe?
Diese Signatur möchte folgendes bekannter machen: ZusiWiki · ZusiSK: Streckenprojekte · YouTube: Objektbau für Zusi · euirc: Zusi-Chat

lipkegu
Beiträge: 145
Registriert: 14.12.2022 23:09:43
Aktuelle Projekte: (FIS) Linguatec Anna 15
Wohnort: Berlin Marzahn (Nord)
Kontaktdaten:

Re: C/C++ (Arduino) TCP-Client für eigene Anwendungen

#14 Beitrag von lipkegu »

Ich habe mal das gepostet, was ich habe. In der INO verweise ich auf zusi->Setup() und zusi->Loop();

Code: Alles auswählen

#include "wl_definitions.h"
#include <string>
#include "ZusiClient.h"
#include <vector>
#include <ESP8266WiFi.h>

ZusiClient::ZusiClient() {
  this->ip = NULL;
  this->port = 0;

  this->client = new WiFiClient();
}

ZusiClient::~ZusiClient() {
  this->ip = NULL;
  this->port = 0;
}

bool ZusiClient::Setup(const char* wifi_ssid, const char* wifi_password, const char* zusi_serverip, uint32_t zusi_port, const char* clientID) {
  bool state = false;

  this->clientId = clientID;
  this->ip = zusi_serverip;
  this->port = zusi_port;

  Serial.println("\n");

  state = this->SetupWIFI(wifi_ssid, wifi_password);

  if (!state) {
    Serial.println("[E] Failed to Setup Network!");
    return state;
  }

  this->Connect();

  this->clientState = 1;

  return true;
}

bool ZusiClient::SetupWIFI(const char* wifi_ssid, const char* wifi_password) {
  bool state = false;
  
  state = WiFi.mode(WIFI_STA);
  if (!state)
  {
    Serial.println("[E] WIFI: Failed to set Mode to WIFI_STA...");
    return state;
  }

  WiFi.setAutoReconnect(true);
  WiFi.begin(wifi_ssid, wifi_password);
  Serial.println("[D] Verbinde mit Netzwerk...");
  
  this->wifi_status = WiFi.status(); 
  
  while (this->wifi_status != WL_CONNECTED) {
    Serial.printf("\n[I] WIFI (if0) MAC: %s\n", WiFi.macAddress().c_str());
    
    switch (this->wifi_status)
    {
      case WL_IDLE_STATUS:
        break;
      case WL_CONNECTION_LOST:
          Serial.println("[E] WIFI: Connection lost!");
        break;
      case WL_CONNECT_FAILED:
          Serial.println("[E] WIFI: Connection failed!");
        break;
      case WL_CONNECTED:
          Serial.println("[I] Verbunden!");
          Serial.print("[I] IP-Adresse: ");
          Serial.println(WiFi.localIP());
        break;
      case WL_DISCONNECTED:
          Serial.println("[E] WIFI: Disconnected!");
        break;
      case WL_NO_SSID_AVAIL:
          Serial.printf("[E] WIFI: No SSID (\"%s\") available!\n", wifi_ssid);
        break;
      case WL_SCAN_COMPLETED:
          Serial.println("[E] WIFI: Scan completed!");
        break;
      case WL_NO_SHIELD:
          Serial.println("[E] WIFI: No Shield installed!");
        break;
      case WL_WRONG_PASSWORD:
          Serial.println("[E] WIFI: Invalid Password or Key!");
        break;
    }

    this->wifi_status = WiFi.status(); 
    delay(1000);
  }

  return state;
}

bool ZusiClient::Connect() {
  bool state = false;
  int counter = 0;
 
  while (!client->connected()) {
    counter++;
    Serial.print("[D] Connecting to Zusi... (");
    Serial.print(counter);
    Serial.println(")");

    state = this->client->connect(this->ip, this->port);
    if (!state)
    {
      counter++;

      if (counter >= 99)
        ESP.restart();
    }

    delay(1000);
  }

  Serial.println("[I] Verbunden mit zusi!");
  counter = 0;
  return state;
}

void ZusiClient::Send_Hello() {
  ZusiPacket* packet = new ZusiPacket();

  uint32_t len = 4;
  packet->Set_Position(len);

  packet->WriteU16(1);  // Hello
  len += 2;

  packet->WriteU8(1);  // Version
  len += 1;

  packet->WriteU8(2);  // ClientType
  len += 1;

  uint32_t ident_len = strlen(this->clientId);
  packet->WriteU8(ident_len);  // String Length of Ident
  len += 1;
  
  packet->WriteString(this->clientId, ident_len);
  len += ident_len;

  packet->Set_Position(0);
  packet->WriteU32(len);

  this->client->write(packet->Get_Payload(), len);
  Serial.println("[D] Hello Sent...");

  delete packet;
  packet = NULL;
}

void ZusiClient::Loop() {
  if (!this->Get_Client()->connected()) {
    this->clientState = STATE_SEND_HELLO;
    this->Connect();
    return;
  }

  switch (this->Get_State()) {
    case STATE_IDLE:
    default:
      break;

    case STATE_SEND_HELLO:
      this->Send_Hello();
      this->clientState = STATE_WAITING_FOR_ACK;
      break;

    case STATE_WAITING_FOR_ACK:
      if (!client->available())
        break;

      this->clientState = STATE_NEEDED_DATA;
      break;

    case STATE_NEEDED_DATA:
      if (!client->available())
        break;

      this->clientState = STATE_NEEDED_DATA_ACK;
      break;

    case STATE_NEEDED_DATA_ACK:
      if (!client->available())
        break;

      this->clientState = STATE_NEEDED_DATA_END;
      break;

    case STATE_NEEDED_DATA_END:
      if (!client->available())
        break;

        this->clientState = STATE_NEEDED_DATA_END_ACK;
      break;

    case STATE_NEEDED_DATA_END_ACK:
      if (!client->available())
        break;

      this->clientState = STATE_RECEIVING_COMMANDS;
      break;

    case STATE_RECEIVING_COMMANDS:
      if (!client->available())
        break;

      this->clientState = STATE_RECEIVING_DATA;
      break;

    case STATE_RECEIVING_DATA:
      if (!client->available())
        break;
      break;
  }

  delay(500);
}

ZusiPacket.cpp

Code: Alles auswählen

#include "Client.h"
#include <cstdint>
#include "c_types.h"
#include <cstddef>
#include <stdint.h>
#include <vector>
#include "ZusiPacket.h"

ZusiPacket::ZusiPacket() {
  this->payload = new char[1024];
  memset(this->payload, 0, 1024);
}

ZusiPacket::~ZusiPacket() {
  delete[] this->payload;
  this->payload = NULL;
}

void ZusiPacket::Set_Position(const uint32_t position) {
  this->position = position;
}

uint32_t ZusiPacket::Get_Position() const {
  return this->position;
}

void ZusiPacket::Set_Length(const uint32_t length) {
  this->length = length;
}

uint32_t ZusiPacket::Get_Length() const {
  return this->length;
}

const char* ZusiPacket::Get_Payload() const {
  return this->payload;
}

void ZusiPacket::WriteU8(const uint8_t value) {
  memcpy(&this->payload[this->position], &value, sizeof(uint8_t));
  this->position += sizeof(uint8_t);
}

void ZusiPacket::WriteU16(const uint16_t value) {
  memcpy(&this->payload[this->position], &value, sizeof(uint16_t));
  this->position += sizeof(uint16_t);
}

void ZusiPacket::WriteString(const char* value, const uint32_t length) {
  memcpy(&this->payload[this->position], &value, length);
  this->position += length;
}

void ZusiPacket::WriteU32(const uint32_t value) {
  memcpy(&this->payload[this->position], &value, sizeof(uint32_t));
  this->position += sizeof(uint32_t);
}

void ZusiPacket::Write16(const int16_t value) {
  memcpy(&this->payload[this->position], &value, sizeof(int16_t));
  this->position += sizeof(int16_t);
}

void ZusiPacket::Write32(const int32_t value) {
  memcpy(&this->payload[this->position], &value, sizeof(int32_t));
  this->position += sizeof(int32_t);
}

void ZusiPacket::Write64(const int64_t value) {
  memcpy(&this->payload[this->position], &value, sizeof(int64_t));
  this->position += sizeof(int64_t);
}
Zusi 3 (Steam & Stick)

jonathanp
Beiträge: 313
Registriert: 01.06.2015 14:11:25
Wohnort: BW Schöneweide

Re: C/C++ (Arduino) TCP-Client für eigene Anwendungen

#15 Beitrag von jonathanp »

Du solltes die Zusi-Dokumentation über das Protokoll und insbesondere das Beispiel lesen.

Es gibt große Unterschiede zwischen dem Zusi-Protokoll und dem, was du sendest Das Paket beginnt nicht mit einer Länge.

Das Protokoll hat Knoten, die andere Knoten und Attribute enthalten. Du scheinst die Knoten zu beginnen, aber du beendest sie nie, sodass Zusi ewig auf das Ende deiner Nachricht wartet.
Jedes Attribut muss mit den Daten beschrieben werden.
Wie du im Beispiel sehen werdest, sind zwar alle gängigen Netzwerkprotokolle Big Endian (auch bekannt als Netzwerk-Byte-Reihenfolge), Zusi ist jedoch Little Endian.


Edit: Nachdem ich das geschrieben habe, habe ich das Problem erkannt. Du verwendest ein Beispiel für Zusi 2. Dies ist ein völlig anderes Protokoll :schaffner

Kleinere Merkmale:
  • Wenn ZusiPacket::length und ZusiPacket::position nicht irgendwo initialisiert, habe sie ein zufällige Werte in jedes neues Objekt
  • Es ist nicht nötig, ZusiPacket auf dem Heap zu initisialieren. Es ist nur 12 byte Groß.

lipkegu
Beiträge: 145
Registriert: 14.12.2022 23:09:43
Aktuelle Projekte: (FIS) Linguatec Anna 15
Wohnort: Berlin Marzahn (Nord)
Kontaktdaten:

Re: C/C++ (Arduino) TCP-Client für eigene Anwendungen

#16 Beitrag von lipkegu »

Ok, das erklärt alles...
Zusi 3 (Steam & Stick)

Antworten