勘と経験と読経

略すとKKD。ソフトウェア開発やITプロジェクトマネジメントに関するあれこれ。

Raspberry Pi+Androidでポータブル開発環境を作ってみた

f:id:kent4989:20130309215823j:plain
Raspberry Piを弄ったメモ。Raspberry Piを使うのにキーボードやモニタを持ち歩くのは面倒だし、とりあえずAndroidでリモート接続するようにしてみる。基本的には以下の記事のAndroid版である。

狙い

  • モニタやキーボードが無くてもRaspberry PiさえあればLinux環境にアクセスできるようにする
    • バッテリーを持ち歩けばどこでも(電源がなくても)でも利用可能なはず

前提

  • Raspberry Piのセットアップが済んでいること
    • この記事を書く時点では、2013-02-09-wheezy-raspbianを使用
    • SSHを利用できるように設定しておく
  • Wifiドングルなどで無線ネットワークに接続できるようにしておく
    • わたしは以下を利用

PLANEX 11n/g/b対応 150Mbpsハイパワー無線LAN USBアダプタ GW-USValue-EZ [フラストレーションフリーパッケージ(FFP)]

PLANEX 11n/g/b対応 150Mbpsハイパワー無線LAN USBアダプタ GW-USValue-EZ [フラストレーションフリーパッケージ(FFP)]

  • とりあえず作業用のネットワークに接続しておく
  • デザリングするためのAndroidなどのデバイスを準備しておく

解決方法

  • Androidのデザリングを利用してネットワークに接続する
  • デザリング接続した場合にローカルIPアドレスがわからないので、Gmail経由でIPアドレスを通知させる
  • IPアドレスを取得後は、SSHクライアントやVNCクライアントでRaspberry Piにアクセスする

詳細

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

上記の記事だとPHPなどのインストールが必要なのだけれども、今回はあらかじめ準備されているPythonのみで実現できるようにしてみた。

$ sudo nano /usr/local/bin/send_privateip.py

で以下のスクリプトを書く。

#!/usr/bin/python
# -*- coding: utf-8 -*-
import socket
import time
import smtplib
from email.MIMEText import MIMEText
from email.Header import Header
from email.Utils import formatdate

def create_message(from_addr, to_addr, subject, body):
	msg = MIMEText(body)
	msg['Subject'] = subject
	msg['From'] = from_addr
	msg['To'] = to_addr
	msg['Date'] = formatdate()
	return msg
	pass

def send_via_gmail(from_addr, to_addr, msg):
	 s = smtplib.SMTP('smtp.gmail.com', 587)
	 s.ehlo()
	 s.starttls()
	 s.ehlo()
	 s.login('自分のアカウント@gmail.com', 'ここにGMailのパスワード')
	 s.sendmail(from_addr, [to_addr], msg.as_string())
	 s.close()

if __name__ == '__main__':
	time.sleep(30)
	from_addr = '自分のアカウント@gmail.com'
	to_addr = '自分のアカウント@gmail.com'
	s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
	s.connect(("gmail.com",80))
	title = 'From RaspberryPi:' + s.getsockname()[0]
	body = 'This mail send by Python'
	msg = create_message(from_addr, to_addr, title, body)
	send_via_gmail(from_addr, to_addr, msg)
	s.close()

なお、Google二段階認証をONにしている場合は、アプリケーション固有パスワードを発行して設定する必要があるので注意。
書いたら保存して、実行権限を付与して実行してみる。

$ sudo chmod +x /usr/local/bin/send_privateip.py
$ /usr/local/bin/send_privateip.py

これでメールが届けば設定成功。

起動時にスクリプトを自動的に実行する設定を行う

次に先程作成したスクリプトが起動時に自動実行されるように設定する。具体的には、起動時に自動実行される/etc/rc.localで呼び出すように設定するだけだ。

$ sudo nano /etc/rc.local

で、Exitの前の行に以下を書き込んで保存。

/usr/local/bin/send_privateip.py

リブートした後にメールが届けば設定成功。

$ sudo reboot

Android端末でデザリング設定する

最後に、Android端末でデザリング設定すれば作業は完了である。電源を投入した後に届くIPアドレスの通知を見て、SSHVNCなどを利用すればいい。
クライアントはいまのところ下記を使用している。