これは さくらインターネットAdvent Calendar 2018 14日目の記事です。
こんにちはこたまごです。
FlashAirをカメラと一緒に使ってみたので、成果物と開発時に気づいたことをメモします。
毎年わたしだけさくらインターネットに関係ないようなことを書いてる気がしますが...
さくらインターネットには写真が好きな社員がかなりおおく写真に関連するサークルがいくつかあります。
わたしも写真部やインフラ研究部の一環で写真をよく撮りにいったり、サークル関係なく何人かの社員で撮影したりしてますので、まぁよしとしてください。
一部はTwitterやInstagram (1, 2) に掲載してます。
ということで、本題です。
FlashAirとは
公式の説明によると
FlashAirは、無線LAN機能を搭載したSDHC/SDXCメモリカードです。FlashAirは、カード単体で無線LANのアクセスポイントとして機能するため、FlashAir搭載機器同士でファイルの送受信を行ったり、PCやスマートフォンなど外部の無線LAN機器からFlashAir内のファイルにアクセスしたりすることが可能です。
FlashAirは、世界の主要な国で発売、利用されており、多数の機器で動作確認が行われています。
とあります。
が、FlashAirにはここに書かれた以上の価値があります。
一般的なWiFi内蔵SDカードは画像転送することだけを機能として持っていますが、このFlashAirは自分でプログラムを仕込んで、好きな動作をさせることができます。
ということで、カメラが趣味の私は何か作って遊べないかと思い、いつ使うのかわからない便利な機能を作ってみました。
作ったもの
カメラで撮影したタイミングでMacに写真を転送。
受信した写真を表示。
どんな写真が撮影されているか、大きなモニタでモニタリングすることができます。
作り方
実行するのに必要なファイル全体はREADMEと共にgithubに置いておきます。
https://github.com/chibiegg/airview
FlashAirにはSDカード内部に記録されたLuaスクリプトを実行する機能があります。
実行のタイミングは以下の中から選んで利用することができます。
( 参照:FlashAir Developers - Luaスクリプトの実行方法 )
- FlashAirの起動時
- FlashAirへファイルを書き込んだとき
- HTTPでアクセスがあったとき
今回は、ファイルを書き込んだときにLuaスクリプトを実行し、新しいファイルをGoで実装したサーバにHTTPで通知するような方法で実装しました。
画像送信をリトライできるように、Luaスクリプトから通知するのはファイル名のみで、JPEGファイルの実体はGo側からHTTPでダウンロードするようにしました。
FlashAirに仕込むLuaスクリプトはこちら (notify.lua) 。
サーバ側はGoで簡単なHTTPサーバを実装し、JPEGファイルのダウンロードは同時に走らないようにキューイングして行うようにしました。
サーバ側のコードはこちら (main.go)
画像の表示はブラウザで行うようにし、Ajaxを用いたポーリングで新しい画像を取得する、というレガシーな設計となっています。
サーバを起動した状態で、写真を撮ると通知が来て、どんどんダウンロードされるのがログからわかります。
工夫したポイント
/SD_WLAN/CONFIG
の LUA_SD_EVENT
は同時実行しないようになっています。
その制約のため、1ファイル1処理を必ずしたいという実装はなかなか難しいです。
今回は一度Luaスクリプトが起動したら、無限ループで終了しないようにし、ポーリング動作で動くようにしました。
そのため、本来はFlashAirの起動時に動作するようにしても問題なく動くと思います。
開発中に便利だったもの
FlashAirを機器の中で動かす場合のデバッグがちょっと大変でした。
最初はログをSDカード内に書き込もうと思ったのですが、カメラのようにファイルシステムを利用する機器の中で書き換え動作を行うと当然ですがファイルシステムが破壊されました。
FlashAir開発者向け非公式wiki | エラーを調べる方法 にいくつかのデバッグ方法が記載されているので、大変役に立ちました。
この中でも、私は http://flashair/eva.cgi にアクセスする方法でだいたい事足りました。
12月25日はさくらの聖夜
今年もさくらの聖夜を開催します。
わたしのこの内容もLTして、実演しようと思っていますので、ぜひお越しくださいー。