Generieren und ändern Sie SVG-Grafiken von Daten von Sensoren, die mit dem IoT verbunden sind, mit JavaScript

Generieren und ändern Sie SVG-Grafiken von Daten von Sensoren, die mit dem IoT verbunden sind, mit JavaScript

Generieren und ändern Sie SVG-Grafiken von Daten von Sensoren, die mit dem IoT verbunden sind, mit JavaScript

In diesem letzten Teil der Artikelserie zum Thema Zeichnen Grafiken mit Daten von Sensoren, die mit dem Internet der Dinge verbunden sind, ist es an der Zeit, darüber zu sprechen, wie man damit generiert oder ändert JavaScript Zeichnungen im Format SVG und einige der Elemente HTML die als Container dienen oder ergänzende Informationen zu den Grafiken darstellen.

Inhaltsverzeichnis

    Datendiagramme von Sensoren, die mit dem IoT-Container (Internet of Things) verbunden sind, in HTMLDiagramme von Daten von Sensoren, die mit dem Internet der Dinge (IoT) verbunden sind, Definition des Erscheinungsbilds in CSSDatendiagramme von Sensoren, die mit dem Internet der Dinge (IoT) verbunden sind, zeichnen mit SVGDatendiagramme von Sensoren, die mit dem Internet der Dinge (IoT) verbunden sind. Generierung und Änderung mit JavaScript

    Die Zielbenutzer dieses Tutorials sollen ein Elektronik- und Computerprogrammierungsprofil bilden. Mikrocontroller, sie sind möglicherweise nicht damit vertraut HTML, CSS o SVG; Aus diesem Grund wurde in den vorherigen Teilen eine kurze Einführung in die Sprache bzw. die entsprechende Technologie vorgenommen. In diesem letzten Teil ist der Ansatz etwas anders, da die Leser sicherlich wissen, wie man programmiert, es ist möglich, dass man die Sprache verwendet C + + was wie JavaScript, teilt die grundlegende Syntax mit C und es kann als Referenz genommen werden, um die meisten grundlegenden Programmierkonzepte zu überspringen und sich somit auf die Unterschiede und die spezifische Verwendung zu konzentrieren, die uns bei der Erstellung von Sensorgrafiken im IoT interessiert.

    Der Name gibt einen Hinweis auf den ersten Unterschied: JavaScript Es ist eine Programmiersprache Skript (Bindestrich) und als solches ist es interpretiertEs besteht keine Notwendigkeit, es zu kompilieren. der Kontext, in dem die Skript (z. B. ein Webbrowser) liest, übersetzt und führt die Bestellungen aus. Um genau zu sein, gibt es in den meisten Fällen eine Laufzeitkompilierung (JIT), aber für den Code-Schreibprozess JavaScript Es betrifft uns nicht, wir schreiben einfach den Code und es kann funktionieren.

    Der Name enthält auch die erste Verwirrung: JavaScript hat nicht die geringste Beziehung zu Javac. Ursprünglich, als es entwickelt wurde Netscape Der Browser hieß zuerst Mocha und dann das weniger verwirrende LiveScript. Nach seiner erfolgreichen Implementierung in Browsern und darüber hinaus wurde es standardisiert als ECMAScript (To ECMA-262, Version 6 zum Zeitpunkt des Verfassens dieses Artikels), um gegenüber Browsern, die es implementieren, neutral zu sein. Derzeit gibt es auch einen Standard ISO ab Version 5, 2011 (ISO / IEC 16262: 2011 zum Zeitpunkt des Schreibens des Artikels)

    Variablen, grundlegende Datentypen und Objekte in JavaScript

    Anders als zum Beispiel in C + +, en JavaScript Datentyp wird bei der Deklaration einer Variablen nicht berücksichtigt Da der einer Variablen zugeordnete Typ nicht festgelegt ist und der Typ nicht festgelegt ist, ist es möglich, während der Ausführung des Programms einen Wert eines anderen Typs zuzuweisen.

    Im vorherigen Beispiel wurde die Variable „thing“ deklariert (ohne Angabe des Datentyps), dann werden Daten eines anderen Typs zugewiesen und diese werden konsultiert typeof der Typ, der JavaScript das er interpretiert hat. Um den Code zu debuggen, können Sie ihn in die Inspektorkonsole des Webbrowsers schreiben (was sich nicht auf die Darstellung des Webs auswirkt). console.log().

    Um die Konvertierung von Daten in einen bestimmten Typ, insbesondere von Text in Zahlen, zu erzwingen, können Sie Funktionen wie verwenden parseInt() o parseFloat() die in Ganzzahlen bzw. Gleitkommazahlen konvertieren. Die umgekehrte Konvertierung kann mit durchgeführt werden String(), obwohl dies wahrscheinlich nicht notwendig ist, da die automatische Konvertierung normalerweise ausreicht. Mit parseFloat()Sie können beispielsweise den Wert einer Webseiteneigenschaft abrufen, z. B. die Breite oder Höhe eines Objekts, das Einheiten enthält. Auf diese Weise ist der Ausdruck parseFloat("50px"); gibt als Ergebnis 50 zurück, einen numerischen Wert.

    En JavaScript Es gibt keinen Unterschied zwischen doppelten und einfachen Anführungszeichen; Der Datentyp ist in beiden Fällen string, und jeder von ihnen kann den anderen einschließen, ohne dass Escape-Codes erforderlich sind.

    Im vorherigen Beispiel ist zu sehen, dass eine Variable, wenn sie deklariert wurde (existiert), aber ihr kein Wert zugewiesen wurde, einen undefinierten Datentyp enthält (undefined). Ein nicht zugewiesenes Objekt hat den Wert null; Das heißt, das Objekt existiert, aber ohne Wert; Eine Variable, die darauf verweist, hätte kein typeof undefined aber object. Ein Objekt kann auch leer sein, also nicht null, aber keine Eigenschaften haben.

    zu Definieren Sie ein Objekt in JavaScript werden in geschweifte Klammern eingeschlossen ({ y }) die Eigenschaften oder Methoden, getrennt durch das Doppelpunktzeichen (:) Eigenschaftsname Eigenschaftswert und durch Komma (,) die verschiedenen Eigenschaften. Weitere Informationen zu dieser Art, ein Objekt auszudrücken, finden Sie im Artikel zum JSON-Format.

    Obwohl Sie eine Syntax verwenden können, die Sie zu einer anderen Meinung verleiten könnte, en JavaScript Es gibt keine Klassen, sondern PrototypenDas heißt, damit ein Objekt Eigenschaften und Methoden erbt, wird ein anderes Objekt erstellt (der Prototyp), das die anderen (die Kinder) als Referenz verwenden. Die Syntax, die dem Stil von am nächsten kommt JavaScript einen Prototypen zu verwenden ist Object.create obwohl es auch möglich (und manchmal nützlich) ist, es zu verwenden new wie in anderen objektorientierten Sprachen.

    zu Abfrage, ob ein Objekt eine Instanz eines anderen ist, wenn Sie es als Prototyp verwenden, wenn Sie seine Eigenschaften erben, kurz gesagt, können Sie es verwenden instanceof (hergestellt mit new) O isPrototypeOf (hergestellt mit Object.create), die als wahr ausgewertet wird, wenn das Objekt den Prototyp verwendet, und als falsch, wenn dies nicht der Fall ist.

    Sobald ein Objekt unter Verwendung eines anderen als Prototyp erstellt wurde, d. h. sobald ein Objekt instanziiert wurde, kann es sein Fügen Sie neue Eigenschaften hinzu oder überschreiben Sie Prototypeigenschaften unter Verwendung der Punktsyntax wie in gato.peso=2.5.

    La Arrays in JavaScript Sie unterscheiden sich von denen, die Sie wahrscheinlich kennen C. Sie werden zunächst ohne Angabe ihrer Länge deklariert, lediglich mit den Zeichen öffnender und schließender eckiger Klammern ([ y ]), Komponenten können heterogen sein (verschiedene Datentypen im selben Array) und neue Elemente können ohne Einschränkung hinzugefügt werden. Die Matrizen von JavaScript sind eigentlich Listen (Sammlungen) von Elementen, zu denen durch einen numerischen Index oder einen Namen referenziert werden. Ein Array kann gleichzeitig numerische Indizes und Elementnamen enthalten, es ist jedoch üblich, Objekte (Eigenschaften) zu verwenden, um den zweiten Typ auszunutzen.

    Wie im vorherigen Beispiel zu sehen ist, können Sie Folgendes verwenden, um festzustellen, ob eine Variable einer Instanz eines Arrays entspricht (es handelt sich um ein Array-Objekt). instanceof, wie es bereits mit generischen Objekten oder in neueren Versionen von verwendet wurde JavaScript zurückgegriffen werden kann Array.isArray()

    Um auf die Elemente des Arrays zuzugreifen, können Sie seinen Index verwenden (matriz[7]) oder durch den Eigenschaftsnamen mit dem Namen in eckigen Klammern (matriz["nombre"]) oder mit der üblichen Punktsyntax für Objekte (matriz.nombre). Da es sich bei dem Namen um eine Textzeichenfolge handelt, kann zum Verfassen ein Ausdruck einschließlich Variablen verwendet werden. Um ein Array mit Eigenschaften zu durchlaufen, kann eine Schleife mit dem Format verwendet werden for(propiedad in matriz).

    Es ist für unser Ziel interessant, es zu behandeln Objekt Date, mit dem Datum und Uhrzeit dargestellt und verwaltet werden können JavaScript. Das Objekt kann ohne Daten instanziiert werden, sodass es das aktuelle Datum und die aktuelle Uhrzeit annimmt, oder es kann durch Angabe eines Datums als Wert erstellt werden, entweder in Millisekunden seit dem 1. Januar 1970 (z. B Unix-Zeit oder POSIX-Zeit aber ausgedrückt in Millisekunden statt Sekunden) oder die Angabe separater Werte für Jahr, Monat, Tag, Stunde...

    Das Objekt umfasst eine komplette Serie von Methoden zum Abfragen oder Einstellen von Datum und Uhrzeit:

    • now()
      Gibt das aktuelle Datum und die aktuelle Uhrzeit in Millisekunden seit dem 1. Januar 1970 zurück

    • getTime() | setTime()
      Ruft den Zeitwert in Millisekunden seit dem 1. Januar 1970 ab bzw. ändert ihn. Mit valueOf(), eine Methode, die in den meisten Objekten vorhanden ist, wird auch der Wert des entsprechenden Date-Objekts abgerufen, z getTime() mit Unix-Zeit oder POSIX-Zeit ausgedrückt in ms.

    • getMilliseconds() | setMilliseconds()
      Wird zum Abfragen oder Festlegen des Bruchteils einer Millisekunde des Objekts verwendet Date auf dem es ausgeführt wird. Bei Rückfrage liegt der erhaltene Wert zwischen 0 und 999, es können jedoch auch größere Werte zugewiesen werden, die sich im Gesamtdatum und der Gesamtzeit summieren, so dass es, wie die übrigen Get-Methoden, dazu dient, den Wert des Objekts zu erhöhen Date (oder verringern, wenn negative Werte verwendet werden).

    • getSeconds() | setSeconds()
      Gibt den Wert der Sekunden des Objekts zurück bzw. ändert ihn Date.

    • getMinutes() | setMinutes()
      Wird verwendet, um die Minuten des Objekts abzufragen oder festzulegen Date.

    • getHours() | setHours()
      Ermöglicht Ihnen, die Stunden (von 0 bis 23) des Objekts abzufragen oder zu ändern Date.

    • getDay()
      Gibt den Wochentag für das Datum zurück, ausgedrückt als Wert von 0 bis 6 (Sonntag bis Samstag).

    • getDate() | setDate()
      Gibt den Tag des Monats des Objekts zurück oder ändert ihn Date auf dem es angewendet wird.

    • getMonth() | setMonth()
      Wird verwendet, um die Monatsnummer des Objekts abzufragen oder zu ändern Date.

    • getFullYear() | setFullYear()
      Fragt den Jahreswert für das Objekt ab, das Datum und Uhrzeit enthält, oder legt diesen fest.

    Die bisherigen Methoden von Date Fügen Sie eine Version hinzu UTC um direkt mit der Weltzeit arbeiten zu können, ohne Zwischenrechnungen durchführen zu müssen. In diesem Sinne z.B. getHours() hat eine Version getUTCHours() o getMilliseconds() eine Alternative getUTCMilliseconds() wahlweise mit der offiziellen (gesetzlichen) oder Weltzeit zu arbeiten. Mit getTimezoneOffset() Sie können den Unterschied kennen, der zwischen der Weltzeit und der lokalen offiziellen Zeit besteht.

    JavaScript-Funktionen

    Wenn Sie dies lesen, wissen Sie sicherlich, wie man programmiert. Mikrocontroller en C oder C + + und kennen den Funktionsbegriff. Obwohl die Grundidee dieselbe ist, in JavaScript Die Art und Weise, wie sie definiert und verwendet werden, ist etwas anders. Zunächst wurde bereits gesagt: JavaScript Da Datentypen nicht explizit verwendet werden, müssen Sie diese beim Definieren der Funktion nicht angeben. Folgen, Es ist nicht zwingend erforderlich, dass eine Funktion einen Namen hat, sie kann anonym sein. Sie können mit einer Variablen verknüpft werden, um sie aufzurufen. Dies ist jedoch möglicherweise auch nicht erforderlich, da es manchmal sinnvoll ist, sie sofort aufzurufen, wobei die Klammern und Parameter nach der Definition der Funktion hinzugefügt werden.

    Um eine Funktion zu definieren, Präfix functionSchreiben Sie ggf. den Namen, die Argumente (die an die Funktion übergebenen Parameter) in Klammern und den Code, der ausgeführt wird, wenn die Funktion aufgerufen wird, in geschweifte Klammern.

    Sicherlich wurde die Variable „result“ im vorherigen Beispiel überhaupt nicht benötigt, aber es ist ein guter Vorwand, sich daran zu erinnern Variablenbereich, was wie erwartet funktioniert: Die Variable „result“ existiert nur innerhalb der Funktion „double“. In JavaScript kann auch benutzt werden letanstelle von var, um eine Variable auf einen Codeblockkontext zu beschränken (in geschweiften Klammern eingeschlossen), { y })

    Als im vorherigen Abschnitt über Objekte gesprochen wurde, fehlte etwas Grundlegendes: Eigenschaften wurden definiert, Methoden jedoch nicht. Wie erwartet, Objektmethoden sind Funktionen, sie haben keinen Namen und werden über den durch die Objektdefinition zugewiesenen (Eigenschafts-)Namen verwendet (aufgerufen).

    Im vorherigen Beispiel gibt es bereits eine Methode, „view_temperature“, die den Wert der Eigenschaft „current_temperature“ über die Konsole anzeigt. Es ist nicht sehr nützlich, vermittelt aber eine umfassendere Vorstellung davon, wie die Definition eines Objekts aussieht JavaScript.

    Um auf die Methoden eines Objekts (Funktionen) auf seine Eigenschaften zuzugreifen, verwenden Sie this, wie im vorherigen Beispiel in Zeile 11, wenn die Eigenschaft „current_temperature“ verwendet wird.

    Greifen Sie mit JavaScript auf das Document Object Model (DOM) zu

    Bei JavaScript Sie haben Zugriff auf den Inhalt der Webseite, auf der es ausgeführt wird, sowie auf einige Aspekte des Browsers, der diese Seite anzeigt, jedoch nicht auf Systemressourcen. Die Datenstruktur, die die Eigenschaften und Methoden unterstützt, auf die zugegriffen wird JavaScript Teil des Fensterobjekts, insbesondere den Inhalt des Objekts (des Dokuments). HTML) entspricht dem Objekt document. Obwohl es manchmal aus Gründen der Klarheit verwendet wird, ist es nicht notwendig, window den Methoden oder Eigenschaften voranzustellen, um auf sie zu verweisen. Es reicht beispielsweise aus, „window“ zu verwenden document, ist es nicht erforderlich, den Namen des Stammobjekts wie in zu schreiben window.document, solange auf das aktuelle Fenster verwiesen wird.

    Die am häufigsten verwendete Form von ein Objekt im Dokument finden HTML Es ist durch die Methode getElementById(), an den als Argument die ID übergeben wird, die beim Erstellen des Codes angegeben wurde HTML. Aufgrund der Erläuterungen in den vorherigen Abschnitten kann man leicht davon ausgehen, dass Sie auch auf die Komponenten innerhalb des Objekts zugreifen können document mit Punktsyntax (document.componente) oder Klammern mit dem Namen (document["componente"]), die nützlichsten, wie z. B. der numerische Index, schwierig zu verwenden und unpraktisch beim Zugriff auf den Inhalt einer manuell erstellten Webseite.

    Mit JavaScript kann Holen Sie sich das Element, das ein anderes Element enthält (Element oder übergeordneter Knoten). Beratung Ihrer Immobilie parentNode oder Ihr Eigentum parentElement, der Unterschied besteht darin, dass das übergeordnete Element (parentElement) des letzten Elements der Zeichenfolge DOM Es ist null (null) und der übergeordnete Knoten (parentNode) ist das Dokument selbst (document).

    zu den Inhalt eines Elements ändern HTML, zum Beispiel das eines Etiketts <div>, Es kann benutzt werden innerHTML und um seine Eigenschaften zu ändern, können Sie ihm eine andere Klasse zuweisen className oder ändern Sie seine Eigenschaften individuell mit style. Es ist nicht unbedingt sinnvoll, den von einem Element auf der Webseite angezeigten Stil zu konsultieren style da es von mehreren Faktoren abhängen kann oder einfach nicht explizit angegeben wurde. Um den Stil eines Elements zu überprüfen, das letztendlich auf der Webseite angezeigt wird, wird die Methode getComputedStyle verwendet.

    Zu einem Dokumentelement HTML Ihm können mehrere Klassen zugewiesen werden, um sein Aussehen und Verhalten zu bestimmen Verwalten Sie die Liste der Klassen eines Objekts von JavaScript zurückgegriffen werden kann classList das bietet die Methoden add um eine neue Klasse zur Liste hinzuzufügen, remove es zu entfernen, toggle um es zu ersetzen oder den Inhalt der Klassenliste eines Elements zu konsultieren item und contains, die die Klasse zurückgibt, die eine bestimmte Position in der Liste einnimmt, und einen Wert true o false ob eine bestimmte Klasse auf der Liste steht oder nicht.

    Im vorherigen Beispiel befindet es sich bei getElementById das Objekt, das Sie manipulieren möchten (ein Element). <div> seine id), vor Änderung des Erscheinungsbildes wird der Inhalt durch Zuweisen mit gelöscht innerHTML eine leere Textzeichenfolge, wird ihr eine neue Klasse zugewiesen className und sein Stil wird mit modifiziert style abhängig vom Wert des Inhalts (Temperatur), ggf. Veränderung der Farbe durch die Eigenschaft color. Sobald der Aspekt festgelegt ist, wird der Wert erneut mit geschrieben innerHTML.

    Im zweiten Teil des obigen Beispiels (Zeilen 9 bis 19) wird auf ein Codeelement zugegriffen HTML mit der Syntax document[] und das Grundstück id des Elements, um seine Klassenliste mit der Methode zu ändern classList.remove() und mit der MethodeclassList.add(), basierend auf dem Ergebnis mehrerer Abfragen, die in bedingten Ausführungen durchgeführt werden und anhand derer sie verglichen werden classList.contains().

    Wann wird es gehen sich auf ein Element beziehen HTML varias Mal im gesamten Code JavaScript, es ist ein bisschen effizienter, es einer Variablen zuzuweisen oder verwenden Sie seinen Index anstelle des Namens, da Sie andernfalls die Methode verwenden würden, die Sie verwenden würden JavaScript Um sie jedes Mal zu erhalten, müsste nach ihrem Namen gesucht werden, was etwas mehr Zeit in Anspruch nimmt, als wenn auf eine Variable zugegriffen würde.

    zu Fügen Sie dem Dokument neue Objekte hinzu HTML, können sie zunächst mit der Methode erstellt werden createElement de document und integrieren Sie sie später in die übrigen Elemente an der Stelle des Baums, die erforderlich ist appendChild. Um ein Objekt zu erstellen XML, wie Objekte SVG die wir zum Zeichnen des Diagramms der IoT-Sensoren verwenden, können Sie verwenden createElementNS (NS für Namensraum). Wie bereits erläutert, als wir über das Format gesprochen haben SVG, der Namespace, der ihm entspricht (für die aktuelle Version). http://www.w3.org/2000/svg, an die übergeben werden soll createElementNS als Argument zusammen mit dem Elementtyp, svg, in diesem Fall.

    Eine als Alternative innerHTML um Text als Inhalt zu einem Dokumentelement hinzuzufügen HTML ist die Methode createTextNode() Objekt document. Mit dieser Alternative können Sie neuen Text erstellen (auf den später zugegriffen wird, wenn er einer Variablen zugewiesen wird), der mit der Methode in den Objektbaum eingebunden wird appendChild(). Als als Alternative appendChild(), das den neuen Inhalt an das Ende dessen anfügt, was bereits in dem Knoten vorhanden ist, zu dem er hinzugefügt wird, können Sie verwenden die Methode insertBefore(), wodurch ein neues Objekt vor einem vorhandenen hinzugefügt wird. Tragen insertBefore() statt appendChild() stellt eine Methode bereit, die beispielsweise dazu dient Sortieren Sie neue Objekte vor vorhandenen wenn ein Element vor einem anderen stehen muss (z. B. in einer Liste) oder eine grafische Struktur überdecken oder überdecken muss, in der es Elemente gibt, die näher am Vordergrund oder Hintergrund liegen.

    Reagieren Sie mit JavaScript auf Ereignisse

    Wenn der Weg von Verwenden Sie eine Webseite als Container für IoT-verbundene Sensordiagramme es wurde benutzt onload Auf dem Etikett <body> um mit dem Zeichnen des Diagramms zu beginnen. Diese Eigenschaft ist den Codeobjekten zugeordnet HTML, bezieht sich auf Geschehen JavaScript. Wie bereits erläutert, führt es eine Funktion aus, wenn die Seite geladen wurde. Obwohl es mit dem Code in Verbindung gebracht wurde HTML Um es besser im Gedächtnis zu behalten, hätte es in den Code geschrieben werden können JavaScript als body.onload=dibujar; siendo dibujar Der Name der Funktion, die beim Laden der Webseite gestartet werden soll.

    In den neuesten Versionen von JavaScript Ereignisse können mit Funktionen verknüpft werden addEventListener mit dem Format objeto.addEventListener(evento,función); oder die Syntax verwenden objeto.evento=función; was auch in älteren Implementierungen funktioniert. Um die mit dem Ereignis verknüpfte Funktion aufzuheben, müssen Sie Folgendes tun: removeEventListener welches das gleiche Format hat wie addEventListener.

    JavaScript Es ist in der Lage, auf eine Vielzahl von Ereignissen zu reagieren, die auf einer Webseite auftreten können. Es kann beispielsweise erkennen, wann auf ein Element geklickt wird HTML mit onmousedown, oder wenn mit geklickt wird onclick, wenn eine Taste mit gedrückt wird onkeydown, indem Sie die Bildlaufleiste mit betätigen onscroll. Für unseren Zweck reicht es aus, wenn wir es tun Erkennen Sie das Laden der Seite mit onload und seine Größenänderung mit onresize. Wir werden diese Ereignisse mit den Objekten verknüpfen body y window Restaurants DOM jeweils. Der erste kann im Code zugewiesen werden HTML, wie gesehen und die zweite im Code JavaScript innerhalb der von der ersten aufgerufenen Funktion und mit dem Format window.onresize=redimensionar; siendo redimensionar Die Funktion, die jedes Mal aufgerufen wird, wenn sich die Fenstergröße ändert.

    Nach einem bestimmten Zeitintervall ausführen

    JavaScript hat zwei Ressourcen für aufgeschobene Ausführung: setTimeout, die eine Funktion nach einem Zeitintervall ausführt und setInterval die in jedem bestimmten Zeitintervall eine Funktion ausführt. Beide Methoden benötigen als Parameter (1) die aufgerufene Funktion und (2) das in Millisekunden ausgedrückte Zeitintervall. Um ihren Betrieb zu stoppen, können Sie das von diesen Funktionen zurückgegebene Ergebnis Variablen zuweisen und sie als Argument an übergeben clearTimeout oa clearInterval wenn Sie sie nicht erneut aufrufen möchten (oder wenn Sie nicht möchten, dass sie zum ersten Mal ausgeführt werden) setTimeout o setInterval jeweils.

    Im vorherigen Beispiel wird die Methode vorgestellt alert welches zur Anzeige eines Warnschildes dient. Obwohl es in der Vergangenheit weit verbreitet war, ist es derzeit fast aus dem Code verbannt JavaScript weil es so aggressiv (aufdringlich) ist, die Webseite mit einem Dialogfeld zu überdecken.

    In einem Programm, das für a geschrieben wurde Mikrocontroller einer Kleinserie (wie auf dem Teller). Arduino Uno) ist es üblich, globale Variablen zu verwenden, wie im vorherigen Beispiel in JavaScript, da der Code kurz und nicht besonders verwirrend ist, weil die Funktionen häufig ad hoc implementiert werden und weil die Verwendung globaler Variablen eine sehr einfache und intuitive Vorhersage der Speichernutzung ermöglicht, was in Systemen mit wenigen Ressourcen von entscheidender Bedeutung ist. Stattdessen, en JavaScript Es ist üblich, die Verwendung globaler Variablen auf das mögliche Minimum zu reduzieren. weil die Speichernutzung nicht beschleunigt werden muss, da es normal auf einem läuft CPU mit Ressourcen, die denen von a weit überlegen sind MCU, da es wahrscheinlich mit viel Code von Drittanbietern koexistiert, mit dem es ohne Beeinträchtigung arbeiten muss, und da es sich um ein offenes System handelt, kann der zukünftige Ausführungskontext nicht vorhergesagt werden (das Programm von a Mikrocontroller small seine Operation vollständig bestimmt, ohne weiteren Code hinzuzufügen, sobald es in Betrieb ist) und weil die Dimensionen der Anwendungen das Lesen erschweren könnten, wenn der Code seine Operation nicht kapselt und die Methoden so eigenständig wie möglich macht.

    Mathematische Operationen mit dem JavaScript Math-Objekt

    Die mathematischen Operationen komplizierterer mathematischer Berechnungen werden im Objekt gruppiert Math. Dieses Objekt wird direkt verwendet. Es ist nicht erforderlich, es zu instanziieren, um die darin enthaltenen Methoden oder Eigenschaften (Konstanten) zu verwenden.

    • Math.abs(n) Absolutwert des Parameters n
    • Math.acos(n) Arkuskosinus des Parameters n (Ergebnis im Bogenmaß)
    • Math.asin(n) Arkussinus des Parameters n (Ergebnis im Bogenmaß)
    • Math.atan(n) Arkustangens des Parameters n (Ergebnis im Bogenmaß)
    • Math.atan2(n,m) Arkustangens von n/m (Ergebnis im Bogenmaß)
    • Math.ceil(n) Runden Sie den Parameter auf die nächste ganze Zahl auf
    • Math.cos(α) Kosinus des Parameters α (α im Bogenmaß)
    • Math.E e-Nummer (≃2.718281828459045)
    • Math.exp(n) e auf den Parameter n erhöht: en
    • Math.floor(n) Runden Sie den Parameter n auf die nächste Ganzzahl ab
    • Math.log(n) Natürlicher Logarithmus (Basis e) des Parameters n
    • Math.LN2 Natürlicher Logarithmus (Basis e) von 2 (≃0.6931471805599453)
    • Math.LN10 Natürlicher Logarithmus (Basis e) von 10 (≃2.302585092994046)
    • Math.LOG2E Logarithmus zur Basis 2 von e (≃1.4426950408889634)
    • Math.LOG10E Logarithmus zur Basis 10 von e (≃0.4342944819032518)
    • Math.max(a,b,c,…) Größter Wert der übergebenen Parameterliste
    • Math.min(a,b,c,…) Kleinster Wert der übergebenen Parameterliste
    • Math.PI Zahl π (≃3.141592653589793)
    • Math.pow(n,m) Erster Parameter n auf den zweiten Parameter m erhöht: nm
    • Math.random() (Fast) Zufallszahl zwischen 0.0 und 1.0
    • Math.round(n) Runden Sie den Parameter n auf die nächste ganze Zahl
    • Math.sin(α) Sinus des Parameters α (α im Bogenmaß)
    • Math.sqrt(n) Quadratwurzel des Parameters n
    • Math.SQRT1_2 Quadratwurzel von 1/2 (≃0.7071067811865476)
    • Math.SQRT2 Quadratwurzel aus 2 (≃1.4142135623730951)
    • Math.tan(α) Tangens des Parameters α (α im Bogenmaß)

    Laden Sie Daten vom Server mit AJAX

    Die Methode zum Zeichnen der im IoT gespeicherten Informationen besteht darin, die Daten von Zeit zu Zeit vom Server zu laden und das Diagramm, mit dem sie dargestellt werden, neu zu zeichnen. Um Daten vom Server auszulesen, wird Technologie eingesetzt AJAX (Asynchrones JavaScript und XML) durch ein Objekt XMLHttpRequest de JavaScript. Das Zeichnen des Datendiagramms erfolgt durch Wiederverwendung eines Objekts SVG was bereits im Code steht HTML und das enthält ein Diagramm, dessen Koordinaten geändert werden, damit sie den neu geladenen Daten entsprechen.

    Im Beispiel dieses Vorschlags wird zusätzlich zur Aktualisierung der Zeichnung auch ein Text auf der Webseite aktualisiert, der für jedes Diagramm das Datum und den Wert der letzten gemessenen Daten anzeigt.

    Auf der Serverseite gibt es eine Datenbank, die die Informationen enthält dass die mit dem IoT verbundenen Sensoren überwacht haben. Diese Datenbank wird von der Objektanforderung gelesen XMLHttpRequest Antworten mit darin kodierten Informationen JSON-Format, obwohl der Name der verwendeten Methode auf einen Zusammenhang mit dem Format schließen lässt XML.

    Im ersten polaridad.es-Tutorial zum IoT-Datenspeicher Sie sehen ein Beispiel einer Infrastruktur zur serverseitigen Verwaltung der Informationen, die von Geräten bereitgestellt werden, die mit dem Internet der Dinge verbunden sind. In dieser Artikelserie wird ein Server als Ressource verwendet Apache von dem aus Sie die Programmiersprache nutzen können PHP um auf eine Datenbank zuzugreifen MySQL o MariaDB. Auf Servern, die zur IoT-Unterstützung eingesetzt werden, findet man häufig Datenbanken MongoDB (NoSQL) und die Programmiersprache JavaScript auf Node.js als Software-Infrastruktur.

    Die nächste Funktion ist dafür verantwortlich, die neuesten Daten von einem der Sensoren vom Server anzufordern. Beim Funktionsaufruf wird das Objekt als Argument verwendet JavaScript das die gezeichneten Daten unterstützt. Stellt derselbe Graph mehrere Werte dar, beispielsweise um visuell nach einer Korrelation zu suchen, kann eine Anfrage an den Server gestellt werden, mehrere gleichzeitig zurückzugeben, was aufgrund der Funktionsweise des Servers eine optimalere Methode ist. Protokoll HTTP.

    In der dritten Zeile des vorherigen Beispiels wird die an den Server gerichtete Abfrage vorbereitet, in der das Argument „zone“ übergeben wird, dessen Wert der Name oder Code des überwachten Ortes ist, da Informationen darüber vorliegen Bereich kann in derselben Datenbank koexistieren. Verschiedene Sensoren (z. B. Thermometer, die die Temperatur in verschiedenen Räumen messen). Der an die vorherige Funktion übergebene Parameter, das Objekt mit den Diagrammdaten, soll eine Eigenschaft mit dem Namen des Raums („name_suffix“) enthalten.

    Zwischen den Zeilen 7 und 14 des vorherigen Codes Objekt XMLHttpRequest welches in der Variablen „ajax“ gespeichert ist. Bevor Sie auswählen, wie das Objekt erstellt werden soll, führen Sie eine Suche durch window wenn XMLHttpRequest war nicht verfügbar (was in alten Versionen des Microsoft-Explorers passiert ist und obwohl es weit zurückliegt, dient es als Beispiel für Alternativen zum Erstellen des Objekts mithilfe der (nativeren) Syntax. Object.create o new, ähnlich wie bei anderen objektorientierten Sprachen.

    Um die Antwort sofort verwalten zu können, wird in den Zeilen 15 bis 26 der Code, der sie verarbeitet, vorbereitet, bevor die Anfrage an den Server gestellt wird.

    Der Weg von die Abfrage durchführen HTTP zum Server besteht aus eine Verbindung öffnen mit open Angabe von Typ und Seite (optional Benutzername und Passwort), Bereiten Sie die Überschriften vor des Protokolls mit setRequestHeader y Senden Sie die Anfrage mit send. Der Header HTTP Content-length Sie müssen die Länge der Abfrage (Anzahl der Zeichen) kennen, die anhand berechnet wird length.

    Wenn die Anfrage AJAX bereit ist, wird die mit dem Ereignis verknüpfte Funktion ausgeführt onreadystatechange. Anstatt eine Funktion zuzuweisen, wird im vorherigen Beispiel spontan eine anonyme Funktion definiert, die den Empfang der vom Server eingehenden Daten verwaltet. Zunächst wird in Zeile 18 überprüft, ob der Status der Anfrage „fertig“ ist, was dem Wert entspricht 4 des Eigentums readyState, dass der Status „OK“ ist Protokoll HTTP (Code 200), die bei der Unterkunft erhältlich sind status und dass die Daten, die angekommen sind, sind JSON-Format, Beratung der Immobilie responseType.

    Sobald überprüft wurde, dass der Status der Antwort wie erwartet ist, in Zeile 20 des vorherigen Beispiels erstellt ein Objekt mit dem Ergebnis und konvertiert den Text JSON. Die Antwort sieht ein zurückzugebendes Datum vor. Dadurch können wir sehen, ob das vom Server gesendete Ergebnis bereits zuvor im Diagramm dargestellt wurde, was in Zeile 21 überprüft wird. Wenn die Daten neu sind, wird in Zeile 23 die Funktion angezeigt ist dafür verantwortlich, das Diagramm mit den neuen Informationen neu zu zeichnen.

    Der Gedanke beim Vorschlag dieser Lesemethode besteht darin, dass die Daten sehr häufig aktualisiert werden. Wenn die präsentierten Informationen einem längeren Zeitraum entsprechen (z. B. die Temperaturen eines Tages oder einer Woche), kann eine erste Anfrage implementiert werden, die alle verfügbaren Daten sammelt, und dann eine, ähnlich der im Beispiel, die diese innerhalb dieser aktualisiert der Periodenkorrespondent.

    Generieren Sie Zufallsdaten zum Testen

    Wenn die gesamte Server- und Client-Infrastruktur bereit ist, ist eine Funktion wie die im vorherigen Abschnitt dafür verantwortlich, die Daten zu lesen und damit das Diagramm zu zeichnen In der Testphase kann es praktischer sein, Zufallszahlen innerhalb eines kontrollierten Bereichs zu verwenden um zu sehen, ob der geschriebene Code korrekt ist. Die folgende Funktion kann als Beispiel zum Abrufen von Daten beim Erstellen der endgültigen Anwendung dienen.

    Anstatt die Informationen aus einer Datenbank zu lesen, werden sie im obigen Beispiel zufällig generiert und an die Funktion übergeben, die für das Zeichnen des Diagramms verantwortlich ist. Die erfundenen Daten sind ein Vektor, der aus einem Datum, ausgedrückt als Wert in Millisekunden, dem Zeitpunkt der Aufzeichnung der Sensorinformationen und den überwachten Daten, die zwischen einem Maximalwert und einem Minimalwert liegen, gebildet wird.

    In diesem Beispiel kann die Generierung eines Datums bis zu einer Sekunde (1000 Millisekunden) gegenüber dem Datum zum Zeitpunkt der Erfindung verzögert werden. Als Math.random() erzeugt eine Zahl zwischen 0.0 und 1.0, ihre Multiplikation mit 1000 ergibt eine Zahl zwischen 0 und 1000, die dann in eine Ganzzahl umgewandelt wird. Auf die gleiche Weise erhält man den Wert, indem man die Zufallszahl mit dem Bereich (Maximum minus Minimum) multipliziert und das Minimum addiert.

    Zeichnen Sie das Diagramm der IoT-Sensoren mit einem SVG-Diagramm

    Da wir gesehen haben, wie wir die Werte, die wir darstellen möchten (im Beispiel die Temperatur), und ihren zeitlichen Ort erhalten, die zusammen in Form von Koordinaten ausgedrückt werden können, zeigt das folgende Beispiel eine Funktion zum Zeichnen eines Pfads das diese Punkte verbindet, und optional einen farbigen Bereich, der durch diese Linie oben begrenzt wird. Das Ergebnis würde wie das folgende Bild aussehen.

    Beispiel eines mit SVG und JavaScript erstellten Diagramms zur Darstellung von Daten von IoT-Sensoren

    Die horizontale Achse (X) des Diagramms stellt die Zeit dar und die vertikale Achse (Y) die Werte, die die mit dem IoT verbundenen Sensoren überwacht haben. Das horizontale Intervall beträgt einige Sekunden, da in diesem Vorschlag die Grafik sehr häufig (z. B. jede Sekunde) aktualisiert wird, um nahezu Echtzeitinformationen über den Zustand der Sensoren bereitzustellen.

    Im vorherigen Code gibt es zwei interessante Aspekte, erstens die Berechnung, die dies ermöglicht Passen Sie den dargestellten Wertebereich an und zweitens die Immobilienbau d was die Koordinaten der Punkte auf dem Layout angibt (path).

    Um den dargestellten Wertebereich anzupassen, werden diese von einem Minimum aus verschoben und so skaliert, dass die sichtbare Größe der Größe des Diagramms entspricht. Im Fall der Zeit wird der Offset ermittelt, indem der Bereich, den Sie anzeigen möchten, von der längsten Zeit (dem Datum und der Uhrzeit, die der aktuellen am nächsten liegen) (im Beispiel 20 Sekunden) subtrahiert wird. Die Verschiebung der Temperaturwerte entspricht dem unteren Bereich (ein Grad) minus dem niedrigsten Wert, sodass die unten gezeigten Daten dem niedrigsten zulässigen Wert am ähnlichsten sind, jedoch einen Spielraum lassen, der es uns ermöglicht, diejenigen zu schätzen, die dies tun . passieren

    Der Koeffizient, der die Zeitwerte multipliziert, um die horizontalen Koordinaten des Diagramms zu erhalten, wird erhalten, indem die Gesamtbreite des Diagramms (im Beispiel 100 Einheiten) durch den dargestellten Zeitbereich (im Beispiel 20 Sekunden) dividiert wird. Um den Koeffizienten mit den skalaren Temperaturwerten zu erhalten, muss berücksichtigt werden, dass der dargestellte Bereich von einer Spanne unter dem Mindestwert bis zu einer Spanne über dem Höchstwert reicht, in beiden Fällen ein Grad. Auf diese Weise ergibt sich der vertikale Skalierungskoeffizient aus der Division der Höhe des Diagramms (im Beispiel 100 Einheiten) durch den Maximalwert minus dem Minimalwert plus dem oberen und unteren Rand. Da sich diese Werte bei Minustemperaturen vollständig entwickeln könnten, verwenden wir Math.abs() den absoluten Wert der Differenz zu verwenden.

    Die Eigenschaft d Objekt path Es wird durch die Verkettung der Koordinaten der Punkte in einem Text erstellt. Jedem Koordinatenpaar ist ein Code vorangestellt SVG L, der eine Linie von der aktuellen Position zu einem durch die Koordinaten angegebenen Absolutwert zeichnet. Die X- und Y-Werte werden durch Kommas und jede Operation getrennt SVG wird durch ein Leerzeichen vom nächsten getrennt.

    Um das Layout zu starten, verwenden Sie den Code M (zu einer absoluten Koordinate bewegen). Beim geschlossenen und gefüllten Plot beginnt man unten rechts, beim offenen Plot, der das Datenprofil zeichnet, beginnt man mit dem zuletzt dargestellten Wert (dem aktuellsten). Um das geschlossene Layout fertigzustellen, wird der Code verwendet Z Als letzten Punkt wird derjenige hinzugefügt, der den gleichen X-Koordinatenwert wie der letzte Punkt der Linie hat, und als Y-Koordinate der kleinste dargestellte Wert.

    In diesem Beispiel die Funktion dibujar_grafico(), der Aufruf beim Laden der Seite, ruft die zu testenden Anfangswerte ab (nicht den letzten Echtzeitwert) und bereitet den Bereich vor, in dem die Daten gerendert werden: 20 Sekunden (20000 ms) horizontal und 15 °C innen vertikal von -5°C bis +10°C mit einem Grad oberen und unteren Rand. Rufen Sie zweimal an actualizar_grafico(), im ersten Durchgang true als Argument, das angibt, dass das Diagramm geschlossen werden soll, um einen gefüllten Bereich darzustellen, und beim zweiten Aufruf wird es übergeben false die Grenze ziehen. Jeweils das Objekt path „modifiziert“ ist diejenige, die das entsprechende Erscheinungsbild hat, im ersten Fall mit einer Füllung und ohne Rand und im zweiten Fall mit einer bestimmten Linienstärke und ohne Füllung.

    Die Funktion actualizar_grafico() an einem Objekt arbeiten SVG welches den folgenden Code als Container verwendet HTML. Das Objekt SVG enthält zwei Pfade, einen zum Zeichnen der Linie und einen zum Zeichnen des gefüllten Bereichs. Beim Laden der Webseite aus dem Element <body> die vorherige Funktion wird automatisch aufgerufen, dibujar_grafico() dank der Veranstaltung JavaScript onload.

    In Zeile 10 des Codes HTML Oben ist im Stil beispielsweise eine Breite von 820 px und eine Höhe von 150 px festgelegt (was in der finalen Version bei einer Klasse und einem Dokument sinnvoll sein wird). CSS). Es erscheint seltsam, dass die Zeilen 13 und 14 die Größe des Objekts definieren SVG etwa 100 % Breite und Höhe (was am besten zu den Abmessungen des Fensters passt, 100×100). Wie bereits erwähnt liegt der Grund dafür darin, immer mit bekannten Maßen zu arbeiten und die dargestellten Werte daran anzupassen. Die anderen Alternativen wären, jedes Mal den Raum des Diagramms zu berechnen und dann die Werte neu anzupassen oder feste Abmessungen für das Diagramm zu erzwingen, an die sich das Dokument halten muss.

    Ich habe mich für ein Diagramm entschieden, dessen Abmessungen sich je nach Code ändern HTML, ist es notwendig, die Immobilie einzubeziehen vector-effect mit dem Wert non-scaling-stroke um zu verhindern, dass die Linienstärke verformt wird, wenn das Diagramm nicht die gewählten 1:1-Proportionen auf der Webseite beibehält, auf der es angezeigt wird, wie es im vorherigen Vorschlag der Fall ist.

    Um das Diagramm zu „zuschneiden“ und nur den von Ihnen ausgewählten Bereich anzuzeigen, verwenden Sie viewBox. In diesem Fall haben wir uns dafür entschieden, den Teil des Diagramms anzuzeigen, der bei 0,0 beginnt (obere linke Ecke) und nach unten und rechts 100 x 100 misst. Der Teil der Zeichnung, der sich in Koordinaten mit negativen Werten oder größer als 100 befindet, wird nicht auf der Webseite angezeigt, selbst wenn er im Objekt vorhanden ist SVG

    Fügen Sie der SVG-Zeichnung neue Elemente hinzu

    Im vorherigen Beispiel die Funktion actualizar_grafico() Verwenden Sie ein Layout SVG zu dem der Eigentümer wechselt d, was die Koordinatenkette ausdrückt. Die Alternative wäre, bei jedem Neuzeichnen das gesamte Objekt zu erstellen. Der Vorteil der ersten Option besteht darin, dass das grafische Erscheinungsbild (z. B. Dicke oder Farbe) im Code definiert wird HTMLDie Einschränkung besteht darin, dass die Objekte zuvor erstellt werden müssen.

    Um SVG-Objekte zu erstellen, verwenden Sie createElementNS(), was das Einbeziehen der ermöglicht Namensraum. Im folgenden Beispiel wird ein neues Textobjekt erstellt (text) und ist einem Element zugeordnet SVG was bereits im Code vorhanden ist HTML der Website. Sobald das neue Element erstellt ist, werden dessen Eigenschaften mit zugewiesen setAttribute() und wird ergänzt SVG mit appendChild().

    Ändern Sie die Proportionen der Zeichnungselemente

    Wenn Sie versucht haben, mit der Funktion im Beispiel im vorherigen Abschnitt zu beschriften, werden Sie feststellen, dass der Text deformiert erscheint, wenn die Proportionen des Objekts auf der Webseite (width y height Von Code HTML) ist nicht gleich dem der dargestellten Fläche (viewBox). Um die Proportionen anzupassen, ist es notwendig, die Maße des Objekts zu kennen SVG Hierfür können Sie den Stil des Objekts oder des Containers konsultieren HTML, wenn das Objekt SVG dieses Eigentum übertragen. Eigentum zuweisen transform zu Objekten SVG die vom Anteil abhängen, kann die Verformung durch Anwenden einer Skalierungsoperation korrigiert werden scale() wobei sich der Koeffizient in X von dem in Y unterscheidet.

    SVG ermöglicht die Gruppierung mehrerer Objekte zu einem neuen Verbundelement, das auch Eigenschaften unterstützt, wie einfache Objekte. Um dieselbe Transformation auf eine Reihe von Objekten auf einmal anzuwenden, anstatt auf jedes Objekt einzeln, können Sie sie entsprechend dieser Ressource gruppieren und eine einzelne Eigenschaft anwenden transform an alle.

    Wie bereits erläutert, als wir darüber gesprochen haben SVG-Format, werden die Elemente einer Gruppe in die Beschriftungen eingeschlossen <g> y </g>. Zum Hinzufügen von JavaScript Elemente zu einer Gruppe SVG wird verwendet, wie im vorherigen Beispiel zu sehen ist, appendChild() sobald das neue Objekt definiert ist.

    Um beim Anwenden von Transformationen einen Ursprung festzulegen, kann die Eigenschaft auf Objekte angewendet werden SVG transform-origin, dessen Wert die X- und Y-Koordinaten des Punktes sind, von dem aus die Transformation beginnt. Wenn kein Wert für den Ursprung der Transformation angegeben wird (im Webbrowser), wird der Koordinatenmittelpunkt verwendet. Leider ist die Angabe des Verhaltens von Transformationen unter Verwendung einer anderen Quelle als der Standardquelle zum Zeitpunkt des Verfassens dieses Artikels nicht in allen Browsern einheitlich und sollte mit Vorsicht verwendet werden.

    Zusammen mit der Skalentransformation mit scale Es gibt andere, wie zum Beispiel Rotation mit rotation und die Bewegung mit translate, die ein Alternative zur grafischen Darstellung: Anstatt neue Koordinaten zu erhalten, können Sie sie in ihrem eigenen Raum darstellen und das Diagramm so transformieren, dass es in das Format passt, in dem Sie sie darstellen möchten.

    Fügen Sie Verweise zum Diagramm hinzu

    Nachdem nun der Hauptteil des Diagramms durch die Darstellung der Werte mit einem Profil und einer gefüllten Fläche aufgelöst ist, kann es mit Referenzen vervollständigt werden, die das Lesen erleichtern. Als Beispiel beginnen wir mit dem Zeichnen einiger horizontaler Referenzen (Linien), die die maximal und minimal akzeptablen Werte sowie einen gewünschten Wert markieren. Wie erläutert, können Sie die Objekte hinzufügen SVG direkt von JavaScript oder fügen Sie sie manuell in den Code ein HTML und ändern Sie sie später mit JavaScript.

    Es erscheint logisch, diese horizontalen Verweise mit Text zu kennzeichnen, der den Wert, den sie darstellen, verdeutlicht. Um den Text hervorzuheben, können Sie Rechtecke verwenden, die sich vom Hintergrund und der Grafik abheben. Da die Texte skaliert werden müssen, um die Verformung auszugleichen, können sie alle in einem Objekt gruppiert werden, auf das die Skalierung angewendet wird; Der Hauptvorteil dieser Vorgehensweise besteht darin, dass sie in einem einzigen Vorgang geändert werden können, wenn die Größe des Diagrammcontainers (des Browserfensters) geändert wird und sich das Verhältnis ändert, das durch die Skalierung korrigiert wird.

    Der obige Beispielcode enthält mehrere interessante Aspekte. Beachten Sie zunächst, dass Konstanten (globale Variablen) verwendet wurden, um das Beispiel für Benutzer, die mit der Programmierung beginnen, lesbarer zu machen. Mikrocontroller en C oder C + +. Wie man später sehen wird, ist die optimale Art und Weise, es einzuprogrammieren JavaScript Es würde Objekte verwenden, die diese Werte und Methoden enthalten würden, die die Referenzen in diesem Beispiel oder das Diagramm im Allgemeinen in einem Produktionssystem verwalten würden.

    Andererseits wurden im Zuge der Weiterentwicklung des allgemeineren Codes separate Funktionen entwickelt, die die verschiedenen Koeffizienten berechnen, die die Proportionen des Diagramms korrigieren, um den Text anzupassen proporcion_grafico(), die Skala der Werte in Abhängigkeit von ihrem Bereich escala() und einen Korrekturfaktor für Messungen, deren Absolutwert bekannt ist, wie beispielsweise Messungen in Referenzen medida_grafico().

    Das Lesen dieses Codes sollte helfen, den Kontext zu klären, in dem eine Anwendung wie diese funktioniert, die Grafiken in Echtzeit zeichnet und flexibel sein muss, um in verschiedenen grafischen Kontexten (zumindest in verschiedenen Größen und Proportionen) dargestellt zu werden. Zunächst müssen die Objekte generiert werden SVG, entweder „manuell“ im Code HTML, entweder durch Code JavaScript und in jedem Fall müssen anschließend Verweise auf diese Objekte abgerufen werden, um sie zu manipulieren JavaScript damit neue Diagramme gezeichnet werden können und die Darstellung eines bereits gezeichneten Diagramms an eine Änderung des Mediums, in dem es präsentiert wird, angepasst werden kann.

    Eine weitere Referenz, die die Interpretation eines Diagramms erleichtern kann, sind die Punkte, die bestimmte Werte darstellen (die Knoten der Linie). In diesem Beispiel, in dem wir eine einzelne Größe darstellen, ist die Wahl eines Symbols nicht kritisch, aber wenn mehrere verschiedene Werte überlagert werden, um nach Korrelationen zu suchen, ist es interessant, zusätzlich zur Verwendung anderer Ressourcen wie der Farbe zu unterscheiden , indem Sie verschiedene Symbole zeichnen. Die für den Linienknoten verwendeten Grafiken müssen in Größe und Proportion geändert werden, wie dies beispielsweise bei Texten der Fall ist, damit ihre Abmessungen absolut sind und ihre Proportionen auch dann erhalten bleiben, wenn sich die des darin enthaltenen Felds ändern. der Grafik.

    Im vorherigen Beispiel haben wir bereits gesehen, wie die verschiedenen Koeffizienten berechnet werden, um die Proportionen der Zeichnung neu zu skalieren und zu korrigieren; Was die Implementierung der Verwaltung der Symbole der Knoten oder Eckpunkte des Diagramms betrifft, könnte eine mögliche Lösung darin bestehen, die Objekte zu speichern SVG in einen Vektor umwandeln und seine Position ändern, wenn das Diagramm durch Lesen eines neuen Werts aktualisiert wird oder wenn es durch Ändern der Containergröße neu gezeichnet wird. Im ersten Fall müsste seine Lage geändert werden und im zweiten Fall sein Verhältnis zum Grundstück transform und der Wert von scale. Der folgende Code ist eine Modifikation der Funktion actualizar_grafico() um die Neupositionierung der Diagrammscheitelpunktsymbole einzuschließen.

    An der Funktion vorgenommene Änderungen actualizar_grafico() um die neue Funktion zu erhalten actualizar_grafico_puntos() Dies sind diejenigen, die im Code des vorherigen Beispiels hervorgehoben wurden. Zunächst nehmen wir in Zeile 5 einen Vektor von Objekten SVG als Parameter. Dieser Vektor enthält die Symbole, die in den neuen Knoten des Diagramms neu positioniert werden müssen.

    In den Zeilen 39 und 40 werden die neuen Koordinaten des Mittelpunkts zugewiesen, cx y cy, zu denen der Werte, die dargestellt werden. Wenn das Symbol nicht auf der Mitte basiert, muss wahrscheinlich ein Versatz hinzugefügt werden cx halbe Breite und Zoll cy der halben Höhe, um sie exakt auf dem Diagrammknoten neu zu positionieren.

    In den Zeilen 57 bis 61 werden die Punkte, die Koordinaten entsprechen, die nicht gezeichnet werden, weil sie vom linken Rand abgeschnitten werden, außerhalb des Diagramms neu positioniert. Die Koordinate von cy auf Null und das von cx auf eine beliebige negative Zahl (größer als der Punkt selbst), so dass sie nicht angezeigt wird, wenn sie, wie der linke Teil des Diagramms, durch das Fenster des geschnitten wird SVG.

    Verwalten Sie das Diagramm von einem Objekt aus mit JavaScript

    Alle bisher erläuterten Operationen können in ein Objekt integriert werden, um das Diagramm mit einem Stil zu verwalten, der typischer für die neuen Versionen von ist JavaScript. Diese Implementierungsalternative hat den zusätzlichen Vorteil, dass sie die Einbindung mehrerer Diagramme mit unterschiedlichen Werten auf derselben Webseite vereinfacht.

    Bevor wir die Implementierung besprechen, werfen wir einen Blick auf die gängigsten Methoden zum Erstellen von Objekten JavaScript und einige Besonderheiten der Funktionen, die sich auf den Vorschlag zum Zeichnen von IoT-Sensorgrafiken auswirken.

    Es wurde bereits erklärt, dass die neue Art der Objekterstellung in JavaScript (verfügbar seit Version 5 von ECMAScript) besteht aus der Verwendung Object.create, an die man sich gewöhnen sollte, anstelle des „Klassikers“ zu verwenden new, was natürlich immer noch korrekt funktioniert, obwohl sein Zweck eher darin besteht, den Stil von Sprachen mit klassenbasierten Objekten zu simulieren (JavaScript basiert die Erstellung von Objekten auf Prototypen) als eine funktionierende Alternative.

    Mit dem vorherigen Code können Sie sich die Unterschiede zwischen der Erstellung der Objekte merken Object.create oder new. Es dient auch dazu, die Funktion hervorzuheben, mit der das Objekt erstellt wird new kann sich an einer beliebigen Stelle im Code befinden. Das Objekt muss bereits vorhanden sein, bevor es instanziiert werden kann Object.create (ES5_Object-Objekt ist keine Funktion).

    In den Zeilen 3 und 4, um einen Standardwert für die Eigenschaften in der Funktion festzulegen, mit der das Objekt erstellt wird new, jeder Eigenschaft wird der Wert des entsprechenden Arguments zugewiesen oder (||), wenn keine Argumente übergeben wurden, also undefiniert sind (undefined), da dieser Umstand als bewertet wird false, wird der Standardwert zugewiesen.

    Der Kontext, in dem eine Funktion ausgeführt wird JavaScript wirft zwei Probleme auf, die es zu beachten gilt und die auch verwirrend sein können, wenn man diese Programmiersprache verwendet, nachdem man mit anderen zusammengearbeitet hat, wie z C o C + +, in unserem Fall. Der Kontext umfasst die im Bereich der Funktion definierten Variablen (und die globalen), was übrigens ein interessantes Konzept aufwirft, die „Abschlüsse“, die einen gesamten Programmierstil festlegen JavaScript. Allerdings war damit zu rechnen this, das sich auf das Objekt bezieht, wenn es innerhalb des Codes verwendet wird, der es definiert, der Ausführungskontext, in dem es definiert wurde, bleibt erhalten, aber der verwendete Kontext ist der Kontext, aus dem die Funktion aufgerufen wird. Dieses Verhalten ist in den meisten Fällen transparent, es gibt jedoch zwei Umstände, unter denen es verwirrend sein kann: eine Funktion, die in einer anderen Funktion definiert ist, und eine Methode, die von einem Ereignis des Objekts aufgerufen wird. window.

    Beim Ausführen des vorherigen Codes wird der kommentierte Text am Ende in der Konsole angezeigt. Die beiden markierten Linien spiegeln Verhalten wider, das verwirrend sein kann: den Funktionsausführungskontext probar_dentro() nicht probar(), wie zu erwarten war, aber window, das die globalen Variablen und nicht die gleichnamigen Eigenschaften anzeigt. Wenn Sie dieses Verhalten nicht wünschen, erstellen Sie einfach eine Variable in der Funktion der höchsten Ebene und weisen Sie sie zu this, wie im folgenden Code.

    Zur Steuerung des Ausführungskontexts, wenn eine Methode von einem Ereignis aufgerufen wird window, beispielsweise durch Größenänderung des Browserfensters, eine weitere Besonderheit von JavaScript: die Möglichkeit, „Funktionsfabriken“ zu programmieren, also Funktionen, die andere Funktionen generieren und diese mit zurückgeben return.

    Im obigen Beispielcode die Methode llamar() der Objekte Contexto Es erledigt die Arbeit nicht, sondern gibt eine anonyme Funktion zurück, die sich darum kümmert. Um zu überprüfen, ob alles wie erwartet funktioniert, gibt es eine globale Variable mit demselben Namen wie die Eigenschaft, die die Funktion in der Konsole anzeigt. Bei korrektem Kontext wird der Wert der Eigenschaft angezeigt und nicht der der globalen Variablen.

    JavaScript Versuchen Sie, die Semikolons zu korrigieren, die wir am Ende der Sätze weglassen. Dies ermöglicht einen entspannten Schreibstil, ist jedoch ein zweischneidiges Schwert, mit dem vorsichtig umgegangen werden muss. Um die unerwünschten Auswirkungen zu vermeiden, die dadurch bei Ausdrücken entstehen, die mehrere Zeilen einnehmen, können Sie in den meisten Fällen Klammern verwenden oder der Art und Weise voranstellen JavaScript wird den Code interpretieren; Deshalb enthält Zeile 8 des Beispiels function dahinter return, wenn ich eine andere Zeile verwendet hätte, wäre die Bedeutung ganz anders. Meiner Meinung nach besteht die am besten lesbare Lösung darin, eine Zwischenvariable (verzichtbar) zu verwenden, wie in der folgenden Version; Sobald das Verhalten verstanden ist, liegt die Entscheidung natürlich beim Programmierer.

    Im gleichen Sinne wie die Auswertung eines Ausdrucks als Funktion, d. h. Rückgabe einer Funktion und nicht des Werts, den die Funktion zurückgibt; in Zeile 21 des letzten Beispiels (es war in Zeile 19 des vorherigen Beispiels) endet es mit clearInterval die mit aufgerufene Funktion setInterval. Damit es 30 Sekunden lang wirkt, wird der Stopp mit verzögert setTimeout, was wiederum eine Funktion als erstes Argument benötigt; um die Ausführung als Parameter zu liefern clearInterval mit der Variablen, die den periodischen Aufruf enthält (und nicht mit der Funktion). clearInterval) ist der Zweck der anonymen Funktion in der letzten Zeile.

    Die Wahl zwischen dem Schreiben des Codes, der die Funktionsdefinition integriert, kompakter (wie in Zeile 21) oder der Verwendung einer meiner Meinung nach besser lesbaren Hilfsvariablen (wie in den Zeilen 19 und 20), variiert kaum in der Leistung und hängt mehr von Stil und Lesbarkeit ab Wartung.

    Um den Code zu testen, bevor Daten auf dem Server vorliegen, können Sie einen Generator von Zufallswerten im gewünschten Bereich verwenden oder Tabellen mit kontrollierten Werten erstellen, die den Betrieb unter den gewünschten Bedingungen simulieren. Das folgende Beispiel verwendet einen einfachen Datengenerator über den gesamten Bereich, weshalb sie etwas übertrieben erscheinen.

    Zum Testen können Sie Laden Sie den vollständigen Code des Beispiels herunter gebildet durch eine geschriebene Webseite HTML, der Stil CSS und der Code JavaScript. Letzteres ist am relevantesten, da die anderen Komponenten nur minimale Unterstützung bieten, sehr vereinfacht sind und in den Artikeln in den entsprechenden Abschnitten viel weiter entwickelt werden.

    Geben Sie Anmerkung

    Sie können vermisst haben