一眼レフで撮った写真をGoogle Photosに自動アップロード その1 PQI AirCardの固定IP化

私は10年前に購入したCanon EOS 40Dを今も現役で使い続けています。

f:id:naoyukinagano:20171031211751j:plain

 

しかし、このEOS 40Dは、当然Wi-Fiには対応しておらず、さらに記録媒体はコンパクトフラッシュという有様。

Wi-Fiに公式対応するためには、WFT-E3が必要になりますが、これがお高い!

 

スタパ齋藤の「週刊スタパトロニクスmobile」 サクッと無線接続!!EOS 40D用ワイヤレストランスミッター「WFT-E3」

 

で、かなり前からPQI AirCardにmicroSDを入れ、SDカードーコンパクトフラッシュアダプターというものを噛まして使っていました。

f:id:naoyukinagano:20171031211815j:plain

 

室内では家庭内LANのWiFiに、屋外では主にiPadテザリングを掛け、ShutterSnitchというアプリでJPEGだけ吸い出して大画面プレビューとしていました。

これはこれで便利でしたが、この変換、書き込みが遅いため、連射を多用する野鳥撮影には向いていなかったため、最近は通常のコンパクトフラッシュに戻し、どうしてもiPadに吸い出す場合はLightning USBカメラアダプタ+モバイルバッテリー、そしてコンパクトフラッシュリーダーライターを使って読み出していました。

ちなみに、iPad Pro 9.7 32GB + Lightning USB 3カメラアダプタ + エレコムMRS-MB07 + ANKER PowerCore Speed 10000 QC で稼働しております。 モバイルバッテリが5V 2.4Aを給電できないと、iPadはリーダーライタを認識できません。これはリーダーライタのせいではありません。

 

 

 

 

 

 

さて、話がそれましたが、そうなるとPQI AirCardが外出先では使われなくなります。

そこで、家庭内利用かつイエネコ撮影用に限定し、撮影されたそばからGoogle Photosにアップロードし、Google Photosではアルバム単位や一枚ごとに共有できるようにしました。

Googleドライブにアップロードして、Photosと共有するパターンはよく見かけますが、2048px以内なら容量にカウントされないPhotosに直接アップロードします。

 

前提として、私はプログラムが書けないサーバー管理者ですので、Linuxサーバー上で様々なソフトウェアをシェルスクリプトで組み合わせるという方法で達成します。

 

まずは、PQI AirCardのIPアドレスを固定化します。

PQI AirCaedに挿入するmicroSDカード直下にautorun.shというファイルを置くと、AirCardの起動時に自動実行してくれるのですが、これを利用して、宅内のWi-FiWi-Fi子機として接続しつつ、IPアドレスを固定化します。

参考にしたのはこのサイトです。

oichinote.com

Perlを書けるのがうらやましい・・・。

リンク先のパターンでは、PQI AirCard内のLinuxコマンド、/usr/bin/w2でWiFi接続とDHCPによるIPアドレス取得までやってしまい、DHCPで取得したIPアドレスの第4ブロックだけを91に書き換えるという動作を行っています。

私の家ではクラスCプライベートアドレスの192.168.0.0/24の中からDHCPを割り当てます。なので、192.168.0.91となります。

しかし、これをそのまま使おうとしたのですが、私のAirCardは最後にWebサーバー上のCGIに自身のIPアドレスをPOSTし、メールでスマホに報告させるスクリプトがautorun.shの最後に記述されています。

これが動かないのです。

しかし、192.168.0.91にpingもhttpもftpも通る。なぜ?

突き当たったのは、/usr/bin/w2だとデフォルトゲートウェイDHCPで設定されるのですが、その後にifconfigを実行すると、デフォルトゲートウェイが消去されることがわかりました。

PQI SAirCardにはrouteコマンドも用意されているので、route add default gw 192.168.0.xxxで設定されますが、なんせプログラムが書けないので、ifconfigする前にゲートウェイIPアドレスを取得して変数に代入するやり方がわからないのです。

だれか教えてプリーズ!

で、苦肉の策、デフォルトゲートウェイIPアドレスの最終ブロックが1であると決め打ちしてroute add default gwコマンド実行させます。

 

こんな感じになりました。私の場合は91から160に変更しています。

 #!/bin/sh
sleep 5
/usr/bin/w2

# sleep disable
kcard_cmd -s 0

sleep 1

script=`cat <<'EOF'
my $ifname;
my @ipadr;
my $pqi='160';

open (my $fh, '-|', qw/ifconfig/) or die $!;
while (my $line = <$fh>) {
$ifname = $1 if ($line =~ /^(\w+)/);
@ipadr = ($1, $2, $3, $4) if ($line =~ /inet\s+.*?(\d+)\.(\d+)\.(\d+)\.(\d+)/);
if ($ifname and @ipadr and ($ipadr[0] == 192) and ($ipadr[1] == 168)) {
system "ifconfig $ifname $ipadr[0].$ipadr[1].$ipadr[2].$pqi";
system "route add default gw $ipadr[0].$ipadr[1].$ipadr[2].1";
last;
}
}
close ($fh);

EOF
`

perl -e "$script"

 

この後、ifconfigの内容をWebサーバーのCGIにPOSTするスクリプトが続いています。

これはPQI AirCardをいじり倒しているひとりブログさんが、ツイッターにメンションしているものを、メールで飛ばすように変えたものです。

hitoriblog.com

autorun.shの最後のほうに次のように記述しました。

sleep 1


ip=`ifconfig mlan0 | grep inet`

wget -O - --post-data="${ip}" http://foo/bar/mail.cgi

 

CGIはPOSTされたIPアドレスをメールで報告するだけです。

サーバーに設置してあるmail.cgiはこんな感じ。どこから持ってきたのかしら?

#!/usr/bin/env perl

use URI::Escape;
read (STDIN, $inputescaped, $ENV{'CONTENT_LENGTH'});
$input = uri_unescape($inputescaped);

$sendmail = '/usr/sbin/sendmail'; # sendmailコマンドパス
$from = 'foo@bar.com'; # 送信元メールアドレス
$to = '1hoge@docomo.ne.jp'; # あて先メールアドレス
#$cc = 'hage@example.com'; # Ccのあて先メールアドレス
$subject = 'PQIAirCard'; # メールの件名
#$msg = 'body'; # メールの本文(ヒアドキュメントで変数に代入)

# robot対策

if ($input =~ m/inet/ ) {

$input =~ s/ //g; # 空白2文字分を削除

# sendmail コマンド起動
open(SDML,"| $sendmail -t -i") || die 'sendmail error';

# メールヘッダ出力
print SDML "From: $from\n";
print SDML "To: $to\n";
#print SDML "Cc: $cc\n";
print SDML "Subject: $subject\n";
print SDML "Content-Transfer-Encoding: 7bit\n";
print SDML "Content-Type: text/plain;\n\n";

# メール本文出力
print SDML "$input";

# sendmail コマンド閉じる
close(SDML);
}

print "OK";
exit; 

 

これで、カメラの電源投入後にスマホにメールが届けば成功です。