LoginSignup
8
9

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-02-24

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`)

参考資料

8
9
0

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
  3. You can use dark theme
What you can do with signing up
8
9