0

受信データのシリアルポートを継続的に監視するPythonスクリプトを備えたLAMP Webサーバーがあります。これは、ホーム オートメーション システムの一部です (Arduino Yun と、それぞれ nrf24L01+ RF トランシーバーを搭載した一連の Pro Mini を使用)。

私の目標は次のとおりです。

  1. 「door open」や「temp = 72F」など、受信データを MySQL の適切な場所に保存します。Python スクリプトでこれを処理できると思います。
  2. サーバー送信イベント (SSE) を使用して、新しいデータをクライアント ブラウザーにプッシュします (クライアントが接続されている場合)。

AJAXを使用できることはわかっていますが、データをプッシュする方がポーリングよりも優れているようです。問題は、Python スクリプトから PHP に SSE バインド データを取得する必要があることですが、それは SSE PHP スクリプトが実行されている場合のみです。また、SSE PHP スクリプトの新しいインスタンスが各クライアントで作成されると思います。そのため、Python と PHP の比率が 1:1 になることさえありません。SSE PHP に MySQL データベースを監視させることを考えましたが、それは基本的にポーリングに戻りますが、非常に頻繁にポーリングされる可能性があります。

あるいは、SSE PHP スクリプトでシリアル ポートを監視できると考えていましたが、シリアル データは 1 回しか読み取れないので、複数のスクリプトがデータを求めて競合し、これも機能しません。

着信データをデータベースに保存し、SSE をトランスポート層として使用するという 2 つの目標を達成する最善の方法は何ですか?

4

2 に答える 2

1

だからここに私がやったことがあります:

  • Python デーモンは Arduino Yun で実行され、新しいデータの ttyATH0 シリアル ポートを監視します。新しい文字列が受信されると (文字列を ~ 文字で終了することを選択します)、それを解析して MySQL データベースに格納します。MySQL エントリを更新すると、その行のタイム スタンプが自動的に更新されます。テーブルの構成です。
  • html ページをロードすると、サーバー上で実行されている .php スクリプトからイベントが送信されたサーバーへのブラウザー サブスクリプションが開始されます。
  • このスクリプトは、MySQL データベースで数秒前より新しいエントリを検索し、JSON を Web ページに渡します。JSON は JavaScript によって解析され、ページがアニメーション化されます。

Server Sent スクリプトの更新時間は 3 秒で十分であると判断しました。理論上は継続的に実行できますが、Web ページがあふれてパフォーマンスが低下する可能性があります。スクリプトは、1 秒ごとに実行するように構成することもできます。おそらく、いつかその更新を行います。

...とにかく、それが私がやった方法です。websocket は必要ありません! また、ぶら下がっている AJAX クエリよりもエレガントだと思います。

于 2015-05-27T03:10:03.257 に答える