LoginSignup
9

More than 5 years have passed since last update.

posted at

updated at

Organization

とにかく最小の手数でFlashAirをWebDAVサーバ化する

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オプションに uidgid を自分自身にマップしています

取外しは 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 を付けるようにしています。

あとがき

次はこの /mntinotify(7) で監視できるか確認しちゃうよ

davfs2には FUSE_POLL が実装されていないため、inotify(7)によるファイルシステム監視ができません
davfs2/src/kernel_interface.c

そのため、新しいファイルが作成されたか否かを調査して、それに対応するハンドリングを行う場合は lsなりで変更検知を自力実装 する必要があります (つo`)

参考資料

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
9