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

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

ただいまの
回答率

90.48%

  • Ruby

    7959questions

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

  • Arduino

    552questions

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

  • Webサーバー

    450questions

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

  • Sinatra

    86questions

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

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

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 688

drao0113

score 3

下記①②③の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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+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ではないのでGETPOSTも簡単に偽装できますが、HTTPリクエストのフィールドにUser-Agentを設けたり、特殊なフィールドを定義してフィルタリングするなどすれば、ほんの少しだけ堅牢になります。

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/21 11:18

    回転灯はパトライトを使います。ICタグはおっしゃるように、MIFAREです。

    送るデータがRFIDタグのUIDだけなら、GETメソッドでも大丈夫そうですね。

    ③から②は、再送制御があるTCPのほうがよさそうですね。
    単純に、②でHTTPサーバを作ればいいだけだったんですね。
    ③においてsinatraから他サーバにPOSTリクエスト、GETリクエストを送信できるイメージを持っていなかったので、UDPを使うのか?と思った次第です。

    仮に、③と①の間で双方向でデータの送受信をしないといけない場合、
    ③と①の双方にWebサーバを立てないといけないということでしょうか?
    定期送信ではなく、イベントをトリガにして送受信したいケースを想定しています。

    組込み畑で、あまりWebのことを理解しておらずすみません。
    dotinstallやrailsチュートリアルは2回くらいやりました。

    キャンセル

  • 2018/06/21 13:39

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

    キャンセル

  • 2018/06/21 18:02

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

    キャンセル

  • 2018/06/21 18:48 編集

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

    キャンセル

  • 2018/06/25 01:49

    現状ですが、ESP32とESP8266の間で
    生のTCPソケット通信ができるところまでは確認できました。
    ここから、HTTPで通信できることを確認していきます。

    ①から③へ、HTTPのGETリクエストを送信して、③のDBを書き換えることはできました。
    ②にWebサーバを立てるところで難航しています。
    HTTPメッセージのパースが難しいですね。

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/21 18:05

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

    ありがとうございます。

    キャンセル

関連した質問

同じタグがついた質問を見る

  • Ruby

    7959questions

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

  • Arduino

    552questions

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

  • Webサーバー

    450questions

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

  • Sinatra

    86questions

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