JavaScript を使用して、IoT に接続されたセンサーからのデータの SVG グラフィックを生成および変更します

JavaScript を使用して、IoT に接続されたセンサーからのデータの SVG グラフィックを生成および変更します

JavaScript を使用して、IoT に接続されたセンサーからのデータの SVG グラフィックを生成および変更します

描画に関する一連の記事の最後の部分です。 モノのインターネットに接続されたセンサーからのデータを含むグラフィックスで生成または変更する方法について説明します。 JavaScriptを 形式の図面 SVG そしていくつかの要素 HTML コンテナとして機能するか、グラフィックスに補足的な情報を提供するもの。

目次

    HTML 内のモノのインターネット (IoT) コンテナーに接続されたセンサーからのデータ グラフモノのインターネット (IoT) に接続されたセンサーからのデータのグラフ CSS での外観の定義モノのインターネット (IoT) に接続されたセンサーからのデータ グラフを SVG で描画モノのインターネット (IoT) に接続されたセンサーからのデータ グラフ JavaScript による生成と変更

    このチュートリアルの対象ユーザーは、エレクトロニクスおよびコンピューター プログラミングのプロファイルを作成することになっています。 マイクロコントローラー、彼らはよく知らないかもしれません。 HTML, CSS o SVG;このため、前回の記事では、言語または対応するテクノロジについて簡単に説明しました。この最後の部分では、アプローチが少し異なります。読者は確かにプログラミング方法を知っているため、言語を使用する可能性があります。 C + + その方法 JavaScriptを、基本的な構文を共有します C 基本的なプログラミング概念のほとんどをスキップして、相違点と、IoT でセンサー グラフィックスを作成する際の関心のある特定の使用法に焦点を当てるための参考資料として捉えることができます。

    名前は、最初の違いを理解する手がかりを与えます。 JavaScriptを プログラミング言語です スクリプト (ハイフン) したがって、それは 解釈された、コンパイルする必要はありません。その文脈 スクリプト (Web ブラウザなど) が注文を読み取り、翻訳し、実行します。正確に言うと、ほとんどの場合、 ランタイムコンパイル(JIT)ただし、コードを書くプロセスに関しては JavaScriptを それは私たちには影響しません。コードを書くだけで機能します。

    この名前には最初の混乱も含まれています。 JavaScriptを ~とは全く関係がありません Java。開発当初は、 ネットスケープ そのブラウザでは、最初は Mocha と呼ばれ、次に、より混乱の少ない LiveScript と呼ばれました。ブラウザでの実装が成功し、ブラウザを超えた後、次のように標準化されました。 ECMAScriptの (AT ECMA-262、バージョン 6 執筆時点では)、それを実装するブラウザに関して中立的になるためです。現在では標準規格もあります ISO 5 年バージョン 2011 以降 (ISO / IEC 16262:2011 記事執筆時点)

    JavaScript の変数、基本データ型、オブジェクト

    たとえば、次のような場合とは異なります。 C + +, en JavaScriptを 変数の宣言時にデータ型が含まれていない また、変数に関連付けられた型は固定されていないため、プログラムの実行中に別の型の値を割り当てる可能性があります。

    前の例では、変数「thing」が (データ型を示さずに) 宣言されており、その後、別の型のデータが割り当てられ、それが参照されます。 typeof というタイプ JavaScriptを 彼が解釈したことだ。コードをデバッグするには、Web ブラウザのインス​​ペクター コンソール (Web のプレゼンテーションには影響しません) にコードを記述します。 console.log().

    データを特定の型、特にテキストから数値に強制的に変換するには、次のような関数を使用できます。 parseInt() o parseFloat() それぞれ整数または浮動小数点数に変換されます。逆の変換は次のように行うことができます String()ただし、通常は自動変換で十分であるため、必要になる可能性は低いです。と parseFloat()たとえば、オブジェクトの幅や高さなど、単位を含む Web ページ プロパティの値を取得できます。このように、表現は、 parseFloat("50px"); 結果として数値 50 が返されます。

    En JavaScriptを 二重引用符と一重引用符の区別はありません;どちらの場合もデータ型は次のとおりです。 string、エスケープ コードを必要とせずに、それぞれにもう一方を含めることができます。

    前の例では、変数が宣言されている (存在している) が値が割り当てられていない場合、その変数には未定義のデータ型が含まれていることがわかります (undefined)。未割り当てのオブジェクトには次の値があります null;つまり、オブジェクトは存在しますが、値はありません。それを参照する変数には、 typeof undefined シノ object。オブジェクトは空にすることもできます。つまり、null ではなく、プロパティを持たないこともあります。

    オブジェクトを定義する JavaScriptを 中括弧 ({ y }) コロン記号 (:) プロパティ名 プロパティ値とカンマ (,) 異なるプロパティ。オブジェクトを表現するこの方法の詳細については、次の記事を参照してください。 JSON形式.

    別の考えにつながる可能性のある構文を使用することもできますが、 en JavaScriptを プロトタイプ以外にクラスはありませんつまり、オブジェクトがプロパティとメソッドを継承するために、他のオブジェクト (子) が参照として使用する別のオブジェクト (プロトタイプ) が作成されます。のスタイルに最も近い構文 JavaScriptを プロトタイプを使用することは Object.create を使用することも可能です (そして場合によっては便利です) new 他のオブジェクト指向言語と同様です。

    あるオブジェクトが別のオブジェクトのインスタンスであるかどうかをクエリする、プロトタイプとして使用する場合、そのプロパティを継承する場合、つまり、次のように使用できます。 instanceof (で作成 new)または isPrototypeOf (で作成 Object.create) オブジェクトがプロトタイプを使用する場合は true、使用しない場合は false と評価されます。

    別のオブジェクトをプロトタイプとして使用してオブジェクトが作成されると、つまりオブジェクトがインスタンス化されると、そのオブジェクトは 新しいプロパティを追加するか、プロトタイプのプロパティをオーバーライドします 次のようなドット構文を使用します gato.peso=2.5.

    La の配列 JavaScriptを それらはあなたがおそらく知っているものとは異なります C。まず、それらは長さを示す必要がなく、開き角かっこと閉じ角かっこの記号のみを使用して宣言されます ([ y ])、コンポーネントは異種 (同じ配列内の異なるデータ型) にすることができ、制限に制限されることなく新しい要素を追加できます。の行列 JavaScriptを 実際には要素のリスト (コレクション) です。 数値インデックスまたは名前によって参照される。配列には数値インデックスと要素名を同時に含めることができますが、XNUMX 番目のタイプを活用するにはオブジェクト (プロパティ) を使用するのが一般的です。

    前の例でわかるように、変数が配列 (配列オブジェクトである) のインスタンスに対応するかどうかを確認するには、次のコマンドを使用できます。 instanceof、すでに汎用オブジェクトで使用されているか、またはより新しいバージョンの JavaScriptを 頼ることができます Array.isArray()

    配列の要素にアクセスするには、そのインデックス (matriz[7])、または角かっこ内の名前を含むプロパティ名 (matriz["nombre"]) またはオブジェクトの通常のドット構文 (matriz.nombre)。名前はテキスト文字列であるため、変数を含む式を使用して作成できます。プロパティを含む配列をループするには、次の形式のループを使用できます。 for(propiedad in matriz).

    私たちの治療目的にとって興味深いのは、 オブジェクト Date、日付と時刻を表現および管理するために使用します。 JavaScriptを。オブジェクトはデータなしでインスタンス化できるため、現在の日付と時刻を取得することも、1 年 1970 月 XNUMX 日からのミリ秒単位で日付を値として指定して作成することもできます (例: Unix 時間または POSIX 時間 ただし、秒ではなくミリ秒で表現されます)、または年、月、日、時間などの個別の値を指定します。

    オブジェクトには、一連の完全なオブジェクトが含まれています。 日付と時刻をクエリまたは設定するメソッド:

    • now()
      1 年 1970 月 XNUMX 日からの現在の日付と時刻をミリ秒単位で返します。

    • getTime() | setTime()
      1 年 1970 月 XNUMX 日からの時間値をそれぞれミリ秒単位で取得または変更します。 valueOf()これはほとんどのオブジェクトに存在するメソッドですが、対応する Date オブジェクトの値も取得されます。 getTime() とともに Unix 時間または POSIX 時間 ミリ秒で表されます。

    • getMilliseconds() | setMilliseconds()
      オブジェクトのミリ秒の小数部をクエリまたは設定するために使用されます。 Date それが実行される上で。参照すると、取得される値は 0 ~ 999 ですが、合計日付と時刻に累積されるより大きな値を割り当てることができるため、他の get メソッドと同様に、オブジェクトの値を増やすのに役立ちます。 Date (負の値が使用されている場合は、値を減らします)。

    • getSeconds() | setSeconds()
      オブジェクトの秒の値をそれぞれ返すか変更します Date.

    • getMinutes() | setMinutes()
      オブジェクトの議事録を参照または設定するために使用されます Date.

    • getHours() | setHours()
      オブジェクトの時間 (0 ~ 23) を参照または変更できます。 Date.

    • getDay()
      日付の曜日を 0 ~ 6 (日曜日から土曜日) の値で返します。

    • getDate() | setDate()
      オブジェクトの日付を返すか変更します。 Date それが適用されます。

    • getMonth() | setMonth()
      オブジェクトの月番号を参照または変更するために使用されます Date.

    • getFullYear() | setFullYear()
      日付と時刻を含むオブジェクトの年の値をクエリまたは設定します。

    以前の方法 Date バージョンを含める UTC 中間計算を行わずに世界時を直接操作できるようになります。そういう意味では、例えば、 getHours() バージョンがあります getUTCHours() o getMilliseconds() 代替案 getUTCMilliseconds() 公式(法定)時間または世界時と交互に動作します。と getTimezoneOffset() 世界時と地方公時の間に存在する違いを知ることができます。

    JavaScript関数

    これを読んでいるあなたは、きっとプログラミングの仕方を知っているはずです。 マイクロコントローラー en C またはで C + + そして関数の概念を知る。基本的な考え方は同じですが、 JavaScriptを それらの定義と使用方法は少し異なります。まず最初に、すでに言われていますが、 JavaScriptを データ型を明示的に使用しないため、関数を定義するときにデータ型を指定する必要はありません。。フォローするには、 関数に名前を付けることは必須ではなく、匿名でもかまいません。これらを呼び出すために変数に関連付けることもできますが、関数の定義の後に括弧とパラメーターを追加してすぐに呼び出すと便利な場合もあるため、必ずしも必要でない場合もあります。

    関数を定義するには、接頭辞を付けます function、該当する場合は、名前、引数 (関数に渡されるパラメーター) を括弧内に記述し、関数が呼び出されたときに実行されるコードを中括弧内に記述します。

    確かに、前の例では「result」変数はまったく必要ありませんでしたが、これは次のことを覚えておく良い言い訳になります。 変数スコープこれは期待どおりに機能します。「result」変数は「double」関数内にのみ存在します。で JavaScriptを も使用できます letの代わりに var、変数のスコープをコード ブロック コンテキストに設定します (中括弧で囲まれています)。 { y })

    前のセクションでオブジェクトについて説明したとき、基本的なものが欠けていました。プロパティは定義されていますが、メソッドは定義されていませんでした。予想通り、 オブジェクトメソッドは関数です、それらには名前がなく、オブジェクト定義によって割り当てられた(プロパティ)名から使用(呼び出されます)します。

    前の例には、コンソールを介して「current_temperature」プロパティの値を表示するメソッド「view_temperature」がすでに存在します。あまり便利ではありませんが、オブジェクトの定義がどのようなものであるかについてより完全なアイデアが得られます。 JavaScriptを.

    オブジェクトのメソッド (関数) のプロパティにアクセスするには、次を使用します。 this11 行目の前の例と同様に、「current_temperature」プロパティを使用する場合。

    JavaScript を使用してドキュメント オブジェクト モデル (DOM) にアクセスする

    から JavaScriptを システム リソースにはアクセスできませんが、Web ページが実行される Web ページのコンテンツや、そのページを表示するブラウザの一部にはアクセスできます。 からアクセスされるプロパティとメソッドをサポートするデータ構造 JavaScriptを ウィンドウオブジェクトの一部、具体的には、オブジェクト (ドキュメント) のコンテンツ HTML) オブジェクトに対応します document。わかりやすくするために使用されることもありますが、メソッドやプロパティを参照するためにウィンドウの前に置く必要はありません。たとえば、次のように使用するだけで十分です。 documentのように、ルート オブジェクトの名前を記述する必要はありません。 window.document現在のウィンドウが参照されている限り。

    最もよく使われる形式は、 文書内のオブジェクトを見つける HTML それはメソッドを通じてです getElementById()、コード作成時に指定したidが引数として渡されます。 HTML。前のセクションで説明したことから、オブジェクト内のコンポーネントにもアクセスできると容易に推測できます。 document ドット構文を使用する (document.componente) または両方の名前を使用した括弧 (document["componente"])、数値インデックスなどの最も便利なものは、手動で作成された Web ページのコンテンツにアクセスする場合には使用が難しく、実用的ではありません。

    とともに JavaScriptを かもしれない 別の要素 (要素または親ノード) を含む要素を取得します あなたの財産を相談する parentNode またはあなたの財産 parentElementの違いは、親要素 (parentElement) 文字列の最後の要素 DOM ヌルです(null) と親ノード (parentNode) はドキュメント自体です (document).

    要素の内容を変更する HTML、たとえばラベルのもの <div>、使用できます innerHTML そのプロパティを変更するには、次のようにして別のクラスを割り当てることを選択できます。 className またはそのプロパティを個別に変更します style。 Web ページ上の要素によって表示されるスタイルを参照することは、必ずしも有用であるとは限りません。 style それは、いくつかの要因に依存するか、単に明示的に指定されていない可能性があるためです。 最終的にWebページに表示される要素のスタイルを確認するには、getComputedStyleメソッドを使用します。.

    文書要素へ HTML いくつかのクラスをそれに割り当てて、その外観と動作を決定できます。 オブジェクトのクラスのリストを管理する JavaScriptを 頼ることができます classList メソッドを提供する add 新しいクラスをリストに追加するには、 remove それを削除するには、 toggle それを置き換えるか、要素のクラス リストの内容を参照するには itemcontains、リスト内の特定の位置を占めるクラスと値を返します。 true o false 特定のクラスがリストにあるかどうか。

    前の例では、次の場所にあります。 getElementById 操作したいオブジェクト (要素) <div> 彼のために id)、外観を変更する前に、で割り当ててコンテンツを削除します。 innerHTML 空のテキスト文字列の場合は、次のような新しいクラスが割り当てられます。 className そしてそのスタイルは次のように変更されます style コンテンツの値 (温度) に応じて、該当する場合はプロパティを通じて色を変更します。 color。アスペクトが確立されると、値は再度使用して書き込まれます。 innerHTML.

    上記の例の 9 番目の部分 (19 行目から XNUMX 行目) では、コード要素にアクセスします。 HTML 構文を使用する document[] そしてその財産 id 要素のクラスリストをメソッドで変更する classList.remove() そしてメソッドを使ってclassList.add()、条件付き実行で実行されるいくつかのクエリの結果に基づいて、以下を使用して比較します。 classList.contains().

    いつ行くの? 要素を参照する HTML varias コード全体で何度も JavaScriptを、それは少しです 変数に代入する方が効率的です または、名前の代わりにそのインデックスを使用します。それ以外の場合は、使用するメソッドが JavaScriptを 毎回取得するにはその名前を検索する必要があり、変数にアクセスする場合よりも少し時間がかかります。

    新しいオブジェクトをドキュメントに追加する HTML、最初にメソッドで作成できます。 createElement de document そして後でそれらをツリーの必要な時点で残りの要素に組み込みます。 appendChild。オブジェクトを作成するには XML、オブジェクトのような SVG IoT センサーのグラフを描画するために使用します。 createElementNS (NS の場合 ネームスペース)。形式について説明したときに説明したように、 SVG、それに対応する名前空間 (現在のバージョンの場合) は次のとおりです。 http://www.w3.org/2000/svgに渡す必要があります createElementNS 要素の型とともに引数として指定します。 svg、 この場合。

    A の代替 innerHTML テキストをコンテンツとしてドキュメント要素に追加するには HTML 方法です createTextNode() オブジェクト document。この代替手段を使用すると、次のことができます 新しいテキストを作成する (変数に割り当てられている場合は後でアクセスされます) メソッドを使用してオブジェクト ツリーに組み込まれます appendChild()。 いいね の代替 appendChild()、追加先のノードに既に存在するコンテンツの末尾に新しいコンテンツを追加します。次のように使用できます。 メソッド insertBefore()、既存のオブジェクトの前に新しいオブジェクトを追加します。着る insertBefore() 代わりに appendChild() たとえば、次のような機能を果たすメソッドを提供します。 新しいオブジェクトを既存のオブジェクトの前に並べ替える 前景または背景に近い要素があるグラフィック構造で、ある要素が別の要素の前にある必要がある場合 (リストなど)、またはその要素を覆い隠す必要がある場合。

    JavaScript を使用してイベントに反応する

    の方法のとき IoT に接続されたセンサー グラフのコンテナとして Web ページを使用する 使われた onload ラベルに <body> をクリックしてグラフの描画を開始します。このプロパティは、コード オブジェクトに関連付けられています HTML、 を参照 イベント JavaScriptを。すでに説明したように、ページがロードされたときに関数が実行されます。コードに関連付けられていますが、 HTML もっと念頭に置くために、コードに記述することもできます JavaScriptを として body.onload=dibujar;dibujar Web ページのロード時に開始される関数の名前。

    の最新バージョンでは、 JavaScriptを イベントは関数に関連付けることができます。 addEventListener フォーマットで objeto.addEventListener(evento,función); または構文を使用して objeto.evento=función; これは古い実装でも機能します。イベントに関連付けられた機能のリンクを解除するには、次のようにします。 removeEventListener と同じ形式です addEventListener.

    JavaScriptを Web ページ上で発生する可能性のある多数のイベントに反応できます。たとえば、要素がクリックされたことを検出できます。 HTML とともに onmousedown、または をクリックすると onclick、キーを押したとき onkeydownでスクロールバーを操作すると、 onscroll。私たちの目的のためには、これで十分です ページの読み込みを検出する onload そしてそのサイズ変更 onresize。これらのイベントをオブジェクトに関連付けます body y window インクルード DOM それぞれ。最初のものはコード内で割り当てることができます HTML、コード内の XNUMX 番目のとおり JavaScriptを 最初に呼び出された関数内で、その形式で window.onresize=redimensionar;redimensionar ウィンドウのサイズが変更されるたびに呼び出される関数。

    一定の時間間隔を置いて実行する

    JavaScriptを のリソースが XNUMX つあります 遅延実行: setTimeout、一定時間後に関数を実行します。 setInterval 一定の時間間隔ごとに関数を実行します。どちらのメソッドもパラメータとして、(1) 呼び出された関数、および (2) ミリ秒単位で表される時間間隔を必要とします。動作を停止するには、これらの関数によって返された結果を変数に代入し、それらを引数として渡すことができます。 clearTimeout または clearInterval それらを再度呼び出したくない場合 (または初めて実行したくない場合) setTimeout o setInterval それぞれ。

    前の例ではメソッドが導入されています alert 警告標識を表示する役割を果たします。過去には広く使用されていましたが、現在はコードからほぼ禁止されています JavaScriptを Web ページをダイアログ ボックスで覆うのは非常に攻撃的 (侵入的) であるためです。

    のために書かれたプログラムでは、 マイクロコントローラー 小さなシリーズ(皿の上のものなど) Arduinoの宇野) 前の例のように、グローバル変数を使用するのが一般的です。 JavaScriptをその理由は、コードが短く、特に混乱が生じないこと、関数がアドホックに実装されることが多いこと、およびグローバル変数を使用することでメモリ使用量を非常にシンプルかつ直観的な方法で予測できるためであり、これはリソースが少ないシステムでは非常に重要です。その代わり、 en JavaScriptを グローバル変数の使用を可能な限り最小限に抑えるのが一般的です。 正常に動作するため、メモリ使用量を急ぐ必要がないからです。 CPU よりもはるかに優れたリソースを備えています。 MCUなぜなら、干渉することなく動作する必要がある多くのサードパーティ コードと共存する可能性が高く、オープン システムであるため、将来の実行コンテキストを予測できないためです (プログラムのプログラム)。 マイクロコントローラー small は、一度動作するとコードを追加することなくその動作を完全に決定します)。また、コードがその動作をカプセル化してメソッドを可能な限り自己完結型にしないと、アプリケーションのサイズによって読み取りが困難になる可能性があるためです。

    JavaScript Math オブジェクトを使用した数学的演算

    より複雑な数学的計算の数学的操作はオブジェクトにグループ化されています。 Math。このオブジェクトは直接使用され、組み込まれているメソッドやプロパティ (定数) を使用するためにインスタンス化する必要はありません。

    • Math.abs(n) パラメータnの絶対値
    • Math.acos(n) パラメータ n の逆余弦 (結果はラジアン)
    • Math.asin(n) パラメータ n の逆正弦 (結果はラジアン)
    • Math.atan(n) パラメータ n の逆正接 (結果はラジアン)
    • Math.atan2(n,m) n/m の逆正接 (結果はラジアン)
    • Math.ceil(n) パラメータを最も近い整数に切り上げます
    • Math.cos(α) パラメータ α のコサイン (α 単位はラジアン)
    • Math.E 電子番号 (≃2.718281828459045)
    • Math.exp(n) e をパラメータ n に変換します: en
    • Math.floor(n) パラメータ n を最も近い整数に切り捨てます
    • Math.log(n) パラメータ n の自然対数 (底 e)
    • Math.LN2 2 の自然対数 (底 e) (≃0.6931471805599453)
    • Math.LN10 10 の自然対数 (底 e) (≃2.302585092994046)
    • Math.LOG2E e の底 2 の対数 (≃1.4426950408889634)
    • Math.LOG10E e の底 10 の対数 (≃0.4342944819032518)
    • Math.max(a,b,c,…) 渡されたパラメータのリストの最大値
    • Math.min(a,b,c,…) 渡されるパラメータのリストの最小値
    • Math.PI 数値 π (≃3.141592653589793)
    • Math.pow(n,m) 最初のパラメータ n が XNUMX 番目のパラメータ m に累算されます: nm
    • Math.random() 0.0から1.0までの(ほぼ)乱数
    • Math.round(n) パラメータ n を最も近い整数に丸めます
    • Math.sin(α) パラメータ α の正弦 (α 単位はラジアン)
    • Math.sqrt(n) パラメータ n の平方根
    • Math.SQRT1_2 1/2 の平方根 (≃0.7071067811865476)
    • Math.SQRT2 2 の平方根 (≃1.4142135623730951)
    • Math.tan(α) パラメータ α のタンジェント (α 単位はラジアン)

    AJAX を使用してサーバーからデータをロードする

    IoT に保存された情報を描画するために使用される方法は、サーバーからデータを時々ロードし、それらを表すグラフを再描画することで構成されます。 サーバーからデータを読み取るにはテクノロジーが使用されます AJAX (非同期 JavaScript および XML) 物体を通して XMLHttpRequest de JavaScriptを。データ グラフのプロットはオブジェクトを再利用して行われます SVG これはすでにコードに含まれています HTML これには、読み込まれた新しいデータに対応するように座標が変更されたプロットが含まれています。

    この提案の例では、図面の更新に加えて、各グラフの最終測定データの日付と値を示す Web ページ上のテキストも更新されます。

    サーバー側には情報が含まれるデータベースがあります IoTに接続されたセンサーが監視していることを確認します。このデータベースはオブジェクトリクエストによって読み取られます XMLHttpRequest でエンコードされた情報で応答する JSON形式ただし、使用されるメソッドの名前は形式との関係を示唆しています。 XML.

    最初の Polaridad.es チュートリアルでは、 IoTデータストレージ モノのインターネットに接続されたデバイスから提供される情報をサーバー側から管理するインフラストラクチャの例をご覧いただけます。このシリーズの記事では、サーバーがリソースとして使用されます アパッチ そこからプログラミング言語を使用できるようになります PHP データベースにアクセスするには MySQL o MariaDB。 IoT をサポートするために使用されるサーバーでは、データベースが見つかるのが非常に一般的です。 MongoDBの (NoSQL) とプログラミング言語 JavaScriptを オン Node.js ソフトウェアインフラストラクチャとして。

    次の関数は、センサーの XNUMX つからの最新データをサーバーに要求する役割を果たします。関数呼び出しでは、オブジェクトが引数として使用されます。 JavaScriptを 描画されるデータをサポートします。同じグラフが複数の値を表す場合、たとえば相関関係を視覚的に検索する場合、複数の値を同時に返すようにサーバーにリクエストを行うことができます。これはサーバーの動作方法により、より最適な方法です。 HTTPプロトコル.

    前の例の XNUMX 行目では、サーバーに対して行われるクエリが準備されています。このクエリには「zone」引数が渡されます。その値は、監視対象の場所の名前またはコードになります。異なるセンサー (たとえば、異なる部屋の温度を測定する温度計) が同じデータベース内に共存する可能性があります。前の関数に渡されるパラメーター (チャート データを含むオブジェクト) には、部屋の名前 (「name_suffix」) を含むプロパティが含まれることが期待されます。

    前のコードの 7 行目と 14 行目の間では、 対象 XMLHttpRequest これは変数「ajax」に保存されます。オブジェクトの作成方法を選択する前に、検索します。 window もし XMLHttpRequest は利用できませんでした (Microsoft のエクスプローラーの古いバージョンで発生した問題であり、大幅に遅れていますが、(よりネイティブな) 構文を使用してオブジェクトを作成する代替例として機能します) Object.create o new他のオブジェクト指向言語と同様です。

    応答をすぐに管理できるようにするために、サーバーにリクエストを送信する前に、応答を処理するコードが 15 ~ 26 行目に用意されています。

    の方法 クエリを実行します HTTP サーバーへの送信内容は次のとおりです 接続を開く とともに open タイプとページ (オプションでユーザー名とパスワード) を示します。 ヘッダーを準備する プロトコルの setRequestHeader y リクエストを送信する とともに send。ヘッダー HTTP Content-length 次を使用して計算されるクエリの長​​さ (文字数) を知る必要があります。 length.

    リクエストのとき AJAX 準備が完了すると、イベントに関連付けられた関数が実行されます onreadystatechange。前の例では、関数を割り当てる代わりに、サーバーから到着するデータの受信を管理する匿名関数がオンザフライで定義されています。まず、18 行目で、リクエストのステータスが「終了」であることを確認します。これは、値に対応します。 4 プロパティの readyState、ステータスが「OK」であること HTTPプロトコル (コード 200)プロパティから取得できます status そして到着したデータは JSON形式、物件の相談 responseType.

    応答のステータスが期待どおりであることを確認したら、前の例の 20 行目 結果を含むオブジェクトを作成し、テキストを変換します JSONの。応答には返される日付が指定されています。これにより、サーバーが送信した結果が以前にグラフに表現されていたかどうかを確認できます。これは 21 行目で確認されます。データが新しい場合は、23 行目で次の関数が実行されます。と呼ばれる新しい情報を使用してグラフを再描画する責任があります。

    この読み取り方法を提案するときの考え方は、データが非常に頻繁に更新されるということです。提示された情報が長期間に相当する場合 (XNUMX 日または XNUMX 週間の気温など)、利用可能なすべてのデータを収集する最初のリクエストを実装してから、例のようなデータを更新するリクエストを実装できます。時代の特派員。

    テスト用のランダム データを生成する

    すべてのサーバーとクライアントのインフラストラクチャの準備ができたら、前のセクションのような関数がデータの読み取りとグラフの描画を担当しますが、 テスト段階では、制御された範囲内で乱数を使用する方が現実的である可能性があります。 書かれているコードが正しいかどうかを確認します。次の関数は、最終アプリケーションの構築中にデータを取得する例として機能します。

    上記の例では、データベースから情報を読み取る代わりに、情報をランダムに生成し、グラフの描画を担当する関数に渡します。作成されたデータは、ミリ秒単位の値で表される日付、センサー情報を記録した瞬間、および最大値と最小値の間の監視データによって形成されるベクトルです。

    この例では、日付を生成するときに、発明時の日付に対して最大 1000 秒 (XNUMX ミリ秒) 遅れる可能性があります。として Math.random() 0.0 ~ 1.0 の数値を生成し、それに 1000 を掛けると 0 ~ 1000 の数値が生成され、それが整数に変換されます。同様に、値は乱数に範囲 (最大値から最小値を引いた値) を乗算し、最小値を加算することによって取得されます。

    SVG プロットを使用して IoT センサー グラフを描画する

    表現したい値 (この例では温度) とその時間的位置を取得する方法を説明しました。これらは座標の形で一緒に表現できます。以下の例は、パスを描画する関数を示しています。これらの点と、オプションで上部の線で区切られた色付きの領域を結合します。結果は次の画像のようになります。

    IoT センサーからのデータを表すために SVG と JavaScript で生成されたグラフの例

    グラフの横軸(X)は時間を表し、縦軸(Y)はIoTに接続されたセンサーが監視した値を表します。この提案では、センサーのステータスに関するほぼリアルタイムの情報を提供するためにグラフが非常に頻繁に (たとえば、XNUMX 秒ごとに) 更新されるため、水平間隔は数秒です。

    前のコードには XNUMX つの興味深い側面があります。XNUMX つは、次のことを可能にする計算です。 表現される値の範囲を調整する そして第二に、 不動産建設 d これは、レイアウト上の点の座標を示します (path).

    表現される値の範囲を調整するために、目に見える大きさがグラフのサイズに対応するように、値が最小値から移動され、スケーリングされます。。時間の場合、最長時間(現在に最も近い日時)から表示したい範囲を引いた値(例では20秒)がオフセットとなります。温度値の変位は、下限範囲 (XNUMX 度) から最低値を引いたものであるため、以下に示すデータは許容される最低値に最も類似していますが、その値を評価できるマージンを残しています。 。 合格

    グラフの水平座標を取得するために時間値に乗算する係数は、グラフの全幅 (この例では 100 単位) を表される時間範囲 (この例では 20 秒) で割ることによって取得されます。スカラー温度値の係数を取得するには、表される範囲が最小値を下回るマージンから最大値を上回るマージンまで (どちらの場合も 100 度) であることを覚えておく必要があります。このように、垂直スケール係数は、グラフの高さ (この例では XNUMX 単位) を最大値、最小値、上下のマージンを引いた値で割った結果として得られます。これらの値は負の温度で完全に発達する可能性があるため、次を使用します。 Math.abs() 差の絶対値を使用します。

    プロパティ d オブジェクト path テキスト内の点の座標を連結することによって構築されます。座標の各ペアの前にコードが付きます SVG L、現在位置から座標で示される絶対値まで線を描きます。 X と Y の値はカンマで区切られ、各操作が行われます SVG 次のものとスペースで区切られます。

    レイアウトを開始するには、次のコードを使用します M (絶対座標へ移動)。閉じた塗りつぶされたプロットの場合は右下から開始し、データ プロファイルを描画する開いたプロットの場合は、最後に表示された値 (最新の値) から開始します。 閉じたレイアウトを完成させるには、次のコードを使用します Z 線の最後の点と同じ X 座標値を持つものを最後の点として追加し、表された最小値を Y 座標として追加します。

    この例では、関数 dibujar_grafico()これはページ読み込み時の呼び出しであり、テストする初期値 (最後のリアルタイム値ではない) を取得し、データがレンダリングされる範囲を準備します: 水平方向に 20 秒 (20000 ミリ秒)、内部温度が 15°C -5°C ~ +10°C で垂直方向に XNUMX 度の上下マージンを持たせます。に XNUMX 回電話をかける actualizar_grafico()、最初のパスで true 引数として、塗りつぶされた領域を表すためにチャートを閉じる必要があることを示し、XNUMX 回目の呼び出しで渡されます。 false 線を引くために。いずれの場合も、オブジェクトは path 変更されたものは、対応する外観を持つもので、最初の場合は塗りつぶしがあり境界線なし、XNUMX 番目の場合は一定の線の太さで塗りつぶしがありません。

    関数 actualizar_grafico() オブジェクトに取り組む SVG 次のコードをコンテナとして使用します HTML。 オブジェクト SVG には XNUMX つのパスが含まれており、XNUMX つは線を描画するためのもので、もう XNUMX つは塗りつぶされた領域を描画するためのものです。 Web ページを読み込むときに、要素から <body> 前の関数が自動的に呼び出されます。 dibujar_grafico() イベントのおかげで JavaScriptを onload.

    コードの10行目 HTML 上では、(例として) 820 ピクセルの幅と 150 ピクセルの高さがスタイルで確立されています (これは、最終バージョンではクラスとドキュメントで行うことをお勧めします) CSS)。 13行目と14行目でオブジェクトのサイズを定義しているのは奇妙に思えます SVG 100% の幅と高さ (ウィンドウの寸法 100×100 に最もよく一致します) など。すでに述べたように、これを行う理由は、常に既知の寸法を使用して作業し、表示された値をそれに合わせて調整するためです。他の方法としては、毎回グラフのスペースを計算し、値を再調整するか、グラフの寸法を強制的に固定することで、ドキュメントはこれに従う必要があります。

    コードに応じて寸法が変化するグラフを選択した場合 HTML、プロパティを含める必要があります vector-effect 勇気を持って non-scaling-stroke 前の提案で発生したように、グラフが表示される Web ページ上で選択された 1:1 の比率を維持しない場合に、線の太さが変形するのを防ぐため。

    グラフを「トリミング」して、選択した領域のみを表示するには、次を使用します。 viewBox。この場合、0,0 (左上隅) から始まり右下に 100x100 のグラフの部分を表示することを選択しました。負の値または 100 を超える座標にある描画部分は、オブジェクト内に存在しても Web ページには表示されません。 SVG

    SVG 描画に新しい要素を追加する

    前の例では、関数 actualizar_grafico() レイアウトを使用する SVG 所有権が変更される d、これが座標連鎖を表現するものです。別の方法としては、再描画されるたびにオブジェクト全体を作成することもできます。最初のオプションの利点は、グラフィックの側面 (太さや色など) がコード内で定義されることです。 HTMLの場合、オブジェクトは事前に作成しておく必要があるという制限があります。

    SVG オブジェクトを作成するには、次を使用します。 createElementNS()を含めることができます。 名前空間。以下の例では、新しいテキスト オブジェクトが作成されます (text) 要素に関連付けられています SVG コード内にすでに存在するもの HTML ウェブサイトの。新しい要素が作成されると、そのプロパティは次のように割り当てられます。 setAttribute() に追加されます SVG とともに appendChild().

    描画要素の比率を変更する

    前のセクションの例の関数を使用してラベル付けを試してみた場合は、Web ページ上のオブジェクトの比率 (width y height コードの HTML) は、表される面積 (viewBox)。比率を調整するには、オブジェクトの寸法を知る必要があります SVG オブジェクトまたはコンテナのスタイルを参照できます。 HTML、オブジェクトの場合 SVG この財産を譲渡します。所有権の割り当て transform オブジェクトへ SVG 比率に依存する変形は、スケーリング操作を適用することで修正できます。 scale() ここで、X の係数は Y の係数と異なります。

    SVG プロパティもサポートする新しい複合要素を形成する複数のオブジェクトをグループ化できます。、単純なオブジェクトのような。同じ変換を各オブジェクトを個別に適用するのではなく、一連のオブジェクトに一度に適用するには、このリソースに従ってオブジェクトをグループ化し、単一のプロパティを適用します。 transform 彼ら全員に。

    について話したときに説明したように、 SVG形式、グループの要素はラベル内に囲まれます。 <g> y </g>。から追加するには JavaScriptを 要素をグループに追加 SVG 前の例で示したように、次のように使用されます。 appendChild() 新しいオブジェクトが定義されたら。

    変換を適用するときに原点を確立するには、オブジェクトに対してプロパティを使用できます。 SVG transform-origin、その値は、変換が開始される点の X 座標と Y 座標です。変換の原点の値が (Web ブラウザーで) 明示的に指定されていない場合は、座標の中心が使用されます。残念ながら、この記事の執筆時点では、デフォルト以外のソースを使用して変換の動作を指定することはブラウザ間で均一ではないため、注意して使用する必要があります。

    スケール変換に伴い、 scale との回転など他にもあります。 rotation との動き translateを提供します。 グラフ表現の代替: 新しい座標を取得する代わりに、それらを独自の空間で表現し、表現したい形式に合わせてグラフを変換できます。

    チャートに参照を追加する

    プロファイルと塗りつぶし領域で値をプロットすることでグラフの主要部分が解決されたので、その読み取りに役立つ参照を追加して完成させることができます。例として、許容可能な最大値と最小値、および目的の値をマークするいくつかの水平方向の基準 (線) を描画することから始めましょう。説明したように、オブジェクトを SVG からまっすぐ JavaScriptを またはコードに手動で含めます HTML 後でそれらを変更します JavaScriptを.

    これらの水平方向の参照に、それらが表す値を明確にするテキストのラベルを付けるのは論理的だと思われます。テキストを強調表示するには、背景やグラフィックから目立つ長方形を使用します。変形を補正するにはテキストにスケール変換を適用する必要があるため、テキストをすべてグループ化して、スケールが適用されるオブジェクトにまとめることができます。この方法で行う主な利点は、グラフ コンテナー (ブラウザ ウィンドウ) のサイズが変更され、スケールが修正する比率が変更された場合に、XNUMX 回の操作で変更できることです。

    上記のコード例には、興味深い点がいくつかあります。まず最初に、プログラミング出身のユーザーにとってサンプルを読みやすくするために定数 (グローバル変数) が使用されているとコメントします。 マイクロコントローラー en C またはで C + +。後で説明しますが、それをプログラムする最適な方法は、 JavaScriptを これらの値を含むオブジェクトと、この例やグラフの参照を管理するメソッドを、実稼働システムで一般的に使用することになります。

    一方、より一般的なコードを発展させて、テキストを調整するためにグラフの比率を修正するさまざまな係数を計算する別の関数が開発されました。 proporcion_grafico()、値の範囲に応じたスケール escala() 絶対値で既知の測定値 (基準値の測定値など) の補正係数 medida_grafico().

    このコードを読むと、このようなアプリケーションが動作するコンテキストが明確になるはずです。このアプリケーションはリアルタイムでグラフィックを描画し、さまざまなグラフィック コンテキスト (少なくともさまざまなサイズと比率) で表示できる柔軟性が必要です。まず最初にオブジェクトを生成する必要があります SVG、コード内で「手動で」 HTMLコードを通じて JavaScriptを いずれの場合も、これらのオブジェクトを操作するには、その後、これらのオブジェクトへの参照を取得する必要があります。 JavaScriptを これにより、新しいグラフを描画したり、既に描画されたグラフの表現を、それが表示される媒体の変化に適応させることができます。

    グラフを簡単に解釈するのに役立つもう XNUMX つの参考資料は、特定の値を表す点 (線のノード) です。この例では、単一の大きさを表すため、シンボルの選択は重要ではありませんが、相関関係を探すためにいくつかの異なる値を重ね合わせる場合、色などの他のリソースを使用することに加えて、区別することは興味深いことです。 、さまざまなシンボルを描くことによって。ライン ノードに使用されるグラフィックスは、テキストの場合と同様に、サイズと比率を変更する必要があります。その結果、その寸法は絶対値となり、含まれるボックスの寸法が変更された場合でもその比率が維持されます。

    前の例では、図面の比率を再スケールして修正するためのさまざまな係数を計算する方法をすでに見てきました。グラフのノードまたは頂点のシンボルの管理を実装する方法に関して、考えられる解決策は、オブジェクトを保存することです。 SVG をベクトルに変換し、新しい値を読み取ってグラフを更新するとき、またはコンテナのサイズを変更してグラフを再描画するときに、その位置を変更します。前者の場合はその位置を変更する必要があり、後者の場合はプロパティとの比率を変更する必要があります。 transform の値 scale。次のコードは関数を変更したものです actualizar_grafico() グラフの頂点シンボルの再配置を含めます。

    関数に加えられた変更 actualizar_grafico() 新しい関数を取得するには actualizar_grafico_puntos() これらは、前の例のコードで強調表示されているものです。まず、5 行目でオブジェクトのベクトルを取得します。 SVG パラメータとして。このベクトルには、グラフの新しいノードで再配置する必要があるシンボルが含まれます。

    39 行目と 40 行目では、中心の新しい座標が割り当てられています。 cx y cy、表現されている値のものに。シンボルが中心に基づいていない場合は、おそらくオフセットを追加する必要があります。 cx 幅の半分で cy グラフ ノード上に正確に再配置するには、半分の高さにしてください。

    57行目から61行目では、左端で切れて描画されなかった座標に対応する点をグラフの外側に再配置しています。の座標 cy ゼロとそれ cx グラフの左側の部分のように、ウィンドウで切り取ったときに表示されないように、任意の負の数 (点自体より大きい値) に設定します。 SVG.

    JavaScript を使用してオブジェクトからチャートを管理する

    これまで説明してきたすべての操作をオブジェクトに統合して、新しいバージョンの典型的なスタイルでグラフを管理できます。 JavaScriptを。この代替実装には、同じ Web ページ上に異なる値の複数のグラフを簡単に組み込むことができるという追加の利点があります。

    実装について説明する前に、オブジェクトを作成する最も一般的な方法を確認してみましょう。 JavaScriptを そして、IoT センサー グラフィックスの描画提案に影響を与える関数の特殊性のいくつか。

    オブジェクトを作成する新しい方法についてはすでに説明しました。 JavaScriptを (バージョン 5 以降で利用可能) ECMAScriptの) を使用して構成されます Object.create、「クラシック」の代わりに使用することに慣れる必要があります。 newもちろん、これはまだ正しく動作しますが、その目的はクラスベースのオブジェクトを使用して言語のスタイルをシミュレートすることです(JavaScriptを 実用的な代替手段ではなく、プロトタイプに基づいてオブジェクトを作成します。

    前のコードを使用すると、オブジェクトを作成する場合の違いを思い出すことができます。 Object.create またはで new。これは、オブジェクトが作成される機能を強調する役割もあります。 new コード内のどこにでも指定できますが、オブジェクトはインスタンス化する前にすでに存在している必要があります。 Object.create (ES5_Object オブジェクトは関数ではありません)。

    3 行目と 4 行目では、オブジェクトを作成する関数のプロパティにデフォルト値を設定します。 new、各プロパティは、対応する引数の値に割り当てられます。または (||)、引数が渡されていない場合、つまり引数が未定義の場合(undefined)、その状況は次のように評価されるため、 false、デフォルト値が割り当てられます。

    関数が実行されるコンテキスト JavaScriptを このプログラミング言語は、心に留めておくべき重要な XNUMX つの問題を提起します。また、他の人たちと作業した後にこのプログラミング言語を使用する場合には、混乱を招く可能性もあります。 C o C + +、 私たちの場合には。コンテキストには、関数のスコープ内で定義された変数 (およびグローバル変数) が含まれます。ちなみに、これは、プログラミング スタイル全体を確立する「クロージャ」という興味深い概念を引き起こします。 JavaScriptを。とは言え、次のようなことが予想されるかもしれません this、オブジェクトを定義するコード内で使用される場合、オブジェクトを参照します。オブジェクトが定義されている実行コンテキストは維持されますが、使用されるのは関数が呼び出されるコンテキストです。ほとんどの場合、この動作は透過的ですが、別の関数内で定義された関数と、オブジェクト イベントから呼び出されるメソッドという XNUMX つの状況が混乱を招く可能性があります。 window.

    前のコードを実行すると、最後のコメント化されたテキストがコンソールに表示されます。マークされた XNUMX 行は、混乱を招く可能性のある動作、つまり関数実行コンテキストを反映しています。 probar_dentro() しない probar()、予想通りですが、 windowこれは、同じ名前のプロパティではなく、グローバル変数を示しています。この動作を望まない場合は、最上位の関数で変数を作成し、それを次の関数に割り当てます。 this、次のコードのように。

    イベントからメソッドが呼び出されるときに実行コンテキストを制御するには windowたとえば、ブラウザウィンドウのサイズを変更することによって、 JavaScriptを: 「関数ファクトリ」、つまり他の関数を生成する関数をプログラミングして、それらを返す可能性 return.

    上記のコード例では、メソッド llamar() デ ロス オブジェクトス Contexto これは作業を実行しませんが、それを処理する匿名関数を返します。すべてが期待どおりに動作することを確認するために、関数がコンソールに表示するプロパティと同じ名前のグローバル変数があります。コンテキストが正しい場合は、グローバル変数の値ではなく、プロパティの値が表示されます。

    JavaScriptを 文末のセミコロン記号を省略している場合は、修正してください。これにより、リラックスした書き方が可能になりますが、慎重に扱わなければならない諸刃の剣でもあります。ほとんどの場合、数行にわたる式でこれによって生じる望ましくない影響を避けるために、括弧を使用するか、括弧を使用する方法の前に置くことができます。 JavaScriptを コードを解釈します。そのため、例の 8 行目には以下が含まれています。 function 背面の return、別の行を使用していたら、意味は大きく異なります。私の意見では、最も読みやすい解決策は、次のバージョンのように中間 (不要な) 変数を使用することです。明らかに、動作が理解されれば、決定はプログラマに対応します。

    式を関数として評価するのと同じ意味で、つまり、関数が返す値ではなく関数を返します。最後の例の 21 行目 (前の例では 19 行目でした) で停止します。 clearInterval で呼び出された関数 setInterval。 30 秒間動作させるために、停止は延期されます。 setTimeout、これには最初の引数として関数が必要です。実行をパラメータとして配信する clearInterval 定期的な呼び出しを含む変数を使用します (関数ではありません)。 clearInterval) は、最後の行の匿名関数が作成される目的です。

    関数定義を統合したコードをよりコンパクトに記述するか (21 行目など)、補助変数を使用するか、私の意見では、より読みやすいコードを記述するか (19 行目と 20 行目など)、パフォーマンスの変化はほとんどなく、スタイルと読みやすさに大きく依存します。メンテナンス。

    コードをテストするには、サーバーにデータを置く前に、必要な範囲のランダム値のジェネレーターを使用するか、必要な条件下での動作をシミュレートする制御された値を含むテーブルを準備します。次の例では、範囲全体にわたって単純なデータ ジェネレーターを使用しているため、少し誇張して表示されています。

    テストするには、次のことができます サンプルの完全なコードをダウンロードする で書かれたウェブページによって形成される HTML、 スタイル CSS そしてコード JavaScriptを。他のコンポーネントは最小限のサポートのみで非常に簡素化されており、対応するセクションの記事でさらに詳しく説明されているため、後者が最も関連性があります。

    コメントを投稿

    見逃したかもしれません