Go Down

Topic: MSC UDP Port 6004 lauschen und auf Display ausgeben (Read 2132 times) previous topic - next topic

1234_BEL

Hallo Liebe Freunde des Arduion's

ich bin neu in der Materie und habe auf mein Problen per google noch keine lösung gefunden.
Ich hoffe ihr könnt Mir weiter helfen.

nun mein Problem.

Ich möchte ein Anzeige für Cue Anzeige für ein Lichtpult (GrandMA)
Dieses Lichtpult sendet Per UDP Midi Show Control pakte auf dem Port 6004. Diese würde ich gerne abfangen und filtern / bearbeiten und auf einen Display ausgeben. Per Wireshark habe ich diese Paket auch gefunden,  und der Arduino zeigt mir auch Sachen an aber die Eigentlichen Daten kann ich nicht  herausfiltern  … Ich hoffe Ihr versteht was ich meine.  

das Script gibt paket daten auf dem Serial monitro wider aus
Code: [Select]

#include <Ethernet.h>
// #include <EthernetClient.h>
// #include <EthernetServer.h>
#include <EthernetUdp.h>

#include <LiquidCrystal.h>

// #include <Ethernet.h>
// #include <EthernetUdp.h>
 
int Spannung = A15;
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(30, 31, 32, 33, 34, 35);
 
// Network Settings
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 0, 94);

// Local UDP port to listen on
unsigned int localPort = 6004;
 
// Recipient IP
IPAddress RecipientIP(192, 168, 0, 255);
 
// Recipient UDP Port
unsigned int RecipientPort = 6004;
 

 
// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];
 
// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;
 
void setup() {
 
    // set up the LCD's number of columns and rows:
  lcd.begin(16, 1);
  // for debug only
  Serial.begin(9600);
   
  // start Ethernet
  Ethernet.begin(mac,ip);
 
  // Start UDP
  Udp.begin(localPort);
 
 
}
 
void loop()
{
  checkUDP();
  lcdAusgabe();
 
}

// Function to check for new UDP packets
void checkUDP()

  // if there's data available, read a packet
  int packetSize = Udp.parsePacket();
  if(packetSize)
  {
    // read the packet into packetBufffer
    Udp.read(packetBuffer,UDP_TX_PACKET_MAX_SIZE);
   
    // for debug only
    // write packetBuffer to serial
    Serial.print("Contents:");
    Serial.println(packetBuffer);
    Serial.print("Packet Content: ");
    Serial.println(packetBuffer);
    Serial.print("Received packet of size ");
    Serial.println(packetSize);
  //  Serial.print(packet);
    Serial.print("Port: ");
    Serial.println(Udp.remotePort());   
    Serial.print("Daten?");
    Serial.print(Udp.read());
    Serial.print("From ");
    IPAddress remote = Udp.remoteIP();
    for (int i = 0; i < 4; i++) {
      Serial.print(remote[i], DEC);
      if (i < 3) {
        Serial.print(".");
      }



die Ausgabe ist foldendes 
Code: [Select]

Contents:GMA
Packet Content: GMA
Received packet of size 24
Port: 6004
Daten?-1From 192.168.0.8


was ich aber haben möchte ist die Daten die im Foto von Wirewhark Blau Hinterlegt sind:
P...9.000.201.1.
die 9.000 steht für die Cue 9,000 des Lichtpultest und diese Zahl möchte ich gern auf dem Display (Später) Ausgeben, ersteinmal Serial ...

Ich hoffe ihr könnt mir helfen, bzw. Versteht was ich meine 
Danke und viele Grüße
Johann 

ElEspanol

Also verstehen momentan noch nicht wirklich.

Lass doch mal seriell alles ausgeben, was so auf dem 6004 reinkommt.

Dann kann man den Datenstrom analysieren und weitersehen.

1234_BEL

Hallo EIEspanol,

das ist ja mein Problem wenn ich versuche  die Daten ausgeben möchte

Code: [Select]
void loop() {
  // if there's data available, read a packet
  int packetSize = Udp.parsePacket();
    if (packetSize>0) {
    Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
  String datReq(packetBuffer);
 
    Serial.print("ausgabeSting");
    Serial.print(datReq);


Bekomme ich im Serial Monitor nur
"ausgabeStingGMA"
Wobei GMA der inhalt des String ist...
aber laut Wireshar müsste da noch ein paar mehr sachen kommen ...
wie kann ich dies auselesn ?

Viele Grüße
Johann

agmue

… Ich hoffe Ihr versteht was ich meine.  
Nein, leider nicht! Daher nur eine kleine Anregung: Die von Dir anzuzeigenden Daten
Quote
0x47, 0x4d, 0x41, 0x00, 0x4d, 0x53, 0x43, 0x00, 0x1e, 0x00, 0x00, 0x00, 0xf0, 0x7f, 0x70, 0x02, 0x7f, 0x01, 0x39, 0x2e, 0x30, 0x30, 0x30, 0x00, 0x32, 0x30, 0x31, 0x2e, 0x31, 0xf7
enthalten viele Steuerzeichen und 0x00. Letztere dienen in C als Stringterminierung. Daher wird nach "GMA" die Ausgabe beendet.

Möglicherweise ist die Art der Ausgabe anzupassen:
Code: [Select]
byte text[] = {0x47, 0x4d, 0x41, 0x00, 0x4d, 0x53, 0x43, 0x00, 0x1e, 0x00, 0x00, 0x00, 0xf0, 0x7f, 0x70, 0x02, 0x7f, 0x01, 0x39, 0x2e, 0x30, 0x30, 0x30, 0x00, 0x32, 0x30, 0x31, 0x2e, 0x31, 0xf7};

void setup() {
  Serial.begin(9600);
  Serial.println("Anfang");
  for (byte j = 0; j < sizeof(text); j++) {
    Serial.print(" ");
    Serial.print(text[j], HEX);
  }
  Serial.println();
  for (byte j = 0; j < sizeof(text); j++) {
    if (text[j] > 32) {
      Serial.print(char(text[j]));
    } else {
      Serial.print(".");
    }
  }
}

void loop() {}


Und damit willkommen im Forum!
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

1234_BEL

Hallo Agmue,


Ok das habe ich verstanden,
aus dem Hex Werten werden  werden "normale" Daten

aber wie kann ich aus dem gesendeten Datenpacketen  0X47 .....
in die "byte text" Speichern ?





Viele Grüße
JOhann


agmue

So wie ich das in der zweiten Schleife gemacht habe, also druckbare von Steuerzeichen trennen, und das packetSize mal, im Beispiel 24.
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

michael_x

Quote
47 4D 41 00 4D ...
als Text betrachtet ist da leider nach 3 Buchstaben Schluss:
Da du weisst, dass es 72 Zeichen sind, kannst du ja mit denen machen was du willst, nur eben nicht als char[] ausdrucken.

agmue

... es 72 Zeichen sind ...
Wie kommst Du auf diese Zahl? In der Anzeige steht "Received packet of size 24", was dem Inhalt der Variablen packetSize entspricht. Oder?  :smiley-confuse:
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

michael_x

72 habe ich aus dem wireshark Bildchen, was aber wohl das komplette UDP Paket mit Header.
War also Unsinn.

Ausserdem hast du bereits auf die enthaltenen 0 Bytes hingewiesen.

Und deinem Beispiel @(2016-04-22, 21:43:51) ist eigentlich nichts hinzuzufügen.

Bitte um Entschuldigung, wenn ich jemanden verwirrt habe.   

1234_BEL

Hallo


ich habe Speicher die Daten in einen String  ? (oder giebtes  einen bessern möglichkeit ?)
und lass mit der es dan in der Schleife von agmue ausgeben.

Code: [Select]
void loop() {
  // if there's data available, read a packet
  int packetSize = Udp.parsePacket();
    if (packetSize>0) {
    Udp.read(packetBuffer, 24);
  String datReq(packetBuffer);
  String text(packetBuffer) ;
 
    Serial.println("ausgabeSting");
    Serial.println(datReq);
    Serial.println("Anfang");
    for (byte j = 0; j < sizeof(text); j++) {
    Serial.print(" ");
   Serial.print(text[j], HEX);
  }
  Serial.println();
  for (byte j = 0; j < sizeof(text); j++) {
    if (text[j] > 32) {
      Serial.print(char(text[j]));
    } else {
      Serial.print(".");

   
      }
    }
    Serial.print(", port ");
    Serial.println(Udp.remotePort());

    // read the packet into packetBufffer

   
  }
  delay(10);
}


Lustigerweise bekomme ich im Serial Monitor nur ein Paar Zeichen ausgegeben
ausgabeSting
GMA
Anfang
 47 4D 41 0 0 0
GMA..., port 6004


Egal ob ich bei "Udp.read(packetBuffer, 24)" 24 oder 30 UDP_TX_PACKET_MAX_SIZE eingetragen haben.

Liegt es daran das ich in einen String nicht so viele Daten Speichern kann ?


Danke und viele Grüße
Johann

hier habe ich bei "Udp.read(packetBuffer, 24)"

1234_BEL

Noch eine Frage auf was bezieht sich die 32 in der Zeile 

>> if (text[j] > 32) {<<  ?

Danke und viele Grüße
Johann

Whandall

Dezimal 32 oder hex 0x20 ist das Leerzeichen ' ', numerisch kleinere Zeichen sind Steuerzeichen.
Ah, this is obviously some strange usage of the word 'safe' that I wasn't previously aware of. (D.Adams)

1234_BEL

Hallo ,

ersteinmal danke für die Hilfe,

nun habe frage ich mich aber warum nur ein kleiner Teil der Gesendeten Daten in den Sting gespeichter werden.

Laut Wireshark müssten nach diesn Muster Daten übertragen werden:

"47 4d 41 00 4d 53 43 00 1e 00 00 00 f0 70 02 7f 01 39 2e 39 39 39 00 32 30 31 f7"
GMA.MSC....... P...9.999.201.1.

und laut der Serial Ausgabe kommt nur

"47 4D 41 0 0 0"
GMA...

das Iritiert mich ein bisschen. da es ja einglich genau das gleich ist womit ich gestartet bin. nur die 3x "." sind dazu gekommen.

würde mich über ideen freuen.

Danke und viele grüße
Johann

michael_x

Darum: 
Code: [Select]
   Udp.read(packetBuffer, 24);  // nehmen wir mal an, in packetBuffer sind tatsächlich 24 Zeichen "GMA\0MSC ..."
  String datReq(packetBuffer); // datReq ist danach ein String mit 3 Buchstaben
  String text(packetBuffer) ; // text == datReq
 
    Serial.println("ausgabeSting");
    Serial.println(datReq);
    Serial.println("Anfang");
    for (byte j = 0; j < sizeof(text); j++) {  // sizeof(text) ist nicht das was du willst, ein String Objekt ist was anderes als die enthaltenen Buchstaben. Die werden vermutlich nichtmal mitgezählt.


warum arbeitest du nicht mit packetBuffer ?

1234_BEL

Hallo Michael_x

wiso werden die Daten wenn Sie in einen Sting übergebenwerden auf 3 Buchstaben "Gekürzt"?   

Quote
Udp.read(packetBuffer, 24);  // nehmen wir mal an, in packetBuffer sind tatsächlich 24 Zeichen "GMA\0MSC ..."
  String datReq(packetBuffer); // datReq ist danach ein String mit 3 Buchstaben
Und was meintest Du mit  " warum arbeitest du nicht mit packetBuffer ?" ?
dies Sachen habe ich so in Beispielen gelesen ...
Wenn es eine Anderes Möglichkeit keit gibt die Daten zu empfangen, und weiterverabeiten bin gerne dafür offen  =)

Danke und Viele Grüße
Johann

Go Up