Hexadezimal / Byte und das ganze in einen String

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von SpaceyX.

    Hexadezimal / Byte und das ganze in einen String

    Hallo Leute,

    ich möchte einen Media-Gateway ansteuern und muss dafür einen Befehl "errechnen".
    In der Anlage findet Ihr die Beschreibung als Screenshot.

    Beispiel 1:
    Adresse = FF
    Befehl = 02

    Beispiel 2:
    Adresse = FF
    Befehl = 0170

    „data“ setzt sich folgendermaßen zusammen:
    Bei einem 1-Byte Befehl (2 ASCII Zeichen):
    data = ((Adresse & 0xFFFFFE) << 8) + Befehl;
    Bei einem 2-Byte Befehl (4 ASCII Zeichen):
    data = ((Adresse & 0xFFFFFE) << 16) + Befehl;


    Ich habe keinen Schimmer wie ich "data" mittels VB-Code "errechnen" kann. Kann mir da jemand von Euch helfen?

    Mein Ansatz wäre dieser, ich weiß aber nicht ob das korrekt ist:

    VB.NET-Quellcode

    1. Dim Adresse As Integer = &HFF
    2. Dim Wert As Integer = &HFFFFFE
    3. Dim data As Integer = (Adresse And Wert) << 8
    4. TextBox3.Text = data.ToString + TextBox2.Text

    Bilder
    • 12032020223537.jpg

      90,74 kB, 607×572, 128 mal angesehen
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „dive26“ ()

    Hi,

    sollte so gehen....

    VB.NET-Quellcode

    1. Sub Main(args As String())
    2. '1-Byte-Befehl
    3. Dim address = &HFF
    4. Dim command = &H2
    5. Dim data = ((address And &HFFFFFE) << 8) + command
    6. Console.WriteLine(data.ToString("X2"))
    7. '2-Byte-Befehl
    8. address = &HFF
    9. command = &H170
    10. data = ((address And &HFFFFFE) << 16) + command
    11. Console.WriteLine(data.ToString("X2"))
    12. End Sub


    Hier noch ein kleiner Anhang dazu. Falls Du weitere Erklärungen möchtest, einfach melden....

    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Vielen Dank für die viele Mühe lieber @SpaceyX.

    Ich habs ausprobiert, aber leider ohne Erfolg. Möglicherweise aber ich auch etwas anderes übersehen.
    Ich habe einmal eine Email an den Support von Mediola geschickt - vielleicht haben die einen Tipp:


    Sehr geehrte Damen und Herren!

    Wir möchten das Mediola V5 in eine Anwendung integrieren und haben da eine kleine Schwierigkeit.

    Der Befehl 192.168.0.230/command?XC_PASS=sagichnicht&XC_FNC=GetStates gibt folgenden beiden Geräte zurück:
    {XC_SUC}[{"type":"EVENT","adr":"FF","state":"0"},{"type":"CF4","adr":"000010","state":"0309FF00:FF:2:1"}]
    Das Gerät mit der Adresse 000010 und dem Type CF4 ist ein Barthelme LED Controller.
    Der aktuelle Zustand (Farbe, Helligkeit, Programm / OnOff) wird korrekt unter „state“ übermittelt.
    Soweit alles gut.

    Nun habe ich aber das Problem, dass ich keine Befehle an den LED-Controller senden kann.
    Bzw. es wird zwar gesendet und mit {XC_SUC}{} quittiert, aber es tut sich nichts.

    Hier mein http-String:192.168.0.230/command?XC_PASS=…SendSC&type=CF4&data=FE02

    Habe Befehle wie z.B. „PowerOff“ (02) oder „PowerOn“ (01) versucht. Leider tut sich aber nichts.

    Ich vermute, dass ich beim „data“ Argument etwas falsch mache?

    Können Sie mir hier einen Tipp geben bzw. mit das korrekte „data“ Format für das obige Beispiel nennen?

    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    @SpaceyX

    Vielen Dank. Anbei das Manual. Musst nach "LED Controller II steuern" suchen.

    Wie kommst Du auf Dim address = &HFF?
    Ist 000010 (hexadezimal) nicht &H10 ?
    Dateien
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Du hast doch in Deinem Eingangspost als Beispiel-Adresse &HFF angegeben. Daher komme ich drauf....

    dive26 schrieb:

    Beispiel 1:
    Adresse = FF
    Befehl = 02


    Nope: 00 0010 (Binär nehme ich an) ist Hexadezimal: &H2....

    Hier eine kurze Erklärung zur Umwandlung von Binär zu Hexadezimal:



    Hast Du zum Beispiel eine Binärzahl: 011010110001011111 so zerteilst Du diese von rechts angefangen in 4er-Blöcke => 01 1010 1100 0101 1111. Jedem 4er-Block ordnest Du die entsprechende Hexadezimalzahl zu => 1 A C 5 F => &H1AC5F. 2 4er-Blöcke (2x 4Bit) ergeben ein Byte... Rückwärts geht es ebenso einfach. &H1AAB => 1 1010 1010 1011. Das nur so am Rande.

    Leider konnte ich in dem Manual keine Angabe zur Adresse finden....
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „SpaceyX“ ()

    Achja, im Eingangspost hatte ich noch die falsche Geräteadresse. Mein Fehler.

    Also wenn

    {"type":"EVENT","adr":"FF","state":"0"}

    Hexadezimal ist (FF), dann muss das "000010" auch hexadezimal sein:

    {"type":"CF4","adr":"000010","state":"0309FF00:FF:2:1"}

    (das sind die beiden angeschlossenen Geräte deren Status bei "GetStates" übermittelt wird - das funktioniert ja einwandfrei.)
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Ahso, jetzt verstehe ich. Ich nahm an, dass 000010 als Binär dargestellt ist.... Wenn das Hexadezimal ist, hast du natürlich recht, das ist &H10. Melde mich gleich wieder.....

    Wenn die Geräteadresse &H10 ist, dann müsste diese Berechnung die Richtige sein...

    VB.NET-Quellcode

    1. Sub Main(args As String())
    2. '1-Byte-Befehl
    3. Dim address = &H10
    4. Dim command = &H2
    5. Dim data = ((address And &HFFFFFE) << 8) + command
    6. Console.WriteLine(data.ToString("X2"))
    7. '2-Byte-Befehl
    8. address = &H10
    9. command = &H170
    10. data = ((address And &HFFFFFE) << 16) + command
    11. Console.WriteLine(data.ToString("X2"))
    12. End Sub


    Detaillierte Vorgehensweise wie im Bild oben, nur eben mit Adresse &H10.....
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „SpaceyX“ ()

    @dive26 Du musst unterscheiden zwischen einer Zahl und ihrer String-Repräsentation.
    Eine (Ganz-)Zahl besteht aus 1, 2, 4, 8 Byte und kann mit und ohne Vorzeichen verstanden werden.
    Gugst Du docs.microsoft.com/de-de/offic…ce-help/data-type-summary
    Was Du am Bildschirm ausgibst, ist die String-Repräsentation der Zahl, da kommen dann solche Kategorien vor:
    Binär, Oktal, Dezimal, Hexadezimal, führende Nullen, Position des Vorzeichens, Tausender-Separator usw.
    Zahl und String-Repräsentation hängen sehr eng miteinander zusammen, aber für das Verständnis Deiner Befehlssequenzen musst Du zunächst beides getrennt voneinander verstehen.
    Dann wird auch die Nachbarin wieder mit Dir reden.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Leider hat das Berechnen laut Handbuch gar nichts gebracht - alle möglichen Kombinationen wurden ausprobiert. Ich denke die Angaben im Handbuch sind schlichtwegs veraltet oder falsch.
    Heute bekam ich einen Tipp in einem Forum - ich soll einmal den Datenverkehr zwischen der funktionierenden Smartphone-App und dem Steuergerät abfangen.

    Ich habe mir also am Smartphone (Android) die App Packet Capture installiert und die Pakete von der IQONTROL APP abgefangen und analysiert.
    Tadaaaa!!!! Die korrekten Werte für die Steuerung des Barthelme ChromoFlex Pro RGBW Controllers sind somit:

    01000010 (00-FF) Helligkeit z.B. 01000010FF (100% Helligkeit)
    02000010 (RRGGBBWW) RGBW Farbwert z.B.: 02000010FF000000 (rot)

    04000010 Power on
    05000010 Power off
    06000010 Power off und Einstellung speichern

    0A000010 Programm-
    0B000010 Programm+

    Irgendwie sind diese Hexwerte so gar nicht so wie im Handbuch beschrieben zusammengesetzt.

    Somit habe ich meine Anwendung fertig.
    Damit kann ich nun die Farbe und Helligkeit der RGB-LED im Pool abfragen und setzen und gespeicherte Farbwechselprogramme abrufen. Zudem kann ich die elektrische Unterflur-Poolabdeckung aus- und einfahren und sogar den Transformator vor der LED-Steuerung ein- oder ausschalten.

    Liebe Grüße und vielen Dank!
    Bilder
    • IMG_20200314_160806.jpg

      2,27 MB, 3.648×2.736, 88 mal angesehen
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    @dive26 Glückwunsch. :thumbup:
    Das ist eine sehr gute Idee, das per "Lauschangriff" aufzuklären.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!