UDP/TCPIPを使用してarduinoを使用するクライアントにメッセージを送信するなど、サーバーから積極的にメッセージを送信したいと思います。ユーザーが特定のポートをローカルネットワーク上のデバイスに転送している場合、これが可能であることが知られています。ただし、おそらく別のプロトコルを使用して、ユーザーに手動でポート転送させたくありません。これは可能ですか?
2 に答える
1 Arduino側
これに最も近いのは、arduino からサーバーへの接続を開き、availableを使用して、サーバーがデータを arduino にストリーミングするのを待つことだと思います。あなたのコードは開いている接続をポーリングしますが、接続を開いたり閉じたり、ヘッダーを前後に渡したりするためのすべてのやり取りを回避しています。
2 サーバー側
これは、作業の大部分がサーバー側で行われることを意味します。そこでは、開いている接続を管理する必要があるため、メッセージをarduinoにプッシュする必要があるイベントをユーザーがトリガーしたときに、すぐにそれらに書き込むことができます. これを行う方法は、実行しているサーバー アプリケーションの種類によって少し異なります。
2.1 主な問題の Node.js の「ウォークスルー」
たとえばNode.jsではres.write()
、接続を閉じずに接続できます。これにより、arduinoへのシリアル接続を開いた場合と同様の効果が得られます。これにより、接続の管理の問題が残ります。サーバーは、arduino のメッセージについてデータベースを定期的にチェックする必要がありますか? これは単にポーリング リンクから 1 つのリンクを削除するだけなarduino -> server -> database
ので、もっとうまくやれるはずです。
メッセージがデータベースに追加されるイベントによってトリガーされる関数をアタッチできます。Node-orm2は、node.js 用のデータベースオブジェクト リレーショナル モデルドライバーであり、この種のものに利用できるafterSaveやafterCreateなどのフックを提供します。アプリケーションによっては、データベースをまったく使用せず、単純に JavaScript オブジェクトを使用する方がよい場合があります。
残っている唯一の問題は、フックがアクティブ化されたら、正しい接続をスコープに取得して書き込みできるようにするにはどうすればよいかということです。リクエストに関連するすべてのデータをグローバルデータ構造、おそらくarduino IDをインデックスとして持つ辞書に保存できます。トリガーされた関数では、すべてのデータ、つまりリクエストコンテキストをフェッチして書き込みます!
開いている接続を管理し、それらを適切に閉じ、タイムアウト時にメモリから消去する node.js コードなどの優れた例については、このブログ投稿を参照してください。
3 結論
私はこれを自分でテストしていませんが、現在通常のポーリングを使用して実装されている arduino と node.js を使用する既存のアプリケーションを既に持っているため、テストする予定です。うまくいけば、私はすぐにそれに取り組み、結果とともにここに戻ってきます.
通常、ロングポーリング(私が読んだものから)では、データがクライアント(arduino)に送り返されると接続が閉じられますが、これが必要な理由はわかりません。複数のメッセージに対して同じ接続を開いたままにして、接続を再確立するために一定の時間間隔が経過した後にのみ閉じることを試みる予定です-そして、この間隔をかなり長く、おそらく5〜15分に設定したいと考えています.
Pubnub を使用してクライアントの Web ブラウザーに通知を送信することで、ユーザーは「メッセージ」などを受信したときにすぐに知ることができます。それはうまくいきます。
これには、あなたが見ているのと同じ制約があるようです:静的IPなし、ポート転送なし。ユーザーは理論的にはプラグを差し込むだけで...
Pubnub には Arduino ライブラリがあるようです: https://github.com/pubnub/arduino