2015年3月18日水曜日

FlashAirとMicrosoftAzureを連携してやる(アップロード編)

東芝から発売されているSDカード「Flash Air™」をご存知でしょうか?
SDカード+Wi-Fi機能という、なかなかのものです。
http://www.flashair.info/

それだけなら、Eye-Fiとかでいいじゃん、と思うかもしれません。
ところが、こいつはLuaスクリプトを実行できるんですね。
さらに、PIO制御ができたり、なんか狂ってて素敵ですね。
そんな開発者向け情報はこちらで。
https://flashair-developers.com/ja/

なんとなく気になったので、もちろんMicrosoftAzureと連携してみます。

新しいファイル(sample.jpg)が追加されたら、MicrosoftAzureのBlobにアップロードする、というのをやってみましょう。
ただ、Azureストレージの認証ヘッダーをFlashAirだけで作れないので、セキュリティも考慮してPHP経由でアップロードしたいと思います。

まずは、FlashAirがインターネットにつながるように設定します。
Macなら、ターミナルで隠しフォルダと隠しファイルが直接編集できます。
カードの名前を「FLASHAIR」とします。

$ vi /Volumes/FLASHAIR/SD_WLAN/CONFIG
APPMODE=5
APPSSID=HWD15_581F28C13B88
APPNETWORKKEY=***************
LUA_SD_EVENT=/upload.lua

変更箇所だけ説明します。
APPMODEの初期値は4 (無線LAN親機)ですが、5(無線LAN子機)に変更します。
APPSSIDに接続するSSID、APPNETWORKKEYにはパスフレーズを設定します。
これで次回起動時に無線LANにつながります。
LUA_SD_EVENTは、カードにファイルが追加された際に発生するイベントで、そのタイミングで実行するLuaプログラムを指定します。
今回は、カードの「/」にあるupload.luaを指定します。

upload.luaは以下の内容です。
以下の例を参考に、PHPでのアップロードに必要なMAX_FILE_SIZEを追加します。

アップロード先は、今回はAzureWebSites上のPHPです。

$ vi /Volumes/FLASHAIR/upload.lua
boundary = "--1234567890"
contenttype = "multipart/form-data; boundary=" .. boundary
filepath = "sample.jpg"
mes = "--"
  .. boundary .. "\r\n"
  .."Content-Disposition: form-data; name=\"MAX_FILE_SIZE\"\r\n\r\n800000\r\n"
  .."--" .. boundary .. "\r\n"
  .."Content-Disposition: form-data; name=\"file\"; filename=\""..filepath.."\"\r\n"
  .."Content-Type: text/plain\r\n"
  .."\r\n"
  .."\r\n"
  .."--" .. boundary .. "--\r\n"

blen = lfs.attributes(filepath,"size") + string.len(mes) - 17

b, c, h = fa.request{url = "http://flashair.azurewebsites.net/up.php",
  method = "POST",
  headers = {["Content-Length"] = tostring(blen),
  ["Content-Type"] = contenttype},
  file = filepath,
  body = mes
  }


次は、アップロード先のPHPプログラムです。
Azure SDK for PHPの準備(https://github.com/Azure/azure-sdk-for-php)と、Azureストレージの設定とコンテナの作成が別途必要です。

$ vi up.php
require_once 'bin/vendor/autoload.php';
use WindowsAzure\Common\ServicesBuilder;

$account = 'Azureストレージのアカウント';
$key = 'アクセスキー';
$container = 'アップロード先のコンテナ名';

$connection = 'DefaultEndpointsProtocol=https;AccountName=' . $account . ';AccountKey=' . $key;
$blob = ServicesBuilder::getInstance()->createBlobService($connection);

/* save file */
$a = time();
$filename = "blob_" . "$a";
move_uploaded_file($_FILES['file']['tmp_name'], $filename);

/* upload Blob */
$content = fopen($filename, "r");
try {
  $blob->createBlockBlob($container, "claudia.jpg", $content);
} catch (Exception $e) {
}
fclose($content);

unlink($filename);


これで、sample.jpgというファイルをFlashAirに書き込むと、Azureストレージに自動でアップロードされます。

サンプル程度ですが、興味があればどうぞ。



0 件のコメント: