Webサーバ・ESP-WROOM-32間の双方向の通信方法
受付中
回答 2
投稿
- 評価
- クリップ 0
- VIEW 1,005
下記①②③の3つの端末でどのようにネットワークを構成するか、
アドバイスをいただけないでしょうか?
いずれの端末も同じLAN内に存在します。
自分では、下記まで考えました。
①からHTTPのPOST Requestで③のWebサーバへRFIDタグのIDを送信する。
③のWebサーバから②へは、UDPで通信すればいいのでしょうか?
(Webサーバからクライアントへの通信方法が分かっていません)
Webの知識があまりないので、下記構成の場合
一般的にはこうする等、指摘していただきたいです。
あと、勉強したいので参考書籍も教えていただけると嬉しいです。
①ESP-WROOM-32(Arduino IDE使用) + RFIDリーダ(RC522)
②ESP-WROOM-32(Arduino IDE使用) + 回転灯
③Windows10 PC上のWebサーバ(Sinatra + ActiveRecord + sqlite3 + Webrick)
①
・RFIDリーダにてRFIDタグの検出をポーリングで行う
・RFIDタグを検出したら、RFIDタグから読み取ったIDを③のWebサーバに送信する
②
・Webサーバから回転灯の回転指示を受ける
・回転指示を受けた場合は、10秒間回転を継続したのち停止する
③
・RFIDタグと商品名の組み合わせをDBで管理
・①から受信したRFIDタグのIDを元に、DBから商品名を検索し、
ある特定の商品である場合に、②に回転灯の点灯指示を行う
・商品名の履歴をWebブラウザに表示する
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+1
回転灯(パトライト?)使うのですか。面白いですね。ICタグはMIFAREでしょうか。
①からHTTPのPOST Requestで③のWebサーバへRFIDタグのIDを送信する。
POST
メソッドでもいいでしょうし、GET
メソッドでも充分かと。GET http://webserver?uid=01020304
など。コード上で自力でHTTPリクエストを作るでしょうから、それが簡単になるのと、サーバー側のデバッグが少しだけしやすくなります。
③のWebサーバから②へは、UDPで通信すればいいのでしょうか?
③から②へは「回転指示」であり、確実に送信した旨の確認が必要でしょうからUDPは適さないと思います。UDPを使うようなケースは、センサーの値を常時定周期で送りっぱなしにするようなときです。ですのでUDPではなく、TCP、つまりは①と同じくHTTPでいいのではないかと。②で稼動する簡単なHTTPサーバーを作って、③からGET
リクエストで要求を送信するのが簡便で良いかと考えます。SSLではないのでGET
もPOST
も簡単に偽装できますが、HTTPリクエストのフィールドにUser-Agent
を設けたり、特殊なフィールドを定義してフィルタリングするなどすれば、ほんの少しだけ堅牢になります。
以上、一例として参考にしていただければ。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
手軽にする、LAN内だけで完結させる、というなら、Telnetでそれぞれ繋ぐというのはどうでしょう。
デバッグもやりやすいです
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
2018/06/21 11:18
送るデータがRFIDタグのUIDだけなら、GETメソッドでも大丈夫そうですね。
③から②は、再送制御があるTCPのほうがよさそうですね。
単純に、②でHTTPサーバを作ればいいだけだったんですね。
③においてsinatraから他サーバにPOSTリクエスト、GETリクエストを送信できるイメージを持っていなかったので、UDPを使うのか?と思った次第です。
仮に、③と①の間で双方向でデータの送受信をしないといけない場合、
③と①の双方にWebサーバを立てないといけないということでしょうか?
定期送信ではなく、イベントをトリガにして送受信したいケースを想定しています。
組込み畑で、あまりWebのことを理解しておらずすみません。
dotinstallやrailsチュートリアルは2回くらいやりました。
2018/06/21 13:39
2018/06/21 18:02
少しずつ整理されてきました。ありがとうございます。
2018/06/21 18:48 編集
> データを送信するトリガは、必ずクライアント側
そうですね。①と③間においてデータ発信の契機が①側にしかないのであれば①から③へHTTPリクエスト送信。そのコネクションで、③から①へHTTPレスポンスを送信。で1回の(言うなれば)セッションが終わりです。
もし、③側の情報や①に対する命令を送りたければ、HTTPレスポンス送信時にコンテントボディへ載せてしまうのが一つの手、です。(自局に対する命令のポーリングと捉えることができます)
ですので、coco_bauerさんが既に書かれているように、①側にサーバーは必要ありません。
リアルタイムに相互通信をしたいということになればESP-WROOM-32でも動作するというWebSocketも候補ですが、過剰スペックでしょう。
2018/06/25 01:49
生のTCPソケット通信ができるところまでは確認できました。
ここから、HTTPで通信できることを確認していきます。
①から③へ、HTTPのGETリクエストを送信して、③のDBを書き換えることはできました。
②にWebサーバを立てるところで難航しています。
HTTPメッセージのパースが難しいですね。