sakura.io + Arduino + GROVE でGPSロガー (5)
さくらインターネットのsakura.io を使って電子工作初心者がIoTなGPSロガーを作るメモ。その5
[その1] [その2] [その3] [その4] [その5] [その6]
Outgoing Webhook
前回デバイスからプラットフォームへのデータ送信には成功しているので連携サービスの「DataStore」などで保存されているデータを取り出す事が出来ます。
今回は「Outgoing Webhook」を使ってデバイスからプラットフォームに送信されたデータを外部のサーバーで(ほぼ)リアルタイムに取得してみます。
sakura.ioのコントロールパネルよりサービス連携で「Outgoing Webhook」を追加します。
- [名前] 任意のメモ
- [Payload URL] 受信用プログラムのURL
- [Secret] 任意の文字列
※[Secret]には仮に「hoge」と入力しておく。
PHPでの受信例
$json = file_get_contents('php://input');
file_put_contents('./data.txt', serialize(json_decode($json , true)));
sakura.ioがJSON形式に変換してくれているのでPHPで受信する場合はこんなにも簡単です。
ただしこの状態だと[Payload URL]を知っていれば不正にデータを挿入できてしまいます。
非公開にしていたのにいつのまにかクローラに補足されて検索エンジンに登録されてる!といった事も時々ありますし。
Secretを使ってみる
[Secret]に文字列を入力するとレスポンスヘッダに‘X-Sakura-Signature’が付与されます。
この文字列を計算する方法はPHPではhash_hmac('sha1', $json, $secret)
となる。
//---すべてのレスポンスヘッダを取得(Apacheのみ)
$header_ary = getallheaders();
//---JsonデータとSecretとヘッダーの署名が必須
if($json && $secret && !empty($header_ary['X-Sakura-Signature'])){
//---受信した署名と比較
if($header_ary['X-Sakura-Signature'] === hash_hmac('sha1', $json, $secret)){
//データ保存するよ
}
}
つまりはこういう事です。
またプラットフォームからデータが飛んでくるタイミングはこちらからは分からない。
負荷の状況によっては溜まったデータが一気に吐き出される事があるかもしれないので1レスポンス毎に1ファイルをファイル名が重複しない形で生成する事にします。
index.php
の内容
<?php
//---PHP設定用のファイル
require_once("./config.inc.php");
//---Secret(コンパネに入力した文字列)
$secret = 'hoge';
//---POSTデータを受信する
$json = file_get_contents('php://input');
//---JSONをPHP連想配列に変換
$json_ary = json_decode($json , true);
//---/YYYYmm/YYYYmmdd/ に保存する
$dir = "../../_data/simple_gps/" . date("Ym") . "/" . date("Ymd");
//---タイムスタンプ + ランダムな数値 + ユニークIDで重複しない名前にする
$path = "{$dir}/" . time() . "_" . uniqid(rand(0, 9)). ".psrv";
//---すべてのレスポンスヘッダを取得(Apacheのみ)
$header_ary = getallheaders();
//---------------------------------------------
// +JsonデータとSecretとヘッダーの署名が必須
//---------------------------------------------
if($json && $secret && !empty($header_ary['X-Sakura-Signature'])){
//---受信した署名と比較
if($header_ary['X-Sakura-Signature'] === hash_hmac('sha1', $json, $secret)){
//---ディレクトリ生成
if(!is_dir($dir)){
mkdir($dir , 0777 , true);
}
//---シリアライズして保存
file_put_contents($path , serialize($json_ary));
}
}
?>
※config.inc.phpは各自お好きな内容を記載してください。
config.inc.php
の内容
<?php
//---タイムゾーン
date_default_timezone_set('Asia/Tokyo');
//---文字コード
ini_set('default_charset', 'UTF-8');
?>
実行結果
出力されたファイル一覧はこのような感じになるでしょう。
マイクロ秒単位の同時アクセスでもファイル名が重複しないはずです。
JSON形式でデータが飛んでくるのでPHPで受信するのはとても簡単です。
このデータをどのように活かしていくのか?
次回、定番のGoogleMapに軌跡を表示する方法を書いてみます。