Raspberry Pi で iPhone5 から繋がる無線開発環境を構築する

※本内容はCROSS2013のアンカンファレンスにて発表した内容をベースに記事化しました。</p>

SlideShare: Raspberry Pi で作る無線開発環境

昨年7月に購入した Raspberry Pi が年末になってようやく届いたので、地下鉄などの電波が届かない環境でもコーディングできる無線開発環境を構築した記録です。

どういうことか簡単に説明しますと、eneloopで給電している無線LANドングルを付けた Raspberry Pi から iPhone5 のテザリングで共有されているWiFiに自動で接続し、Prompt などのSSHクライアントから接続を行いコンソールで開発を行える環境というものです。

テザリングされた iPhone5 に別途 iPad などを接続すれば、iPad からも開発が行えますし、iPad の3G版であればもっとシンプルにできますね。

で、その環境を構築して本当に通勤中の地下鉄で開発しているかというと。。していません。。

必要なもの

  • Raspberry Pi
    • SDカード(可能であれば4GB以上)
  • 無線LANドングル(PLANEX GW-USValue-EZ)
    • 内部に RTL8188CUS を使っているようなので、Linux にWiFiサポートがインストールされていればドライバーも入っていると思います
  • eneloop QE-PL201-WなどのUSBモバイル充電器
  • iPhone5(テザリング使用、代わりにWiFiルーターでもOK)
  • PromptなどのSSHクライアント

Linuxのインストール

Raspberry Pi にはOSが用意されていませんので、まずはインストールから行う必要があります。すでに Raspberry Pi をお持ちの方はもうインストール済みですね。

わたしは Fedora 17 を入れることにしました。以下のページに従いインストールを行います。

Raspberry Pi - FedoraProject

インストールガイドにも注意書きがありますが、初回起動後の再起動で以下メッセージが表示される場合がありますが、あとで修正予定と記載がありました。

 Oh no! Something has gone wrong.

とりあえず CTRL+ALT+DELETE で強制再起動を行えば3回目の再起動後に正常に立ち上がってきます。

インストールを終えられればあとは無線LANドングルを指すだけで無線LANは使えるようになります。

無線LANの接続設定

XFCE desktop の画面右上の無線LANのマークからあらかじめ iPhone5 のテザリングへの接続を済ませておきます。 (実際には NetworkManager を使った接続ですね)

接続情報を保存しておけば、勝手にスポットをスキャンして接続してくれます。

IPアドレスをメールで送るためのスクリプトを書く

さて、とりあえずこのままでもテザリングした iPhone5 の3G/LTEの電波の無いところに持ちだしたうえで eneloop などで給電した Raspberry Pi は iPhone5 に接続しにいってくれますが、画面が無い状態ですのでIPアドレスをメールで行なうようスクリプトを書きます。 (なおメールを送る場合には当然 iPhone5 の3G/LETの電波がある状態である必要がありますね。。)

まず以下のシェルスクリプトファイルをrootにて作成します。

/etc/rc.d/rc.local (Fedora16からはrc.localが無くなりましたが適切に配置を行えば以前と同じように実行されるようです)

#!/bin/sh
/usr/sbin/ntpdate ntp1.jst.mfeed.ad.jp
/usr/local/bin/send_privateip.php &
exit 0

作成後は実行権限を付与しておきましょう。

# chmod a+x /etc/rc.d/rc.local

シェルスクリプト中の1つ目のはメールを送る前に ntpdate コマンドを使って時刻同期を行うものです。

2つ目はPHPにてメールを送るスクリプトを実行するものですが、他の言語がお好みの方は他の言語で実装いただいてもかまいません。

他の言語で実装される方は次の説明を読み飛ばしていただければと思います。

メールを送るための設定

テザリングを行なってもいわゆるOPB25などの迷惑メール対策がなされているので、Raspberry Pi 単体でメールを送ることができないので、Gmail やプロバイダのSMTPを利用してメールを送る必要があります。

私は以下のサイトを参考に Postfix をインストールし、Gmail アカウントのメールアドレスで送るよう中継設定を行いました。

Postfix から Gmail 経由でメールを送る - 冒険するコンピューティング

PHPでプライベートIPアドレスをメールで送る

Raspberry Pi の初期状態ではPHPがインストールされていませんので、以下コマンドにてインストールをしておく必要があります。

# yum install php-cli

インストールが終わったら、さきほどの /etc/rc.d/rc.local にて実行している以下のPHPをrootにて作成します。

/usr/local/bin/send_privateip.php

#!/bin/php
<?php
// ネットワークが接続される前に実行されるのを防ぐために30秒だけ待つ
sleep(30);
$result = array();

// この例では有線LAN接続時もメールを送る
foreach (array('wlan0', 'eth0') as $interface) {
    exec('ifconfig '.$interface, $result);
    $result = join("n", $result);
    if (preg_match('/^.*inets([^s]+)/m', $result, $match)) {
        // メールの送り先はスマートフォンやガラケーに設定する
        mail('foo@example.com', '', "Raspberry PI IP Addressn".$match[1], 'From: bar@example.com', '-fbar@example.com');
        break;
    }
}

作成後は実行権限を付与しておきましょう。

# chmod 755 /usr/local/bin/send_privateip.php

とりあえず実行してみます。

$ /usr/local/bin/send_privateip.php

メールが送られてくれば見事成功!再起動も行なってみてメールが送られてくるか確認しましょう。

いよいよ地下鉄で。。

  1. 地下鉄の駅に行く
  2. iPhone5 のWiFiをオンにする
  3. iPhone5 のテザリングをオンにする
  4. Raspberry Pi を eneloop に接続し給電開始
  5. iPhone5 のテザリングの接続数が増えることを確認
  6. 1分程度でメールが来る
  7. メールに記載されているプライベートIPアドレスにSSHクライアント(Promptなど)で接続
  8. 電車に乗る
  9. 途切れずにSSHで作業を継続できる

以上、いかがだったでしょうか。そもそも座席に座れれば Macbook Air などのノートマシンで作業をすることができますし、iPhone のキーボードで本格的な作業はできないと思いますのでかなり用途は限られると思いますが。。

地下鉄の満員電車で書いたソースコードの動作確認などにお役立ていただければと思います。。。

Copyright © yu-ji All Rights Reserved.