ArduinoでHTTPサーバーを作ろう
TOP > てきとうにこらむ > ゲーム作りとプログラミング日記 > ArduinoでHTTPサーバーを作ろう
HTTPサーバーを作ろう
HTTPを勉強するためにも、HTTPサーバーを作ってみるというのはどうでしょう。 Arduinoを使って作ってみる。
必要なもの
- Arduino UNO
- R4を使用してる。R3でも行けると思うんだけど、画像の配信だとR4でもキツかった
- Arduino Ethernet Shield
- 売り切れてるけどスイッチサイエンスのURL https://www.switch-science.com/products/2270
- 公式でも売ってる、電波を発しないので海外から輸入するのもあり https://store-usa.arduino.cc/products/arduino-ethernet-shield-2
- TP-Link TL-WR802N
- https://www.tp-link.com/jp/home-networking/wifi-router/tl-wr802n/
- これはEthernetがあるのでEthernet ShieldとつなぐことでLANにできる
- 別の話になるけど、ROSとか使ってるのであればこれにつなげるようにしておくと便利
- 中継モードを使うことで、インターネットにもつながる
- LANケーブル
- 30cmのを使ってる
- micro SDカード
およそ電子工作とは無縁のようにみえるけれども、これでインターネットの一員になることができる。
ソースコード
https://github.com/youkidearitai/uno_web_server/ を参照してください。なお、改良の余地はあります。
解説
HTTPというのは、最低限以下のリクエストとレスポンスで成り立ちます。
リクエスト
GET / HTTP/1.1
Host: localhost:8080
(あればリクエストボディ)
ここで肝心なのはリクエストヘッダの二個目にある「/」です。これはパスです。このパスを読み取ることでSDカードの内容を読み込みます。 (なお、パスをストレージから直接読み取るということは実際に使われるHTTPサーバーでは危険だということもわかるでしょう)
もちろん、リクエストヘッダの1個めにある「GET」も(これをメソッドといいます)必要ではあるのですが、今回は簡易なHTTPサーバーということで、すべてGETとみなして処理を省略しました。
レスポンス
まあ例えば200ならこう
HTTP/1.1 200 OK
(レスポンスボディ)
このようにすれば、最低限HTTPとしてレスポンスが返ってきます。内容はファイルの中身そのまんまを返せばいいだけです。これだけでtext/htmlもimage/pngもなんでも返せちゃうわけですね。不思議だなあ。
制約
- SDカードのファイルシステムであるFATの都合上、「8文字+.+3文字」の制約を受けます。したがって、「index.html」の「.html」は返せないです。「.htm」としましょう。
- 面倒くさいのでXSSとか考えてないです。エスケープしてないところはどこでしょう?さがしてみてね
- 先述したとおり、GETメソッド以外のことを考えていません。
機能を追加したければ頑張ろうね
まとめ
HTTPサーバーの基本的なリクエストとレスポンスができたので満足してます。Arduinoもおもろいですよね。ESP8266でうごかしても良いと思ったのですが、Ethernetが関わってる方がインターネットにつなぐ感あるかなと思い、Ethernet Shieldを使いました。ESP8266を使う場合はソースコードを別途考えないといけませんが、そうしたければがんばってください。