TL;DR
- FlashAir内の
/SD_WLAN/CONFIG
を書き換え - Ubuntuから
mount -t davfs http://192.168.0.1 /mnt
これだけでOK
※davfs2 は inotify 非対応です (2017/2/26 追記, 当エントリーの最後をご覧ください)
概要
東芝のFlashAirという SDカードスロット to Wi-Fi ブリッジデバイス があります (かなり歪曲した紹介)
LinuxからSDカード(/dev/sd
や /dev/mmcblk
)としてマウントできるのに、実はFlashAir自身がサーバとして動くこともできる、なかなかのクセモノです
最新版のW-03では、WebDAVサーバとして稼働します。すなわち、FlashAir内のファイルをWi-Fi経由でWebDAVでマウントできてしまいます
何に使うの?
外部機器とのI/Fは、SDカードのみ というデバイスを、Wi-Fi経由でWebDAV化できるというものです
検証環境
- Linuxマシン: Ubuntu 16.04
- FlashAir: W-03 (ファームウェア 3.00.01)
FlashAirの工場出荷時設定への戻し方
最初にFlashAirを工場出荷時設定(ファクトリーリセット)するには FlashAir設定ソフトウェア を使います
※それ以外の方法が見当たりませんでした。よって、SDカードが認識可能なWindows PCかMacを用意しておくと安心です
/SD_WLAN/CONFIG
を直接編集して、FlashAirをWebDAVサーバとして構成する
普通はFlashAir設定ソフトウェアを使うのが正攻法なのですが普通すぎるので、ここでは /SD_WLAN/CONFIG
を編集して WebDAVサーバ化することにします
設定条件
- FlashAirを無線LANのAPとしての設定
- IP: 192.168.0.1 (標準)
- SSID:
flashair_<FlashAirのMACアドレス>
(標準) - パスフレーズを
flash_air
に変更(WPA2-PSK/AES) - APのタイムアウトを 無限 に変更
- FlashAirドライブ(WebDAV)としての設定
- ReadOnlyとして公開
- タイムゾーン: JST
FlashAirへの作業
マウント
UbuntuにFlashAirを挿すと、自動的に /media/<USERNAME>/<HOGE-BAR0>
にストレージとしてマウントされます
そうでなければ sudo mount /dev/mmcblk0p1 /mnt
としてマウントします
いづれにしても、このマウントポイントを $FLASH_AIR_ROOT
とします
/SD_WLAN/CONFIG
の書き換え
転ばぬ先の杖として $ (cd $FLASH_AIR_ROOT/SD_WLAN ; cp -p CONFIG CONFIG.origin)
とオリジナルのバックアップを取っておくと良いでしょう
$ sed -i.before \
-e "s/\(APPNETWORKKEY\)=.*$/\1=flash_air\r/" \
-e "$ a\APPAUTOTIME=0\r" \
-e "$ a\TIMEZONE=36\r" \
-e "$ a\WEBDAV=1\r" \
$FLASH_AIR_ROOT/SD_WLAN/CONFIG
これで sudo umount $FLASH_AIR_ROOT
とした後にFlashAirを一旦SDカードのスロットから抜き、再度挿すと上記の設定で動き始めます
やっちまった!と思ったら先ほどの CONFIG.origin
を戻すか、FlashAir設定ソフトウェアで回復するようにしましょう
Ubuntuから WevDAV で接続する
davfs2
インストール
davfs2
を利用します
FlashAirのAPに接続するとインターネットと切り離されますので、先にインストールを済ませてください
$ sudo apt install -y davfs2
インストールの途中で "特権ユーザ以外にマウントさせるか否か" を聞いてくるので、お好きにお選びください(私はNoにしました)
mount
FlashAirのAP (flashair_<MACアドレス>
) に接続し mount(8) を実行します
$ sudo mount -t davfs http://192.168.0.1 /mnt -o ro -o uid=$(id -u) -o gid=$(id -g)
Please enter the username to authenticate with server
http://192.168.0.1 or hit enter for none.
Username:
Please enter the password to authenticate user with server
http://192.168.0.1 or hit enter for none.
Password:
/sbin/mount.davfs: warning: the server does not support locks
Username と Password は共に enter
(=なし) で構いません。無事 /mnt
にマウントできているはずです
$ ls -lF /mnt
合計 0
drwxr-xr-x 3 ma2shita ma2shita 0 8月 29 2013 DCIM/
drwx------ 2 ma2shita ma2shita 0 2月 24 22:11 lost+found/
※mountオプションに uid
と gid
を自分自身にマップしています
取外しは umount(8) です
$ sudo umount /mnt
/sbin/umount.davfs: waiting while mount.davfs (pid 15227) synchronizes the cache .. OK
※flashに若干時間がかかるようです
TIPS: davfs接続時の Username と Password のダイアログを止めたい
/etc/davfs2/secrets
に、下記のように書き込めばOKです
$ echo 'http://192.168.0.1 guest "guest"' | sudo tee -a /etc/davfs2/secrets
一般ユーザとしてマウントする場合は ~/.davfs2/secrets
になります。フォーマットは /etc/davfs2/secrets
と全く同じです
トラブルシュート
/sbin/mount.davfs: Mounting failed.
501 Not Implemented
と言われてマウントできない
解決策: /SD_WLAN/CONFIG
のファイルフォーマットはINI形式ですが、改行コードが CRLF である必要があります
LFのみだと設定が反映されません
書き換え時のsedでも "\r" と CR を付けるようにしています。
あとがき
次はこの /mnt
を inotify(7) で監視できるか確認しちゃうよ
davfs2には FUSE_POLL が実装されていないため、inotify(7)によるファイルシステム監視ができません
davfs2/src/kernel_interface.c
そのため、新しいファイルが作成されたか否かを調査して、それに対応するハンドリングを行う場合は ls
なりで変更検知を自力実装 する必要があります (つo`)