Daten per Websocket austauschen

Der Websocket-Standard definiert nicht, wie die Daten aussehen müssen, die per Websocket ausgetauscht werden. Wir benutzen JSON, in anderen Anwendungen ist womöglich die direkte Übergabe von HTML sinnvoll, oder es wird eine Kommandozeile nachgeahmt.

Stellenmarkt
  1. Leitung (m/w/d) des EDV-Amtes
    Landkreis Stade, Stade
  2. Administrator IT-Infrastruktur (m/w/d)
    Stockmeier Chemie GmbH & Co. KG, Bielefeld
Detailsuche

Wir haben uns für JSON entschieden, da wir damit eine komplette - und beliebig erweiterbare - Datenstruktur in Textform übertragen können, aber dafür keinen Parser implementieren müssen. JSON zu codieren und decodieren, beherrschen Browser wie auch Node.js direkt.

Damit der Client per Websocket eine Aktion auf dem Server auslösen kann, übermittelt er ein Objekt mit bis zu zwei Eigenschaften: cmd enthält den Namen eines Befehls in Textform und vol einen angestrebten Lautstärkewert.

Der Websocket-Server setzt diese Anweisungen in die entsprechenden Bluetooth-Anweisungen um. Wenn die cmd-Eigenschaft einen gültigen Wert besitzt, dann wird die dem Kommando zugeordnete Zahl ermittelt und diese an die CMD-Characteristic geschrieben. Ist die vol-Eigenschaft gesetzt, wird hingegen deren Wert in die VOL-Characteristic geschrieben. Bei einem Kommando sendet der Server das übermittelte Objekt zurück an den befehlenden Client, ergänzt um eine Eigenschaft, success. Sie ist true, wenn eine Aktion erfolgreich ausgeführt wurde. Das bedeutet aber nur, dass der Server kein Problem mit dem Befehl hatte. Eine Erfolgsmeldung, dass dieser tatsächlich beim Peripheral ankam und umgesetzt wurde, ist es nicht.

Golem Karrierewelt
  1. Informationssicherheit in der Automobilindustrie nach VDA-ISA und TISAX® mit Zertifikat: Zwei-Tage-Workshop
    19./20.07.2022, Virtuell
  2. Go für Einsteiger: virtueller Zwei-Tages-Workshop
    25./26.07.2022, Virtuell
Weitere IT-Trainings

Eine Erfolgsmeldung dieser Art haben wir nur indirekt umgesetzt: Empfängt das Peripheral-Skript einen Befehl über die CMD-Characteristic, dann übermittelt es über die TRK-Characteristic den Namen des aktuellen Titels. Wurde hingegen über die VOL-Characteristic die Lautstärke geändert, dann übermittelt diese Characteristic ihrerseits den tatsächlich gesetzten Wert zurück.

Der Server erhält beide Arten von Benachrichtigungen, weil er die TRK- und VOL-Characteristic abonniert hat. Trifft eine entsprechende Benachrichtigung ein, dann übermittelt der Server an alle Clients ebenfalls ein Objekt analog zur obigen Erfolgsmeldung. Der einzige Unterschied ist ein leeres Feld für die cmd-Eigenschaft.

  1. function handleService(service) {
  2.  
  3. service.discoverCharacteristics([], function(error, characteristics) {
  4. ...
  5.  
  6. switch(characteristics[i].uuid) {
  7. ...
  8. case UUID_CHARACTERISTIC_VOL :
  9. vol_char = characteristics[i];
  10. vol_char.notify(true);
  11. vol_char.on('read', function(value, isNotification) {
  12. ...
  13. message.volume = value.readUInt8(0);
  14.  
  15. if(connections.length) {
  16. ...
  17. connections[i].sendText(JSON.stringify(message));
  18. ...
  19. }
  20. });
  21. break;
  22. ...
  23. }
  24. ...
  25. }
  26. }

Im Normalfall zieht ein Befehlsaufruf vom Client an den Server also immer zwei Benachrichtigungen des Servers an den befehlenden Client nach sich: einmal nach dem Versand eines Kommandos über Bluetooth und einmal die Benachrichtigung vom Peripheral.

Bitte aktivieren Sie Javascript.
Oder nutzen Sie das Golem-pur-Angebot
und lesen Golem.de
  • ohne Werbung
  • mit ausgeschaltetem Javascript
  • mit RSS-Volltext-Feed
 Mittler zwischen den WeltenBinäre Daten statt Text 
  1.  
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. 6
  8. 7
  9. 8
  10. 9
  11. 10
  12. 11
  13. 12
  14.  


Anonymer Nutzer 28. Jul 2014

Ich würde sagen hier könnte man eleganter und auch verhältnismäßig preiswert mit Zigbee...

savejeff 24. Jul 2014

perfekt! die Artikel sind echt zeitlos. ich werde noch ein paar Artikel nachholen.

holminger 24. Jul 2014

Meine RasPis dienen einmal als AirPrint-Server für einen 15 Jahre alten Kyocera...

currock63 23. Jul 2014

die guten alten Zeiten der c't, als es noch in fast jeder Ausgabe etwas zum selber...



Aktuell auf der Startseite von Golem.de
Prehistoric Planet
Danke, Apple, für so grandiose Dinosaurier!

Musik von Hans Zimmer, dazu David Attenborough als Sprecher: Apples Prehistoric Planet hat einen Kindheitstraum zum Leben erweckt.
Ein IMHO von Marc Sauter

Prehistoric Planet: Danke, Apple, für so grandiose Dinosaurier!
Artikel
  1. Retro Gaming: Wie man einen Emulator programmiert
    Retro Gaming
    Wie man einen Emulator programmiert

    Warum nicht mal selbst einen Emulator programmieren? Das ist lehrreich und macht Spaß - wenn er funktioniert. Wie es geht, zeigen wir am Gameboy.
    Von Johannes Hiltscher

  2. Playstation: Sony plant Filme, Serien und Mobilspiele - und die PS5 Pro?
    Playstation
    Sony plant Filme, Serien und Mobilspiele - und die PS5 Pro?

    Eine Verfilmung von Gran Turismo mit Starregisseur, Serien für God of War und Horizon: Sony hat viel vor. Zur PS5 Pro gibt es einen Leak.

  3. Cloudgaming: Microsoft bestätigt Game-Pass-Streaming-Box
    Cloudgaming
    Microsoft bestätigt Game-Pass-Streaming-Box

    Seit Jahren gibt es Gerüchte über eine Alternative zur aktuellen Xbox-Konsolengeneration. Microsoft hat dies nun ganz konkret bestätigt.

Du willst dich mit Golem.de beruflich verändern oder weiterbilden?
Zum Stellenmarkt
Zur Akademie
Zum Coaching
  • Schnäppchen, Rabatte und Top-Angebote
    Die besten Deals des Tages
    Daily Deals • Prime Video: Filme leihen für 0,99€ • Gigabyte RTX 3080 12GB günstig wie nie: 1.024€ • MSI Gaming-Monitor 32" 4K UHD günstig wie nie: 999€ • Mindstar (u. a. AMD Ryzen 5 5600 179€, Palit RTX 3070 GamingPro 669€) • Days of Play (u. a. PS5-Controller 49,99€) [Werbung]
    •  /