ひとりぶろぐ

価値ある情報をユーザー視点で発信するブログ

デジカメ内部でRubyを動かす狂気!無線LAN内蔵SDカードアダプタPQI Air Cardの間違った使い方

      2016/03/24

もくじ

これまでのあらすじ

先日紹介した、microSDHCカードを無線LAN内蔵SDカードにするSDカードアダプタPQI Air Card。

PQI Air CardはmicroSDHCカードをSDカードサイズに変換するアダプタでありながら、内部に無線LANとWebサーバを搭載。それを通じて無線で画像を転送することができます。

Skitched 20121020 185956

既存の製品との最大の差別化のポイントは、ストレージ部分をmicroSDHCとして分離したことで、使用するmicroSDHCカードを自由に選べることです(※)。

DSC00649

※: microSDHCの4GB〜32GBまでという制約あり

95MB/sで現在世界最速のmicroSDHCカード、SanDiskのExtreme Proを使用した場合、既存の製品であるEye-Fi、FlashAir、Flucard Proをはるか後方に置き去るスピードが出ます。4kのシーケンシャル書き込み38.98MB/sに注目。

NewImage

これまでは無線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を採用。

NewImage

# 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]から)

PQI Air CardとTrek2000 Flucard Proの微妙なカンケイ

microSDHCスロットこそありませんが、PQI Air Card同様、autorun.shでカスタマイズできる作りになっているのがTrek2000のFlucard Proです。

Trek 2000 デジタルカメラ対応Wi-Fi機能付きSDカード 16GB Flucard16
Trek2000International
売り上げランキング: 432,269

PQI Air Card内部のスクリプトの内容を確認すると「FLU」という文字が見つかるなど、Flucard Proをベースにして作られたものだとはっきりわかります。

これに関して、Flucard Proの開発元であるTrek2000は承知のことではないようで、PQI Air CardはFlucard Proを勝手にコピーしたもののようです。

オープンソースの成果物でできたFlucard Proで、どの程度権利を主張できるものか分かりませんが、我々ユーザーも、PQI Air CardとFlucard Proとの微妙な関係性については知っておいていいかもしれません。

PQI Air Cardとの無線LAN接続

PQI Air Cardをいじくるために、PQI Air Cardに無線LANで接続します。

そうするためには、大きく二つ方法があります。

PQI Air Cardに直接接続

Skitched 20121028 034728

A. まずは通常通りPQI Air Cardを無線LANアクセスポイントとして機能させ、そこに接続しに行く方法。この場合は、PQI Air Cardでネットワークが行き止まりとなり、PQI Air Cardに接続している間は、インターネットに接続できなくなってしまいます。

無線LANルータを介して接続

Skitched 20121028 035952

B. もう一つは、無線LANルータのアクセスポイントにPQI Air Cardを接続させ、無線LANルータを経由して接続する方法。Hotspot接続機能と言っているやつですね。この場合は、PQI Air Cardに接続しながら、同時にインターネットも利用できるため、こちらの方が便利です。

このB.の方法で接続させるためには、まずPQI Air CardのWifi SetupでHotspotsの項を埋めます。自宅の無線LANルータなどのSSIDとKEYを入力。欄が三組ありますが、PQI Air Cardは、上の欄から下の欄の順に向けて、最初につながるものに接続します。例えば、自宅のルータ、ポケットルータ、テザリング機能付きスマートフォンといった感じになるでしょうか。

Skitched 20121028 040511

設定後、デジタルカメラ側で緑色の画像を削除するか、専用スマートフォンアプリの設定にある「ホットスポットに接続」ボタンを押すかでモードを切り替えます。

IMG 0422

つまり、いったんは無線LANアクセスポイントとして動かしたPQI Air Cardに接続した上で、モード切り替えをするという段取りを踏むことになるわけです。

WSD00002

接続の安定のために

PQI Air Cardと無線LANで接続。しばらく別のことをやっていて、ターミナルに戻ってみると接続が遮断されている、ということが頻繁に起きます。

おそらくは省電力機能が機能しているのだと思いますが、いじくり倒そうというのに、これでは困ります。

PQI Air Cardに接続したら、PQI Air Cardに対してpingを実行し続けると接続が安定します。

$ ping [IPアドレス]

Skitched 20121028 042418

デジタルカメラを使わない動作環境

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を試してみるといいでしょう。

DSC00994

GH-CRSDXCをUSB電源につなぎさえすれば、PQI Air Cardが動くのです。

DSC01013

メモリーカードリーダーによって、これができるものとできないものがあるということです。「CMD0,ACMD41と思われる初期化コマンドが発行されるSDカードリーダをください」とお店で頼んでも、出てくるわけもありませんから、PQI Air Cardの開発環境として買うなら、現状GH-CRSDXCしかなさそうですね。あつをさんの貴重な情報に敬意を表してGH-CRSDXCを「あつをリーダー」と呼びたいと思います。

グリーンハウス SDXC対応USB2.0カードリーダ/ライタ ホワイト GH-CRSDXC
グリーンハウス (2010-07-19)
売り上げランキング: 18,644

CRW-SD42でもいけたとのことです。

ロアス SD&マイクロSD用カードリーダー/ライター CRW-SD42
ロアス (2009-09-24)
売り上げランキング: 8037

ELECOMのMR-C21でもいけるそうです。

ELECOM 消しゴムみたいなメモリリーダライタ SD系専用 レッド MR-C21RD
エレコム (2009-10-30)
売り上げランキング: 74033

100円ショップで入手できる丸七のMR-27で動作しました。コメントで教えてもらった同じく丸七のMT-05でもいけるそうです。

コメントで教えてもらいましたが、ローソンストア100で販売されている「来邦工業」製のSDカードリーダーでもいけるそうです。

PQI Air Cardへのエントリポイントautorun.sh

Skitched 20121028 045551

autorun.shという名前のシェルスクリプトをmicroSDHCのルートディレクトリに置いておくと、それがPQI Air Cardの起動処理の最後に実行されます。

autorun.sh が実行されるのは起動処理の一番最後なので、それ以前の段階に割り込んで何かをすることはできませんが、それでもいろいろなことができます。

autorun.shを使うと、PQI Air Cardの動作をユーザー側で変更してしまうことができるのです。

NewImage

▲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への接続

PQI Air Cardにtelnet接続するのは簡単です。

telnet [IPアドレス]

これでつながります。特にユーザ名などを指定する必要はありません。

ftpの場合も同様。

ftp [IPアドレス]

Webインターフェースの方もしかりで、言ってみれば、セキュリティも糞もありませんので、無線LANの方のセキュリティには気をつけてください。

環境強化のためにvi、ruby、phpなどを導入する

PQI Air Cardにtelnetでログインして最初に面食らうのが、エディタが無いことでしょう。

当然あるものと思うviを実行しようとしても、「vi: applet not found」というメッセージをくらうはずです。

これは、PQI Air Cardに入っているbusybox(UNIXコマンドの集合体)のサイズを小さくするために、必要のないアプレットが省かれているからです。

先ほどの「ファイルを追加する」、「ファイルを置き換える」の項でやったように、microSDHCの領域を活用するならば、そんな制約を気にする必要はありませんので、いろいろなコマンドを入れていきましょう。

PQI Air Cardは、先達となるFlucard Proと酷似したプラットフォーム。

Flucard Proは少し前に一部の組み込みクラスタで流行したガジェットで、そのときの成果物を流用できます。

その中心人物になるのが、@tonsuke85氏、@osakanataro氏。彼らの成果物を活用させてもらうことにします。

とんすけ氏のdeploy_20120420.zipの導入

とんすけ氏が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です。

perl関係を消す

PQI Air Cardには標準搭載されているperlが、このzipにも入っています。

PQI Air CardはWebインターフェースの動作に内蔵のperlを使っていますので、このまま導入すると問題が生じる可能性もあります。

zipに入っているperlをとりあえず削除します。

  • 122_TREK/usr/bin/perlを削除
  • 122_TREK/usr/local/lib以下を削除

モジュールなどはzipに入っている方が充実しているかと思いますので、もしperlを重要視するならば、そこは使う人がどちらを残すか決めてください。

rubyの動作のためにlibpthread.so.0をzipのものに置き換える

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/にある別のライブラリといっしょに、ワイルドカードでいっぺんにシンボリックリンクを張ることになります。

PQI Air Card向けカスタム版autorun.sh

前述のような事情のほか、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サーバ起動

カスタム版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サーバを落とします。

カスタム版autorun.sh補足説明: ftpサーバのルートディレクトリ変更

デフォルトでは、ftpサーバのルートディレクトリは/mnt/sdに設定されており、それより上の階層へはアクセスできなくなっています。

ルートディレクトリにアクセスできるようにするには、カスタム版autorun.shの以下の部分をコメントアウトします。

#killall tcpsvd
#tcpsvd 0 21 ftpd -w / &

カスタム版autorun.sh補足説明: ホットスポット接続(クライアントモード動作)

「起動直後からホットスポット接続する(クライアントモードで起動する)」の項で説明したのが、以下の部分に該当します。

# 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用に使えるtoolchain

先述のとんすけ氏のページの受け売りですが、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カードの中に圧電スピーカーが内蔵されており、各種ステータス変更の通知を、音を通じてするようになっていました。

NewImage

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は使えませんでした。

Twitterを使ってPQI Air CardからiOS機にプッシュ通知を飛ばす

httpsが使えないとなると一苦労なので、httpでTwitterへのポストが可能な、 @whosaysniさんのゲートウェイ、StewGateを使います。

下記のページを参考に、StewGateのtokenを取得してください。

rubyを使ってやってみましょう。

Skitched 20121102 024908

以下のスクリプトを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からの画像のアップロード。

やってみましょう。

まず問題になるのは、どの画像をアップロードするかの指定方法です。

もちろん、デジカメにPQI Air Card連携のための機能の存在を期待できません。

DPOFを使いましょう。DPOFは、Digital Print Order Formatの略。

デジカメ上で、プリントを実行したい画像を指定するためのもので、デジカメにはほぼ必ず存在する機能です。

IMG 0524

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解説

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

Skitched 20121102 024632

PQI Air Card起動

connect2hotspotが存在する?→存在しなければ通常動作

存在したら/mnt/sd/w2bが実行され、ホットスポット接続開始

/mnt/sd/MISC/AUTPRINT.MRKが存在する?→存在しなければ何もしない

存在したらDPOFでプリント指定された画像をftpでアップロード

アップロードが終了したら/mnt/sd/MISC/AUTPRINT.MRKを削除

こんな感じの動作となります。

画像のアップロードが完了すると、Twitterでその都度Mentionが飛んできます。

Skitched 20121102 024457

素晴らしく楽しいPQI Air Card

どうでしたか? めちゃくちゃ夢が膨らみませんか?

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用アプリTaskerを使ったPQI Air Cardへの接続の自動化

オフトピックとなりますが、Androidでの自動化の事例です。

PQI Air Cardを無線LANアクセスポイントとして動作させ、そこに接続し、専用アプリを起動。やや面倒ですね。

Androidでは、PQI Air Cardへの接続の部分をTaskerを使って自動化可能ということです。

Tasker
開発元:Crafty Apps EU
価格:¥399
平均評価:4.6(合計37,336件)
ダウンロード:50万回以上
(2015年12月20日時点)
SSID指定の無線LAN(wifi)接続ショートカット作成
開発元:watarusoft
価格:¥100
平均評価:4.3(合計21件)
ダウンロード:500回以上
(2015年12月20日時点)

神製品PQI Air Card

PQI Air Cardの開発環境に「あつをリーダー」

グリーンハウス SDXC対応USB2.0カードリーダ/ライタ ホワイト GH-CRSDXC
グリーンハウス (2010-07-19)
売り上げランキング: 18,644

現在世界最速のmicroSDHCで、最速の無線LAN内蔵SDカードを作ろう

そこそこ速いmicroSDHC

PQI Air CardとClass10のmicroSDHCのセット

 - Android, iPad, iPhone, Linux, Ruby, ガジェット, デジタルカメラ