デジカメ内部でRubyを動かす狂気!無線LAN内蔵SDカードアダプタPQI Air Cardの間違った使い方
2016/03/24
価値ある情報をユーザー視点で発信するブログ
2016/03/24
もくじ
先日紹介した、microSDHCカードを無線LAN内蔵SDカードにするSDカードアダプタPQI Air Card。
PQI Air CardはmicroSDHCカードをSDカードサイズに変換するアダプタでありながら、内部に無線LANとWebサーバを搭載。それを通じて無線で画像を転送することができます。
既存の製品との最大の差別化のポイントは、ストレージ部分をmicroSDHCとして分離したことで、使用するmicroSDHCカードを自由に選べることです(※)。
※: microSDHCの4GB〜32GBまでという制約あり
95MB/sで現在世界最速のmicroSDHCカード、SanDiskのExtreme Proを使用した場合、既存の製品であるEye-Fi、FlashAir、Flucard Proをはるか後方に置き去るスピードが出ます。4kのシーケンシャル書き込み38.98MB/sに注目。
これまでは無線LAN内蔵SDカードを使おうとする場合、スピードか、利便性かのトレードオフを迫られたのですが、そうした葛藤は過去のものとなりました。
速さも、利便性も、その両方が我らの手中にあります。
PQI Air CardはARM CPUを搭載。
# cat /proc/cpuinfo Processor : ARM926EJ-S rev 5 (v5l) BogoMIPS : 421.06 Features : swp half fastmult edsp java CPU implementer : 0x41 CPU architecture: 5TEJ CPU variant : 0x0 CPU part : 0x926 CPU revision : 5 Hardware : KeyASIC Ka2000 EVM Revision : 0000 Serial : 0000000000000000
OSにLinuxを採用。
# cat /proc/version Linux version 2.6.32.28 (root@ubuntu-desktop) (gcc version 4.5.2 (Sourcery G++ Lite 2011.03-42) ) #244 PREEMPT Mon Jun 11 11:39:31 CST 2012
Webサーバ以外にも、ftpサーバ、telnetサーバがデフォルトで動作しており、あまつさえ、microSDHCカードのルートディレクトリにautorun.shというシェルスクリプトを置くことで、動作をカスタマイズできるのが面白いところです。
PQI Air Card、キミに首ったけ!(昭和)
今回は、Linux箱としてのPQI Air Cardをいじくり倒すために、またデジカメとの連携のために必要な知識というものを書いていきたいと思います。(続きは[Read More]から)
microSDHCスロットこそありませんが、PQI Air Card同様、autorun.shでカスタマイズできる作りになっているのがTrek2000のFlucard Proです。
PQI Air Card内部のスクリプトの内容を確認すると「FLU」という文字が見つかるなど、Flucard Proをベースにして作られたものだとはっきりわかります。
これに関して、Flucard Proの開発元であるTrek2000は承知のことではないようで、PQI Air CardはFlucard Proを勝手にコピーしたもののようです。
PQIの画面を消去してwifiをon は何かうちの特許に引っかかる様な気がしないでもない…。
— Trek2000 (@JpnTrek2000) October 23, 2012
オープンソースの成果物でできたFlucard Proで、どの程度権利を主張できるものか分かりませんが、我々ユーザーも、PQI Air CardとFlucard Proとの微妙な関係性については知っておいていいかもしれません。
PQI Air Cardをいじくるために、PQI Air Cardに無線LANで接続します。
そうするためには、大きく二つ方法があります。
A. まずは通常通りPQI Air Cardを無線LANアクセスポイントとして機能させ、そこに接続しに行く方法。この場合は、PQI Air Cardでネットワークが行き止まりとなり、PQI Air Cardに接続している間は、インターネットに接続できなくなってしまいます。
B. もう一つは、無線LANルータのアクセスポイントにPQI Air Cardを接続させ、無線LANルータを経由して接続する方法。Hotspot接続機能と言っているやつですね。この場合は、PQI Air Cardに接続しながら、同時にインターネットも利用できるため、こちらの方が便利です。
このB.の方法で接続させるためには、まずPQI Air CardのWifi SetupでHotspotsの項を埋めます。自宅の無線LANルータなどのSSIDとKEYを入力。欄が三組ありますが、PQI Air Cardは、上の欄から下の欄の順に向けて、最初につながるものに接続します。例えば、自宅のルータ、ポケットルータ、テザリング機能付きスマートフォンといった感じになるでしょうか。
設定後、デジタルカメラ側で緑色の画像を削除するか、専用スマートフォンアプリの設定にある「ホットスポットに接続」ボタンを押すかでモードを切り替えます。
つまり、いったんは無線LANアクセスポイントとして動かしたPQI Air Cardに接続した上で、モード切り替えをするという段取りを踏むことになるわけです。
PQI Air Cardと無線LANで接続。しばらく別のことをやっていて、ターミナルに戻ってみると接続が遮断されている、ということが頻繁に起きます。
おそらくは省電力機能が機能しているのだと思いますが、いじくり倒そうというのに、これでは困ります。
PQI Air Cardに接続したら、PQI Air Cardに対してpingを実行し続けると接続が安定します。
$ ping [IPアドレス]
PQI Air Cardは、基本的にデジタルカメラに挿入した状態で動かすことを前提にした作りのようで、メモリーカードリーダーに挿して動かしたりすると、うまく動かないことが多いと思います。
うまく動かない場合の動作例としては、PQI Air Cardで無線LANが動作し始めた瞬間にマウントが外れたり、管理用画像を削除してもウンともスンとも言わなかったり、というものがあります。
自分の使っている15インチRetina MacBook Pro内蔵のSDカードリーダーでは、そこそこいい感じで動くのですが、手持ちの2種のUSBメモリーカードリーダーではうまく動きません。
デジタルカメラに挿せば動くとはいっても、デジタルカメラ用のACアダプタが無かったりで、長時間動作させるのが難しい場合があるかと思います。
Lynx-EyEDのあつをさんは、GREEN HOUSEのGH-CRSDXCを使い、これをUSB電源に接続して動かしているということです。手持ちの機材ではうまく動かない場合には、GREEN HOUSEのGH-CRSDXCを試してみるといいでしょう。
GH-CRSDXCをUSB電源につなぎさえすれば、PQI Air Cardが動くのです。
メモリーカードリーダーによって、これができるものとできないものがあるということです。「CMD0,ACMD41と思われる初期化コマンドが発行されるSDカードリーダをください」とお店で頼んでも、出てくるわけもありませんから、PQI Air Cardの開発環境として買うなら、現状GH-CRSDXCしかなさそうですね。あつをさんの貴重な情報に敬意を表してGH-CRSDXCを「あつをリーダー」と呼びたいと思います。
CRW-SD42でもいけたとのことです。
PQI Air Cardに給電するのは、LOAS CRW-SD42 http://t.co/pOJcOOgw でいけた。 http://t.co/Vp5ISO0p
— muraky (@muraky) November 5, 2012
ELECOMのMR-C21でもいけるそうです。
このカードリーダでもAP立ったけどもう売ってないな。ユニットコム系で投げ売りしてたのだけど。 http://t.co/n5DtHl9R http://t.co/r7Des6ye
— F@L (@falms) November 5, 2012
100円ショップで入手できる丸七のMR-27で動作しました。コメントで教えてもらった同じく丸七のMT-05でもいけるそうです。
コメントで教えてもらいましたが、ローソンストア100で販売されている「来邦工業」製のSDカードリーダーでもいけるそうです。
autorun.shという名前のシェルスクリプトをmicroSDHCのルートディレクトリに置いておくと、それがPQI Air Cardの起動処理の最後に実行されます。
autorun.sh が実行されるのは起動処理の一番最後なので、それ以前の段階に割り込んで何かをすることはできませんが、それでもいろいろなことができます。
autorun.shを使うと、PQI Air Cardの動作をユーザー側で変更してしまうことができるのです。
▲Flucard ProにはTXD、RXDのパッドがあり、ここからシリアルコンソールを引き出せそうなので、PQI Air Cardでも、同様にしてuboot経由でより深いハックが可能かもしれません。(Photo: @numpad0 (License CC-BY-SA))
autorun.shの中でコマンドが実行できます。
#!/bin/sh find /mnt/sd/DCIM >/mnt/sd/filelist.txt sync
microSD側に何か変更を加えたら、syncコマンドを実行しておいた方がよさそうです。
PQI Air CardのOSはRAMディスク上で動いており、あまり空き容量がありません。
autorun.shからOS側にファイルを追加したい場合は、ファイルをコピーするのでなく、lnコマンドでシンボリックを張るようにします。
#!/bin/sh ln -s /mnt/sd/DCIM/somefile /usr/bin/ ln -s /mnt/sd/DCIM/somedir/* /etc/
OSに含まれるファイルを置き換える場合は、元ファイルを消してからシンボリックリンクを張るといった手順を踏みます。
#!/bin/sh rm /bin/vi ln -s /mnt/sd/DCIM/122_TREK/busybox /bin/vi
Webサーバ、telnetサーバ、ftpサーバなど、最初からPQI Air Card上で動作しているサーバがありますが、これらの設定を変更することもできます。
以下はftpサーバであるftpdを一度終了させて、設定を変えて再度起動しています。
#!/bin/sh killall tcpsvd tcpsvd 0 21 ftpd -w / &
PQI Air Cardは、ローカルのファイル操作と、ネットワークを介してのファイル操作との間で衝突が起きないように作られているようで、したはずのファイル操作、例えばテキストファイル、スクリプトを編集したはずなのに、それが反映されていない、ということがまま起きます。
再現性についてちゃんと検証できていませんが、そういう不整合が起きる可能性があることを知識として知っておいてください。
PQI Air Cardを無線LANアクセスポイントに接続し、クライアントとして動作させたい。
そのようにすれば、PQI Air Cardからインターネットに接続するコマンドを実行できますし、調べ物をしながらの作業もしやすくなります。
しかし、一度無線LANアクセスポイントとして機能させ、そこに接続した上でクライアント動作(ホットスポット接続)に切り替えるというのは、何とも面倒です。
この場合は、「PQI Air Cardとの無線LAN接続」の項で説明した設定をした上で、autorun.shに以下の内容を記述します。
#!/bin/sh sleep 5 /usr/bin/w2
/usr/bin/w2が、PQI Air Cardをクライアント動作させるコマンドです。
sleep 5は移行までの待ち時間として設定したものですが、環境依存はあるかと思いますので試行錯誤してみてください。
/usr/bin/w2を実行すると、設定にあるSSIDに接続しに行きます。
接続先が無線LANルータなら、無線LANルータがPQI Air CardにIPアドレスを払い出しますから、無線LANルータのDHCPテーブルなどを参照してIPアドレスを調べてください。
IPアドレスが分かったら、先述のようにそのIPアドレスへ向けてpingを実行し、接続を安定させます。
ping [IPアドレス]
PQI Air Cardにtelnet接続するのは簡単です。
telnet [IPアドレス]
これでつながります。特にユーザ名などを指定する必要はありません。
ftpの場合も同様。
ftp [IPアドレス]
Webインターフェースの方もしかりで、言ってみれば、セキュリティも糞もありませんので、無線LANの方のセキュリティには気をつけてください。
PQI Air Cardにtelnetでログインして最初に面食らうのが、エディタが無いことでしょう。
当然あるものと思うviを実行しようとしても、「vi: applet not found」というメッセージをくらうはずです。
これは、PQI Air Cardに入っているbusybox(UNIXコマンドの集合体)のサイズを小さくするために、必要のないアプレットが省かれているからです。
先ほどの「ファイルを追加する」、「ファイルを置き換える」の項でやったように、microSDHCの領域を活用するならば、そんな制約を気にする必要はありませんので、いろいろなコマンドを入れていきましょう。
PQI Air Cardは、先達となるFlucard Proと酷似したプラットフォーム。
Flucard Proは少し前に一部の組み込みクラスタで流行したガジェットで、そのときの成果物を流用できます。
その中心人物になるのが、@tonsuke85氏、@osakanataro氏。彼らの成果物を活用させてもらうことにします。
とんすけ氏がFlucard Pro用にビルドしてきた追加コマンドが下記のページにあります。
ページ中段にあるdeploy_20120420.zipがお目当てのものです。
この中には、アプレット全部入りのbusybox、ruby、perl、dropbear、JPEGからEXIFを抜き出すjheadなどが含まれています。こちらのbusyboxに含まれるアプレットは以下。
BusyBox v1.19.4 (2012-04-04 15:08:58 JST) multi-call binary. Copyright (C) 1998-2011 Erik Andersen, Rob Landley, Denys Vlasenko and others. Licensed under GPLv2. See source distribution for full notice. Usage: busybox [function] [arguments]... or: busybox --list[-full] or: function [arguments]... BusyBox is a multi-call binary that combines many common Unix utilities into a single executable. Most people will create a link to busybox for each function they wish to use and BusyBox will act like whatever it was invoked as. Currently defined functions: [, [[, acpid, add-shell, addgroup, adduser, adjtimex, arp, arping, ash, awk, base64, basename, beep, blkid, blockdev, bootchartd, brctl, bunzip2, bzcat, bzip2, cal, cat, catv, chat, chattr, chgrp, chmod, chown, chpasswd, chpst, chroot, chrt, chvt, cksum, clear, cmp, comm, cp, cpio, crond, crontab, cryptpw, cttyhack, cut, date, dc, dd, deallocvt, delgroup, deluser, depmod, devmem, df, dhcprelay, diff, dirname, dmesg, dnsd, dnsdomainname, dos2unix, du, dumpkmap, dumpleases, echo, ed, egrep, eject, env, envdir, envuidgid, ether-wake, expand, expr, fakeidentd, false, fbset, fbsplash, fdflush, fdformat, fdisk, fgconsole, fgrep, find, findfs, flock, fold, free, freeramdisk, fsck, fsck.minix, fsync, ftpd, ftpget, ftpput, fuser, getopt, getty, grep, groups, gunzip, gzip, halt, hd, hdparm, head, hexdump, hostid, hostname, httpd, hush, hwclock, id, ifconfig, ifdown, ifenslave, ifplugd, ifup, inetd, init, insmod, install, ionice, iostat, ip, ipaddr, ipcalc, ipcrm, ipcs, iplink, iproute, iprule, iptunnel, kbd_mode, kill, killall, killall5, klogd, last, less, linux32, linux64, linuxrc, ln, loadfont, loadkmap, logger, login, logname, logread, losetup, lpd, lpq, lpr, ls, lsattr, lsmod, lspci, lsusb, lzcat, lzma, lzop, lzopcat, makedevs, makemime, man, md5sum, mdev, mesg, microcom, mkdir, mkdosfs, mke2fs, mkfifo, mkfs.ext2, mkfs.minix, mkfs.vfat, mknod, mkpasswd, mkswap, mktemp, modinfo, modprobe, more, mount, mountpoint, mpstat, mt, mv, nameif, nbd-client, nc, netstat, nice, nmeter, nohup, nslookup, ntpd, od, openvt, passwd, patch, pgrep, pidof, ping, ping6, pipe_progress, pivot_root, pkill, pmap, popmaildir, poweroff, powertop, printenv, printf, ps, pscan, pstree, pwd, pwdx, raidautorun, rdate, rdev, readahead, readlink, readprofile, realpath, reboot, reformime, remove-shell, renice, reset, resize, rev, rm, rmdir, rmmod, route, rpm, rpm2cpio, rtcwake, run-parts, runlevel, runsv, runsvdir, rx, script, scriptreplay, sed, sendmail, seq, setarch, setconsole, setfont, setkeycodes, setlogcons, setserial, setsid, setuidgid, sh, sha1sum, sha256sum, sha512sum, showkey, slattach, sleep, smemcap, softlimit, sort, split, start-stop-daemon, stat, strings, stty, su, sulogin, sum, sv, svlogd, swapoff, swapon, switch_root, sync, sysctl, syslogd, tac, tail, tar, tcpsvd, tee, telnet, telnetd, test, tftp, tftpd, time, timeout, top, touch, tr, traceroute, traceroute6, true, tty, ttysize, tunctl, ubiattach, ubidetach, ubimkvol, ubirmvol, ubirsvol, ubiupdatevol, udhcpc, udhcpd, udpsvd, umount, uname, unexpand, uniq, unix2dos, unlzma, unlzop, unxz, unzip, uptime, users, usleep, uudecode, uuencode, vconfig, vi, vlock, volname, wall, watch, watchdog, wc, wget, which, who, whoami, whois, xargs, xz, xzcat, yes, zcat, zcip
値千金のzipですよ。
とりあえず、zipをmicroSDHCのルートディレクトリに展開します。
microSDHCのルートディレクトリからたどると「DCIM/122_TREK/.….」となるように展開できていればOKです。
PQI Air Cardには標準搭載されているperlが、このzipにも入っています。
PQI Air CardはWebインターフェースの動作に内蔵のperlを使っていますので、このまま導入すると問題が生じる可能性もあります。
zipに入っているperlをとりあえず削除します。
モジュールなどはzipに入っている方が充実しているかと思いますので、もしperlを重要視するならば、そこは使う人がどちらを残すか決めてください。
zipに入っているrubyを動かそうとすると、/lib/libpthread.so.0に関係したエラーが出ます。
影響が未知数ですが、PQI Air Cardに元からある/lib/libpthread.so.0の代わりにzipに入っているものを代わりに使うようにします。
rm /lib/libpthread.so.0 ln -s /mnt/sd/DCIM/122_TREK/lib/libpthread.so.0 /lib/
これをautorun.shの中で実行します。実際には、後出のautorun.shの中で/mnt/sd/DCIM/122_TREK/lib/にある別のライブラリといっしょに、ワイルドカードでいっぺんにシンボリックリンクを張ることになります。
前述のような事情のほか、Flucard Proには最初から入っているviがPQI Air Cardには入っていなかったりといった違いがあるので、それを反映して作ったautorun.shが以下です。
これをzipに入っているautorun.shの代わりに使います。つまり、microSDHCのルートディレクトリに置きます。
#!/bin/sh ln -s /mnt/sd/DCIM/122_TREK/bin/* /bin/ ln -s /mnt/sd/DCIM/122_TREK/usr/bin/* /usr/bin/ ln -s /mnt/sd/DCIM/122_TREK/usr/local /usr/local ln -s /mnt/sd/DCIM/122_TREK/usr/lib /usr/lib ln -s /mnt/sd/DCIM/122_TREK/usr/include /usr/include ln -s /mnt/sd/DCIM/122_TREK/usr/libexec /usr/libexec ln -s /mnt/sd/DCIM/122_TREK/sbin/* /sbin/ rm /lib/libpthread.so.0 ln -s /mnt/sd/DCIM/122_TREK/lib/* /lib/ ln -s /mnt/sd/DCIM/122_TREK/etc/* /etc/ ln -s /mnt/sd/DCIM/122_TREK/www/cgi-bin/connect2hotspot.cgi /www/cgi-bin/ #ln -s /mnt/sd/DCIM/122_TREK/www/* /www/ #ln -s /mnt/sd/DCIM/122_TREK/www/cgi-bin/* /www/cgi-bin/ rm /bin/vi ln -s /mnt/sd/DCIM/122_TREK/busybox /bin/vi ln -s /mnt/sd/DCIM/122_TREK/busybox /bin/top ln -s /mnt/sd/DCIM/122_TREK/busybox /bin/awk ln -s /mnt/sd/DCIM/122_TREK/busybox /bin/dd rm /usr/bin/hexdump ln -s /mnt/sd/DCIM/122_TREK/busybox /usr/bin/hexdump ln -s /mnt/sd/DCIM/122_TREK/busybox /bin/killall ln -s /mnt/sd/DCIM/122_TREK/busybox /bin/less ln -s /mnt/sd/DCIM/122_TREK/busybox /bin/passwd ln -s /mnt/sd/DCIM/122_TREK/busybox /bin/sed ln -s /mnt/sd/DCIM/122_TREK/busybox /bin/tar rm /usr/bin/telnet ln -s /mnt/sd/DCIM/122_TREK/busybox /usr/bin/telnet ln -s /mnt/sd/DCIM/122_TREK/busybox /bin/whoami # ssh # user: root password: admin #dropbear -A -N root -C admin -U 0 -G 0 # public key auth #dropbear -A -N root -C '-' -U 0 -G 0 -R /mnt/sd/DCIM/122_TREK/authorized_keys2 -s # kill telnetd #killall telnetd #ftp #killall tcpsvd #tcpsvd 0 21 ftpd -w / & # connect to Hotspots if [ -e /mnt/sd/connect2hotspot ]; then sleep 5 /usr/bin/w2 & fi
このほかにも、busyboxへのシンボリックリンクとして存在するコマンドがあっても、標準搭載のbusyboxにはそのアプレットが存在しないということがあるので、必要に応じてzip内のアプレット全部盛りのbusyboxへのシンボリックリンクに張り直してください。
rm /bin/somecommand ln -s /mnt/sd/DCIM/122_TREK/busybox /bin/somecommand
busyboxは、何というコマンドとして自分が実行されたかによって、振る舞いを変えるように出来ています。
カスタム版autorun.shの以下の部分がsshサーバにかかわる部分です。
コメントアウトしてあります。
# ssh # user: root password: admin #dropbear -A -N root -C admin -U 0 -G 0 # public key auth #dropbear -A -N root -C '-' -U 0 -G 0 -R /mnt/sd/DCIM/122_TREK/authorized_keys2 -s # kill telnetd #killall telnetd
「#dropbear -A -N root -C admin -U 0 -G 0」をコメントアウトすると、ユーザroot、パスワードadminでログインできる状態でsshサーバが起動します。
それの代わりに「#dropbear -A -N root -C ‘-‘ -U 0 -G 0 -R /mnt/sd/DCIM/122_TREK/authorized_keys2 -s」の部分をコメントアウトすると、公開鍵認証でsshサーバが起動します。公開鍵は/mnt/sd/DCIM/122_TREK/authorized_keys2に置くようにしていますので、必要があれば変更を。
「#killall telnetd」をコメントアウトすると、telnetサーバを落とします。
デフォルトでは、ftpサーバのルートディレクトリは/mnt/sdに設定されており、それより上の階層へはアクセスできなくなっています。
ルートディレクトリにアクセスできるようにするには、カスタム版autorun.shの以下の部分をコメントアウトします。
#killall tcpsvd #tcpsvd 0 21 ftpd -w / &
「起動直後からホットスポット接続する(クライアントモードで起動する)」の項で説明したのが、以下の部分に該当します。
# connect to Hotspots if [ -e /mnt/sd/connect2hotspot ]; then sleep 5 /usr/bin/w2 & fi
この例では、microSDHCカードのルートディレクトリにconnect2hotspotというファイルを置いておくと、起動直後からホットスポット接続を開始する、というようになっています。
起動直後からホットスポット接続をするかどうかをデジタルカメラ単体でコントロールできるようにするために、ホットスポット接続を司る緑色の画像、WSD00002.JPGの書き込み権限をチェックするのでもいいかと思います。
緑色の画像にデジタルカメラでロックをかけたら書き込み権限がなくなるので、PQI Air Card起動時にWSD00002.JPGの書き込み権限がなかったら(あるいはあったら)ホットスポット接続を始めてしまうようにするのです。
権限をチェックするコマンドって何でしたっけ……。
先述のとんすけ氏のページの受け売りですが、PQI Air Card用のバイナリをコンパイルするための開発環境として、Sourcery CodeBench Lite Editionが使えます。
「ARM processors>Download the GNU/Linux Release」とたどり、必要事項を記入して登録。メールで送られてくるものの中から「Download Sourcery CodeBench Lite 2011.09-70」をクリックしてダウンロード。
つまり、開発用のOSはLinuxになるわけですね。
toolchainのprefixは「arm-none-linux-gbueabi」となります。gccなら「arm-none-linux-gbueabi-gcc」。これをCCに指定し、といった感じで作業します。
リンク過程で-staticオプションを付けてスタティックリンクしないとならないかもしれません。
とんすけ氏のブログに詳しく書いてありますのでご参照を。
Flucard Proには、あの小さなSDカードの中に圧電スピーカーが内蔵されており、各種ステータス変更の通知を、音を通じてするようになっていました。
Photo: @numpad0 (License CC-BY-SA)
その名残がPQI Air Cardにも/usr/bin/buzzerというコマンドの存在としてあります。
PQI Air Cardには、圧電スピーカーは搭載されていません。
カード側からユーザーに対して物理的手段で何かを通知することができないのですが、ホットスポット接続を通じたインターネット接続を使って、ユーザーに通知する手段は残されています。
各種の処理を終わらせたときなどに、スマートフォンへのプッシュ通知を飛ばすということをやってみましょう。
iOSではProwl、AndroidではNotify My Androidを使うつもりで考えていたのですが、件のzipに入っているrubyにはopensslが含まれていなかったのでhttpsは使えませんでした。
httpsが使えないとなると一苦労なので、httpでTwitterへのポストが可能な、 @whosaysniさんのゲートウェイ、StewGateを使います。
下記のページを参考に、StewGateのtokenを取得してください。
rubyを使ってやってみましょう。
以下のスクリプトをtest.rbというファイル名でmicroSDHCのルートディレクトリに作成。スクリプトは @northeyeさんの TwiProwl をパクらせてもらいました。
STEW_GATE_TOKENを自分のStewGateのtokenに。
MENTION_TOのTwitterアカウントを自分のものに書き換えて保存。
#!/mnt/sd/DCIM/122_TREK/usr/bin/ruby # -*- coding: utf-8 -*- require 'net/http' require 'uri' # ------------------------------ # user configuration # ------------------------------ # http://stewgate.appspot.com/sg1/ STEW_GATE_TOKEN = "あなたのStewGateのtoken" MENTION_TO = "@your_twitter_account" # ------------------------------ # constants # ------------------------------ STEW_GATE_API = "http://stewgate.appspot.com/sg1/post/" # ------------------------------ # methods # ------------------------------ def generate_signature() a = ('a'..'z').to_a + ('A'..'Z').to_a + ('0'..'9').to_a return " " + ( Array.new(4) do a[rand(a.size)] end ).join end def post_escape( string ) string.gsub(/([^ a-zA-Z0-9_.-]+)/) do '%' + $1.unpack('H2' * $1.bytesize).join('%').upcase end.tr(' ', '+') end def post(msg) params = { "_t" => STEW_GATE_TOKEN, "msg" => "#{MENTION_TO} " + msg + generate_signature, } begin uri = URI::parse( STEW_GATE_API ) http = Net::HTTP.new( uri.host, uri.port ) request = Net::HTTP::Post.new( uri.request_uri ) request.content_type = "application/x-www-form-urlencoded" query = params.map do |key, val| "#{key}=#{post_escape(val.to_s)}" end res = http.request( request, query.join( '&' ) ) puts "Response: #{res.code}" rescue post("Error while Stewing: #{$!}") end end post("Hello, Twitter!")
実行してみます。
/mnt/sd/test.rb
自分に対してMentionを飛ばせたでしょうか。Twitterは同じメッセージを続けて送れないので、末尾にランダムな文字列を添付しています。
実際の運用時は、Twitter検索を汚さないよう、通知用のTwitterアカウントを取得、鍵をかけておけばいいかと思います。
iOSでは、プッシュ通知のあるTwitterクライアントを、Androidでは公式クライアントを使えばいいでしょう。
/usr/bin/w2でのホットスポット接続時に、ルータやテザリングしたスマートフォンから取得したIPアドレスを含むURLを自分宛に送るとか、何かの通知を飛ばしたいときに使いましょう。
PQI Air Cardをホットスポット接続(クライアントモードで起動)、スマートフォンのテザリング機能、ポケットルータなどを通して出先でインターネットに接続できるとなれば、やってみたいのはPQI Air Cardからの画像のアップロード。
やってみましょう。
まず問題になるのは、どの画像をアップロードするかの指定方法です。
もちろん、デジカメにPQI Air Card連携のための機能の存在を期待できません。
DPOFを使いましょう。DPOFは、Digital Print Order Formatの略。
デジカメ上で、プリントを実行したい画像を指定するためのもので、デジカメにはほぼ必ず存在する機能です。
DPOF機能のデジカメ上での操作の詳細はデジカメのマニュアルを参照してもらうとして、大概は画像のプレビューモードでメニューボタンを押すと指定ができます。
複数の画像を指定できるので、どんどんプリント指定していくと、「MISC/AUTPRINT.MRK」というファイルに、その情報が書き込まれていきます。PQI Air Cardから見た場合は「/mnt/sd/MISC/AUTPRINT.MRK」です。
AUTPRINT.MRKは以下のような構造となっています。
[HDR] GEN REV = 01.10 GEN CRT = "SIGMA" -01.00 [JOB] PRT PID = 001 PRT TYP = STD PRT QTY = 001 IMG FMT = EXIF2 -J [JOB] PRT PID = 002 PRT TYP = STD PRT QTY = 001 IMG FMT = EXIF2 -J <IMG SRC = "../DCIM/894SIGMA/SDIM1731.JPG">
これを読み込んで、印刷指定された画像をアップロード対象にします。
PQI Air Cardのホットスポット接続(クライアントモード動作)後に「/mnt/sd/MISC/MISC/AUTPRINT.MRK」の存在をチェックし、存在した場合は、そこにリストアップされている画像をアップロード。アップロード後に「/mnt/sd/MISC/MISC/AUTPRINT.MRK」を削除、とします。
ユーザーの操作としては、アップロードしたい画像をDPOFで印刷指定し、一度デジカメの電源をオフ。再度オンにするとアップロードが開始されるといったことになります。
アップロード終了のタイミングで、先述のTwitterのMentionを飛ばして状況が確認できるようにします。
アップロード途中でデジカメの電源が切れてしまう状況が想定されます。
1枚アップロードが済んだ時に「/mnt/sd/MISC/MISC/AUTPRINT.MRK」から済んだ画像の情報を削除、といった処理ならば、残された画像はリトライされることになるのでよさそうでしょうか。
AUTPRINT.MRKは、Windowsのiniファイルによく似た構造です。
rubyでiniファイルを扱えるようにする、Ruby inifileのgemをローカルインストールしてみます。
cd /mnt/sd wget http://rubygems.org/downloads/inifile-2.0.2.gem gem install inifile --local
こんなスクリプトで。
#!/mnt/sd/DCIM/122_TREK/usr/bin/ruby require 'rubygems' require 'inifile' ini = IniFile.load("/mnt/sd/MISC/AUTPRINT.MRK") p ini["JOB"] puts ini["JOB"]["<IMG SRC"]
ぬぬぬ、[JOB]の部分の名前が同じであるため、パースした内容が、最後のJOBで上書きされてしまいます。
じゃあこんなので。autupload.rbとします。
autupload.rbは、DPOFでプリント指定した画像を、rubyを使ってftpサーバにアップロードするものです。
これをmicroSDHCのルートディレクトリに保存したとします。つまり、/mnt/sd/autupload.rbです。
プリント指定した後、一度デジカメの電源を切り、再度電源を入れたらアップロード開始とするために、いくつか設定が必要です。
ホットスポット接続をするコマンド/usr/bin/w2をコピーしてきて、末尾で/mnt/sd/autupload.rbを実行するようにします。以下のような感じです。
#!/bin/sh echo "w2..." buzzer -f 1 #ifconfig mlan0 down #load wifi driver a0 a1 sleep 5 iwconfig ifconfig mlan0 192.168.1.1 netmask 255.255.255.0 up sleep 1 echo "auto connect available router" wifi_connect_router buzzer -f 5 sleep 2 udhcpc -i mlan0 -s /etc/dhcp.script buzzer -f 5 #cp /mnt/sd/iperf /bin #iperf -c 192.168.6.21 -N -w 512K -i 1 -t 300 /mnt/sd/autupload.rb
microSDHCのルートディレクトリにw2bというファイル名で保存したとします。/mnt/sd/w2bです。
autorun.shの末尾で、w2bを実行します。前述のPQI Air Card向けカスタム版autorun.shの最後がこうなります。
# connect to Hotspots if [ -e /mnt/sd/connect2hotspot ]; then sleep 5 /mnt/sd/w2b & fi
PQI Air Card起動
↓
connect2hotspotが存在する?→存在しなければ通常動作
↓
存在したら/mnt/sd/w2bが実行され、ホットスポット接続開始
↓
/mnt/sd/MISC/AUTPRINT.MRKが存在する?→存在しなければ何もしない
↓
存在したらDPOFでプリント指定された画像をftpでアップロード
↓
アップロードが終了したら/mnt/sd/MISC/AUTPRINT.MRKを削除
こんな感じの動作となります。
画像のアップロードが完了すると、Twitterでその都度Mentionが飛んできます。
どうでしたか? めちゃくちゃ夢が膨らみませんか?
ftpサーバなんかにアップロードしねーよという意見は受け入れません。
気に入らなかったら自分の好きなようにいじくればいいからです。
このほかできそうなこととしては、PQI Air Cardで集めた周囲の無線LANアクセスポイントのMACアドレスをGoogleのGeolocation APIにかけて、緯度経度を割り出し、それを画像に埋め込むということがあります。
iwlist mlan0 scanning | grep Address | sed -e 's/^.\{29\}\(.\+\)/\1/g'
本当はインターネット接続無しにローカルでMACアドレス→位置情報の変換をやりたいのですが、使えるデータベースが手に入りません。ポケットルータ、スマートフォンのテザリングに依存せず、スタンドアローンで位置情報を記録するために、画像とMACアドレスを対にしてログを取っておいて、後処理で位置情報に変換、埋め込みするというのでもいいかもしれません。
カメラ側からPQI Air Cardへのインタラクトの方法としては、DPOFの枚数指定なんかも使えそうです。枚数指定を送信先の指定や、送信した後の処理の仕方の指定に使うことができるでしょう。
ファイルの削除を監視するdaemonを常駐させ、独自に管理用画像を用意するのでもいいかもしれません。
こう考えると、工夫のしがいがあるでしょう? あつをリーダーとUSB電源を組み合わせたら、無線LANベースではありますがGPSロガーのようなものが出来てしまいます。
皆でこの素晴らしいPQI Air Cardをはやらせましょう。
オフトピックとなりますが、Androidでの自動化の事例です。
PQI Air Cardを無線LANアクセスポイントとして動作させ、そこに接続し、専用アプリを起動。やや面倒ですね。
Androidでは、PQI Air Cardへの接続の部分をTaskerを使って自動化可能ということです。
PQI Air CardをAPモード、PQI AirCard+で使う場合、Androidなら https://t.co/uRH143jX このアプリとTaskerを組み合わせ、PQI AirCard+起動時に接続先を自動で切り替えるようにすると捗るかと。
— メイラード反応 (@meyskld) October 28, 2012