FlashAirで自動転送!カメラの写真をNASに直接FTPでアップしてみた話・・・

写真を自動でどこかにアップができるらしいということでTOSHIBAのFlashAirW-04を買ってみたのですが、どうやらプログラムしないと無理っぽいことがわかり挫折しかかりました。プログラムだめな素人なりにいろいろ調べまくり、様々試行錯誤した結果・・なんとかNASにFTPで自動転送できるようになりましたので情報をシェアしておきます。ただし・・ファイルが破損したり、消えたりのリスクがありますので、どうぞ十分試して問題ないと感じられてからお使いください・・(自分の環境でしかテストできていません)

3055

はじめに注意

芝のFlashAir Developersの公式ページにて簡単なFTPアップロードスクリプトが配布されています。

FTPでの転送を考えるなら、まず最初にこれを活用してみると思いますが、これは対象フォルダの画像を毎度毎度すべてアップしようとしますので、カメラで使用するには大変不便でした。

そこで、このftpアップロードスクリプトを改造できるか試してみました。

luaのfa.rename関数(ファイル・ディレクトリのリネームを行う)を使って、FTPでの転送完了後、画像ファイルをFlashAir内の別のフォルダに移動させたら、毎度アップすることはなくなるのでは、と思い一行書き加えてみました。

すると・・・ファイルが破損したり、サムネールだけのファイルとデータだけのファイルの2つに分裂したりとで大変なことになりました。うまくいくこともあったりするので、何が原因かさっぱりわからず大変悩んでしまいました。

この現象について、公式ページにその答えとなりそうな部分がありましたので引用しておきます。

ご注意
本機能を誤って使用すると、FlashAirのファイルシステムを破壊してデータを失う恐れがあります。 PCなどのSDメモリカードホスト機器はSDメモリカードの内容(FAT)をキャッシュしている場合がありますが、 本CGIで行った変更をSDメモリカードホスト機器が認識する方法がありません。 そのため、本CGIとSDメモリカードホスト機器から同時に変更を行うとFAT不整合が起こる可能性があります。
書き込み後は必ずカードをいったん抜いて再挿入するなどしてSDメモリカードホスト機器に再認識させてください。

↑これはネットワーク経由でFlashAir内のファイルを操作する場合の注意点ですが、自分が経験した不具合も同じことだと思われます。要するにカメラを介さずにFlashAir内のスクリプトで勝手に画像の場所を変えたり、画像を消去したりすると・・不整合が起きてしまうらしいのです。

なので、自動転送をどうしてもしたい場合は撮影した画像を動かしたり消去したりせず、そのままにしておく方法を考えなければなりません。

(それで、今ある転送方法のほとんどが、パソコンやスマホを使って外からデータを読みに行くような形になっているのですね・・・)

こちらで配布しているスクリプトを使うとうまく?いきました

れでも、なんとしてでもカメラ単体でNASにアップしたい・・・「flashair ftp upload」でgoogle検索すると、割と上位に表示されるこちらのページにて、FlashAirでFTPアップをするためのスクリプトを公開してくださっています。

実はこれ、かなり初期の段階で試してみたものの、うまくいかなかったのです。それで、ほかの方法を試行錯誤していたわけですが・・・ちょっとの知識をつけて再度こちらに戻ってきてみたら、すんなりとFTPで自動転送することがわかりました!

しかも、一度アップしたファイルは飛ばしてアップされるので速く、失敗も少ないです。

すばらしいです。感謝です!

ただし問題点として、「アップ後に画像を消去するオプションを設定するとデータ損失が起きる」という記載があります。これは先ほど述べた理由、カメラを介さずにFlashAir内のスクリプトが勝手にファイルを消去すると不整合が起きる、からだと思われます。

なので、画像は自動的に消去しないで、貯まったら手動で消すという運用方針で進めることが必要となります。

いろいろと制約はありますが、それでもこのパソコンやスマホに頼らずにストレージに直接保管できる作業性の良さは、一度経験してしまうともう戻ることができないです・・・

セッティング方法

1ファイルをこちらのページからダウンロードして解凍しておきます。「リポジトリをダウンロードする」をクリックします

https://bitbucket.org/harbortronics/flashair-ftp-upload/downloads/

↑ダウンロードファイルの中身はこんな感じ

2次にCONFIGファイルを編集します。もともとFlashAir内にあったCONFIGファイルに、ダウンロードしたCONFIGファイルの内容を追記する形をとります。(CONFIGファイルもバックアップをとっておきます)

なお、FlashAir内のCONFIGファイルは不可視フォルダ「SD_WLAN」内に入っています。

Macの方は、OSがSierra以降であれば「command + shift + . (ピリオド)」で不可視ファイルの可視化が可能ですのでお試しください。Sierra以前の場合は、無料のユーティリティーOnyxを使うなどして対応します。

↓もともとのFlashair内のCONFIGファイル例

[Vendor]

CIPATH=/DCIM/100__TSB/FA000001.JPG
APPMODE=4
VERSION=F15DBW3BW4.00.03
CID=02544d535733324755e27d617b011b01
PRODUCT=FlashAir
VENDOR=TOSHIBA
APPSSID=flashair01
APPNETWORKKEY=************
LOCK=1
WEBDAV=1
TIMEZONE=36

↓ダウンロードしたCONFIGファイル

[Vendor]

CIPATH=/DCIM/100__TSB/FA000001.JPG
APPNAME=flashair
APPMODE=5
APPSSID=
APPNETWORKKEY=
VERSION=FA9CAW3AW3.00.01
CID=02544d535731364731dc4a247900f901
PRODUCT=FlashAir
VENDOR=TOSHIBA

MASTERCODE=accf856bbe74
LOCK=1

UPLOAD=1
STA_RETRY_CT=0
LUA_SD_EVENT=/ftpupload.lua

↓もともとFlashAir内にあったCONFIGファイルを以下のように書き換え

[Vendor]

CIPATH=/DCIM/100__TSB/FA000001.JPG
APPMODE=5
VERSION=F15DBW3BW4.00.03
CID=02544d535733324755e27d617b011b01
PRODUCT=FlashAir
VENDOR=TOSHIBA
APPSSID=(ここに接続する無線LANのSSIDを書き込む)
APPNETWORKKEY=(ここに上記無線LANのネットワークキーを書き込む)
LOCK=1
WEBDAV=1
TIMEZONE=36
MASTERCODE=(12ケタの16進数の数字:flashairに接続するときのパスワード)
UPLOAD=1
STA_RETRY_CT=0
LUA_SD_EVENT=/ftpupload.lua

※固定IPにする場合は、以下をその続きに追記します。

DHCP_Enabled=NO
IP_Address=*.*.*.*(環境に応じて入力)
Subnet_Mask=*.*.*.*(環境に応じて入力)
Default_Gateway=*.*.*.*(環境に応じて入力)
Preferred_DNS_Server=*.*.*.*(環境に応じて入力)
Alternate_DNS_Server=*.*.*.*(環境に応じて入力)

CIDはSDカードのID、VERSIONはそのFlashAirのファームウェアのバージョンですので、もともとFlashiAir内にあったCONFIGの内容をそのまま使い、ダウンロードした内容をコピペしないように注意します。

また、STA_RETRY_CTについて、これはステーションモードでの無線LAN親機への接続リトライ回数を指定するのですが、ダウンロードしたCONFIGには0と記入されており、これは無限にリトライする設定になっています。外にカメラを持ち出して、無線LAN親機が見つからない環境でも無限にリトライするのはアレですので、3くらいに設定しておいてもよいかもしれません。自分の環境で3を試しましたが特に不具合はありませんでした。

編集が終わったら、FlashAir内の元と同じ場所に保存します。

3ダウンロードしたファイル「Settings.lua」を編集し、FlashAirのルートディレクトリ(FlashAirをfinder等で開いてすぐのフォルダ)に保存します。

-- FTP Settings --
logfile = "/FTPLog.txt" -- Where to log output on the FA
folder = "/DCIM" -- What folder to upload files from
server = "" -- The FTP server's IP
serverDir = "" -- The path on the FTP server to use.
user = "" -- FTP username
passwd = "" -- FTP password
delete_after_upload = false

順番に・・

  • ログファイルをどこに置くか、と、そのファイル名
  • Flashair内のアップロード対象フォルダ
  • NAS(FTPサーバー)のIPアドレス
  • NAS内のアップロード先フォルダ
  • FTPユーザー名
  • FTPパスワード
  • アップロード後に画像を消去するかどうか

自分のところの例です。

-- FTP Settings --
logfile = "/FTPLog.txt" -- Where to log output on the FA
folder = "/DCIM/104_FUJI" -- What folder to upload files from
server = "192.168.1.2” -- The FTP server's IP
serverDir = "/photos/fujiX-E2" -- The path on the FTP server to use.
user = “user1” -- FTP username
passwd = “abcdefg” -- FTP password
delete_after_upload = false

ここで注意しておく点は・・・

  • アップロード対象のフォルダは、ちゃんとルートからのパスを記入し、画像が保存されるサブフォルダを指定すること
    DCIMを指定しておけば、その下のサブフォルダまで全部検索してアップしてくれる・・なんてことはありません。
  • アップロード対象として設定したフォルダ、DCIM下の何らかのフォルダ名は1万枚撮影したら変わってしまいますが、そこはあきらめて変化する毎にフォルダ名を書き換えて対応するようにします。
  • delete_after_uploadについては、先ほども述べましたがこれをtrueにすると大変なことになるので、falseのままいじらないようにします。

4FlashAirのルートディレクトリに、「uploaded」という名前の空フォルダを作ります。ここにアップしたファイルの情報が書き込まれるようです。

↑いくつか撮影してアップロードが完了後に「uploaded」フォルダを見てみると・・・こんな感じになっていました。

5最後に、ダウンロードしたファイルのうち、「ftpupload.lua」をFlashAirのルートディレクトリにコピーして完了です。

↑セッティング完了後はこんな感じ
↑何枚か撮影してFTPで転送した後のFlashAir内はこんな感じ

6画像がいっぱいになってきたら、画像ファイルそのものと、uploadedフォルダ内のファイルログファイルを消去します。

 

以上です。

それでも不具合発生することがありました

う一台のカメラ、SONY DSC-RX10M3で使ってみたところ、ほとんど問題は発生しなかったのですが、ごくまれにFlashAir内に存在しないはずのファイルをカメラが表示しようとして「表示できない画像です」のエラーが出ることがありました。

なぜそうなったのかよくわからないのですが、無線LANに接続できなかった場合などで何らかの不整合が発生したのかもしれません。

「表示できない画像です」をパソコンで消そうとしても、ファイルそのものが存在しないため(不可視ファイルにも存在しない)、どうしようかと困っていましたが、カメラ側で一つ一つ地道に削除すればその不整合はとりあえず解消されました・・

もしくは、SONY系のカメラがすべて同じ操作方法かわからないのですが、カメラで以下のフォルダ内表示をさせるモードを選択すると、この「表示できない画像」は一気にすべて消えました。

こうやってカメラ側にファイルが存在しないことを認識させるのも一つの方法なのかもしれません。

↑いろいろいじってみたところ、このようにフォルダ内画像を表示させるモードにしてみたら、表示できない画像はすべて消えました。

やはり、このFlashAirから直接FTPアップロードは推奨できない方法なのでしょうね・・・

上記不整合が発生したのは今のところ一度だけですので、自分は意地でもこの方法を続けるつもりですが、もし試される方は、何度も申し上げていますが、十分テストをして、破損リスクを覚悟の上でお使いいただいた方がよいと思います。

最後に・・

Flashairを買った人で自分のようにNASに直接アップしたい・・と考える人は少なくないのではと思います。それにもかかわらずネット上に情報が少ないのは、これまで述べてきたとおり画像破損のリスクが大きいからだと思います。

自分は本件でかなり試行錯誤し、時間を相当無駄にしてしまったので、同じようなことを考えた方のためにネットに情報を残しておこうと思いますが、この方法を試される方はくれぐれもそのリスクを認識した上で行っていただければと思います。

(最近よく見かけるクラウド(FlashAir IoT Hub)経由でアップするのが正しい道なんでしょうね・・・)

最後に・・・このスクリプトを作ってくださった方に感謝です!