Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
1
Help us understand the problem. What is going on with this article?
@sirius1000

ESP32からMicropythonでHTTPリクエスト(POST)でデータを送信し,PHP(サーバ)で受け取る

環境

マイクロコントローラー:ESP32
ファームウェア:Micropython1.3

サーバ:Ubuntu18.04
ウェブサーバ:Apache2
PHP:PHP7.4

※ESP32にMicropythonが入っていないと実行できませんのでご注意ください.
※もしMicropythonの入れ方を知りたい人がいたらこちらを参照ください. >>> ESP32にmicropythonを入れる方法(uPyCraftを使います)

やりたいこと

スクリーンショット 2020-12-11 13.54.02.png

例えば,ESP32からセンサーのデータを取得した後,データをサーバに送りたい!とか

今回は上の図のように,ESP32からファームウェアMicropythonで,サーバであるUbuntu18.04(Apache2)に対してHTTP POSTでデータ送信をします

ESP32

MicropythonにはHTTPリクエストをするためのモジュールが備わっています.
それがurequestsというモジュールです.

また今回はデータをJSON形式にして送信するので,そのためのujsonモジュールも利用します.

※なおurequestとujsonはPythonのモジュールであるrequestsとjsonと使い方はほぼ同じです

以下ソースコードになります.

import urequests
import ujson

#送信先のURLの指定
url = 'http://xxx.xxx.xxx.xxx/test.php'

#データをDICT型で宣言
powerdata = {
             "value" : "23.4",
             "text" : "Hello World!"
             }

#jsonデータで送信するという事を明示的に宣言
header = {
        'Content-Type' : 'application/json'
         }

#HTTPリクエストをPOSTとして送信
res = urequests.post(
    url,
    data = ujson.dumps(powerdata).encode("utf-8"),
    headers = header
)

#サーバ側からのレスポンスを受け取って表示(jsonのデコードも一緒にしている)
print (res.json())

#終了
res.close()

コードの意味はコメントアウトで書いてあるのでそちらを参照ください.

サーバ

受け取り側のプログラムはPHPを使って書いていきます.

予め,ウェブサーバであるApache2の起動を行っておいてください.

もしPHPのインストールが済んでいない方は下記コマンドでインストールをお願いします.

sudo apt install php7.4 libapache2-mod-php7.4
$ sudo systemctl start apache2
$ systemctl status apache2
● apache2.service - The Apache HTTP Server
   Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
  Drop-In: /lib/systemd/system/apache2.service.d
           └─apache2-systemd.conf
   Active: active (running) since Wed 2020-12-09 08:01:07 UTC; 1 day 21h ago
  Process: 8442 ExecReload=/usr/sbin/apachectl graceful (code=exited, status=0/SUCCESS)
 Main PID: 1049 (apache2)
    Tasks: 7 (limit: 4915)
   CGroup: /system.slice/apache2.service
           ├─1049 /usr/sbin/apache2 -k start
           ├─4001 /usr/sbin/apache2 -k start
           ├─8446 /usr/sbin/apache2 -k start
           ├─8447 /usr/sbin/apache2 -k start
           ├─8448 /usr/sbin/apache2 -k start
           ├─8449 /usr/sbin/apache2 -k start
           └─8450 /usr/sbin/apache2 -k start

次にPHPファイルを書いていきます.
Apache2は/var/www/html/配下にファイルを置きます.

test.php

<?php
//送られてきたPOSTデータを受け取って,JSONデータをデコードして$inに入れる.
$in = json_decode(stripslashes(file_get_contents('php://input')),true);

//送られてきたデータを取り出す
$value = $in["value"]; // = 23.4
$text = $in["text"];   // = Hello World!

//レスポンスを「Completed!」とし,それをJSONとして再度エンコード
//そして送信元(ESP32)へ返す.
echo json_encode("Completed!");
?>

コードの意味は同様にコメントアウト参照ください.

実行

ESP32にて実行をします.

>>> execfile("test.py")
["Completed!"]

実行をしてCompleted!という文字列が帰ってくれば成功です.

おわり

今回はHTTP POSTを使ってESP32からサーバへデータを送信しました.
これを応用すれば受け取ったデータをデータベースに保存することも可能になります.
時間があればその記事も書くつもりです.

1
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
cdsl
東京工科大学コンピュータサイエンス学部クラウド・分散システム研究室

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
1
Help us understand the problem. What is going on with this article?