準備編の続きです。
今回はFAXを受信し、画像ファイルが書き込まれた時点で、FlashAirから、NASへFTP転送する仕組みです。
以下はQNAP TS-131(4.2.2)とFlashAir W-03、FAXはKX-PD601Wでの作業を前提にしています。NASのIPアドレスは固定(192.168.0.xxx)です。
まず、ファイルを受け取るNASの設定をします。
- 転送先ディレクトリの作成
管理しやすいようにFTP用のディレクトリを作ります。今回はDataVol1下にftpを作成さらに、そのしたにfaxディレクトリを作り、パーミッションを777としました。 - FTP用アカウントの作成
FTPログイン用のアカウントを作ります。他のアカウントと共通でも可能ですが、ftpのログイン情報をスクリプトに記載するため、別管理としました。アカウント名は仮にfax、パスワードは任意のものとします。
Webで管理画面にログインして、「コントロールパネル」-「権限設定」-「ユーザー」にあります。安全のため、「共有フォルダー権限の編集」で先ほど作成したftpのみ読み書きできるようにします。 - FTPサーバーの有効化
Webで管理画面にログインして、「コントロールパネル」-「ネットワークサービス」-「FTP」にあります。
FTPサービスを有効にし、詳細設定の「set root directory」を先ほど作成した/ftpにします。
これで、faxアカウントでFTPでNASに接続し、/ftp/にアップロードできる環境がになりました。あとはFlashAirのFTPコマンドで/fax/画像ファイル名.jpg
にputします。ちなみに、FlashAirのスクリプトではputとgetしかできませんので、ディレクトリの追加や削除はできません。
次にFlashAirの設定をします。PCにFlashAirを差し込みSDカードとして認識させて作業します。
- FTP転送するためのスクリプトの作成
FlashAirにluaフォルダを作り、以下のスクリプトを newfileftpupload.lua として保存します。
今回使ったFAXは
/IMEXPORT
にjpegファイルがされるのでこのフォルダを監視します。-- 監視ディレクトリに新しいファイルが加わったら、ftpでアップロードする。 -- アップロードしたなかで一番新しいファイルのタイムスタンプを記録する。 -- 記録したタイムスタンプより古いファイルはアップロードしない。 -- 定数 local fpath = "/IMEXPORT" -- 監視ディレクトリ local server = "192.168.0.xxx" -- FTPサーバーのIPアドレス local serverDir = "/fax/" -- FTPサーバーのアップロード先フォルダ local user = "ftp" -- FTPユーザー名 local passwd = "(任意)" -- FTPパスワード local lastupload = "lastupload.txt" -- 最終アップロードファイルの日付を記録 print(lastupload) -- 最後にアップロードしたファイルの時刻の記録したファイルを検索 local lastfile = io.open(lastupload,"r") if lastfile then print("lastfile true") print(lastfile) -- 1行目に記録してあるアップロードしたファイルで最後にアップロードしたファイルの時刻を取得 lastuploadtime = lastfile:read() lastfile:close() else print("lastfile false") -- なければ、全てのファイルが対象になるので、timeは0 lastuploadtime = 0 end print(lastuploadtime) -- Assemble our FTP command string local ftpstring = "ftp://"..user..":"..passwd.."@"..server..serverDir -- 転送が終わったファイルの日付(最も新しいもの)を記録 local newmod = 0 -- 全ての転送ができると仮定 local success = true -- For each file in fpath... for file in lfs.dir(fpath) do -- Get that file's attributes attr = lfs.attributes(fpath .. "/" .. file) print( "Found "..attr.mode..": " .. file ) if attr.mode == "file" then --日付のチェック mod = lfs.attributes(fpath .. "/" .. file, "modification" ) print(mod..":"..lastuploadtime) if tonumber(mod) > tonumber(lastuploadtime) then print("upload...") --Attempt to upload the file! print(ftpstring..file) print(fpath .. "/" .. file) response = fa.ftp("put", ftpstring..file, fpath .. "/" .. file) --Check to see if it worked, and log the result! if response ~= nil then print("Success!") -- 日付を記録 if tonumber(newmod) < tonumber(mod) then newmod = mod end else print("Fail :(" .. response) success = false end end end end --転送が成功したら、lastupload.txtを更新 if success then print("complite") local lastfile = io.open("lastupload.txt", "w") lastfile:write(newmod .. "\n") lastfile:close() end
- ステーションモード(無線LAN子機)に設定
FlashAirの標準的な使用方法は独立した無線LANの親機となり、そこにスマホなどを接続し転送する形です。しかし、今回は子機としてLANに参加しますので、設定ファイルを書き換えます。
設定ファイルは/SD_WLAN/CONFIG
です。
以下のように変更または追加します。DHCPサーバを利用することとし、常に無線に接続するようにします。これらは設定ツールのFlashAir Toolでも行うことができます。APPMODE=5 APPSSID=無線LANのSSID APPNETWORKKEY=無線LANのパスワード APPAUTOTIME=0 DHCP_Enabled=YES
- 書き込みがあったらスクリプトを実行する設定
同じく/SD_WLAN/CONFIG
に次の一行を追加し、書き込みがあった場合に/lua/newfileftpupload.luaを起動するように設定します。LUA_SD_EVENT=/lua/newfileftpupload.lua
これでFAXに差し込めば、電源が供給され、画像が追加されるたびにNASに転送されます。今回使用したFAXでは、本体画面で内容を確認すると、ステータスの変更により再度画像ファイルが更新されます。それによっても再度ファイルが送信されてしまいますので、次回のメールでのお知らせの設定に工夫が必要ですが、今後の課題とします。
Tips(いくつかの追加情報です)
- FlashAirの設定ファイルやスクリプトをいろいろ変更した後、元に戻したい場合は、FlashAir Toolを使います。普通にフォーマットするとただのSDカードになってしまいます。
- ステーションモードでLANに接続できたかどうかを確認するには、コマンドラインから「ping flashair」が便利です。通常、SDカードに電源が入ってから、数秒から数十秒後に接続が完了します。IPアドレスも同時に確認できます。