Edge: エッジサーバーからクラウドサーバーへcurlによるファイルのアップロード

Arduino開発

概要

エッジサーバ(例えば,Raspberrypiなど)からクラウドサーバーへ,curlを使ってファイルをアップロードする方法を示します。

構成

エッジサーバー(クライアント)において,センサから取得したデータを記録する。それらデータを,一定時間毎にクラウドサーバーへ送信(アップロード)する。

  • クライアント:エッジサーバー
  • サーバー:クラウドサーバー

実装

エッジサーバー側

エッジサーバー上に,ファイルをアップロードするスクリプト(up.sh)を用意する。

・エッジサーバー側・・・curlコマンドを用いて,POSTメソッドによりファイルをアップロードする。

#!/bin/sh
curl -X POST -F upfile=@<file_name> <server_url>

<例>エッジサーバー上のファイル(upload_file.csv)を,クラウドサーバー(webserver.loca)へアップロードする。

・アップロードするファイルの名前:upload_file.csv,

・クラウドサーバー上でアップロードされたファイルを受けるスクリプト:upload.php

#!/bin/sh
# up.sh
FILE=./upload_file.csv
SERVER=https://<server name>/upload.php
curl -X POST -F upfile=@$FILE $SERVER

ここで,upfile=@$FILEの,”@”マークは必ず必要です。

クラウドサーバー側

クラウドサーバーでは,エッジサーバーからアップロードされてきたファイルを受信するスクリプトを用意します。

ファイルを受信するスクリプト:upload.php

受信するファイル:upfile (curlで指定したupfileと同じ名前)

受信したファイルを保存するディレクトリ:「saved」ディレクトリを作成しておく。

・クラウドサーバー上で,エッジサーバーからアップロードされたファイルを保存するスクリプト(upload.php)。

「is_uploaded_file」 ファイルの受信を確認。

「move_uploaded_file」受信したファイルを保存先ディレクトリ(saved)へ移動。

<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>File receiver</title></head>
<body><p><?php
if (is_uploaded_file($_FILES["upfile"]["tmp_name"])) {
if (move_uploaded_file($_FILES["upfile"]["tmp_name"], "saved/" . $_FILES["upfile"]["name"])) {
echo $_FILES["upfile"]["name"] . "is uploaded.";
} else {
echo "Error: File is not uploaded.";
}
} else {
echo "Error: File is not uploaded.";
}
?></p>
</body></html>

実行

エッジサーバー側で,一定時間毎にアップロードスクリプト(up.sh)を実行する。ここでは,crontabに実行時間を指定する。

<例>エッジサーバー上で,「15分ごとに」ファイルのアップロードを実行する。

<crontab -e,次の一行を追加>

*/15 * * * * /usr/local/bin/up.sh

※ ”$ crontab -l”で,コマンドの登録ができたか確認できる。

まとめ

エッジサーバーからクラウドサーバーへ,curlを使ってファイルをアップロードする方法を示しました。エッジサーバーからクラウドサーバーへデータをアップロードするには,様々な方法があります。例えば,SSH,FTP,TFTP,MQTTなど。それらは,通信方式(プロトコル)の実装やサーバーを起動させる必要があるため手間がかかります。HTTPポートを使うと,クラウドサーバー上では標準的に開放されているポートのため,経路のファイヤウォールやフィルタ設定などを気にせず通信できます。実際使用する際には,(アップロードする)ファイルの確認を厳密に行ったり,ファイルを送信側でエンコードして送り,受信側でデコードするなどして暗号化する必要があります。

 

コメント

タイトルとURLをコピーしました