環境
マイクロコントローラー:ESP32
ファームウェア:Micropython1.3
サーバ:Ubuntu18.04
ウェブサーバ:Apache2
PHP:PHP7.4
※ESP32にMicropythonが入っていないと実行できませんのでご注意ください.
※もしMicropythonの入れ方を知りたい人がいたらこちらを参照ください. >>> ESP32にmicropythonを入れる方法(uPyCraftを使います)
やりたいこと
例えば,**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型で宣言
data = {
"value" : "23.4",
"text" : "Hello World!"
}
#jsonデータで送信するという事を明示的に宣言
header = {
'Content-Type' : 'application/json'
}
#HTTPリクエストをPOSTとして送信
res = urequests.post(
url,
data = ujson.dumps(data).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からサーバへデータを送信しました.
これを応用すれば受け取ったデータをデータベースに保存することも可能になります.
時間があればその記事も書くつもりです.