質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Webサーバー

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

Sinatra

Sinatraは、Rubyで作られた オープンソースのWebアプリケーションフレームワークです。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

2回答

582閲覧

Webサーバ・ESP-WROOM-32間の双方向の通信方法

drao0113

総合スコア11

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Webサーバー

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

Sinatra

Sinatraは、Rubyで作られた オープンソースのWebアプリケーションフレームワークです。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2018/06/21 00:25

下記①②③の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ブラウザに表示する

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

回転灯(パトライト?)使うのですか。面白いですね。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ではないのでGETPOSTも簡単に偽装できますが、HTTPリクエストのフィールドにUser-Agentを設けたり、特殊なフィールドを定義してフィルタリングするなどすれば、ほんの少しだけ堅牢になります。

以上、一例として参考にしていただければ。

投稿2018/06/21 01:30

dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

drao0113

2018/06/21 02:18

回転灯はパトライトを使います。ICタグはおっしゃるように、MIFAREです。 送るデータがRFIDタグのUIDだけなら、GETメソッドでも大丈夫そうですね。 ③から②は、再送制御があるTCPのほうがよさそうですね。 単純に、②でHTTPサーバを作ればいいだけだったんですね。 ③においてsinatraから他サーバにPOSTリクエスト、GETリクエストを送信できるイメージを持っていなかったので、UDPを使うのか?と思った次第です。 仮に、③と①の間で双方向でデータの送受信をしないといけない場合、 ③と①の双方にWebサーバを立てないといけないということでしょうか? 定期送信ではなく、イベントをトリガにして送受信したいケースを想定しています。 組込み畑で、あまりWebのことを理解しておらずすみません。 dotinstallやrailsチュートリアルは2回くらいやりました。
coco_bauer

2018/06/21 04:39

HTTPは双方向のデータ送受をするプロトコルです。ブラウザ側からGETかPOSTの要求をサーバに送り、サーバは要求に応えて結果のデータ(新しいページのHTMLなど)を送り返す。 サーバ(③)からRFIDリーダ(①)を操作する想定にはなっていないと思いますから、①にサーバを立てる必要は無いと思います。
drao0113

2018/06/21 09:02

HTTPは双方向だが、データを送信するトリガは、必ずクライアント側である必要があるということでしょうか? 少しずつ整理されてきました。ありがとうございます。
dodox86

2018/06/21 09:55 編集

coco_bauerさん、フォローありがとうございます。 > データを送信するトリガは、必ずクライアント側 そうですね。①と③間においてデータ発信の契機が①側にしかないのであれば①から③へHTTPリクエスト送信。そのコネクションで、③から①へHTTPレスポンスを送信。で1回の(言うなれば)セッションが終わりです。 もし、③側の情報や①に対する命令を送りたければ、HTTPレスポンス送信時にコンテントボディへ載せてしまうのが一つの手、です。(自局に対する命令のポーリングと捉えることができます) ですので、coco_bauerさんが既に書かれているように、①側にサーバーは必要ありません。 リアルタイムに相互通信をしたいということになればESP-WROOM-32でも動作するというWebSocketも候補ですが、過剰スペックでしょう。
drao0113

2018/06/24 16:49

現状ですが、ESP32とESP8266の間で 生のTCPソケット通信ができるところまでは確認できました。 ここから、HTTPで通信できることを確認していきます。 ①から③へ、HTTPのGETリクエストを送信して、③のDBを書き換えることはできました。 ②にWebサーバを立てるところで難航しています。 HTTPメッセージのパースが難しいですね。
guest

0

手軽にする、LAN内だけで完結させる、というなら、Telnetでそれぞれ繋ぐというのはどうでしょう。
デバッグもやりやすいです

投稿2018/06/21 03:02

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

drao0113

2018/06/21 09:05

Telnetの方がでばっぐしやすいのですね。 Telnel自体は使ったことがないので、デバッグがやりやすいイメージはできないのですが、 そのような選択肢もあることを頭に入れておきます。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問