IPアドレスの通知

Raspberry Piは名刺サイズの小型コンピュータだが、実際に使おうと思うと電源用USBケーブル、キーボード/マウスケーブル、HDMIケーブル、ネットワークケーブル等が四方にぶら下がることになって、あまりシンプルでは無くなってしまう。

小型のWiFiアダプタをRaspberry PiのUSBコネクタに挿し、SSHやVNCを使ってリモートで使用すれば、接続するのは電源用USBケーブル一本で済むので非常にシンプル。タコ足配線にならずに済む。リモートデスクトップは遅いのでゲーム等には厳しいが、GPIOで何か制御するという目的ならなんとかなる。

そうやって使う場合、Raspberry Piのネットワークアドレスは固定IPにしておかないと困ったことになるのだが、環境によっては固定IPが使えず、DHCPからのIP割当しか使えない場合がある。自分の場合はRaspberry Piを持ち歩き、自宅と会社の両方で使うので固定IPにできない。

モニタが接続されていないRaspberry Piをリモートで使おうと思っても、IPが不明ではどうしようもない。DHCPサーバの割当を確認するか、あるいはIPをスキャンする方法もあるが、標準ではRaspberry PiにNetBIOS名が割り振られていないため、それもちょっと不便。

Linuxサーバでは起動時に管理者宛にメールを送ってステータスを通知したりする事は良くあって、Raspberry Piでも同じように自分のIPアドレスをメールで通知すれば良いのでは?と思ったのだが、その場合はRaspberry Piにメールサーバをインストールする必要がある。

それだけの目的でメールサーバをインストールするのは嫌なので、ここはRaspberry PiらしくPythonスクリプトでなんとかしてみた。以下のスクリプトを適当な名前(MyIP.pyとした)で保存する。保存先は何処でも良いが、とりあえず /home/pi/PythonProjects にしておく。

# -*- coding: utf-8 -*-
import smtplib
from email.MIMEText import MIMEText
from email.Utils import formatdate
import commands

from_addr = 'username@gmail.com'
to_addr = 'username@gmail.com'
login_user = 'username@gmail.com'
login_pass = 'password'
msg = commands.getoutput('ifconfig')
mail = MIMEText(msg)
mail['Subject'] = 'Raspberry Pi Notification'
mail['From'] = from_addr
mail['To'] = to_addr
mail['Date'] = formatdate()
send = smtplib.SMTP('smtp.gmail.com', 587)
send.ehlo()
send.starttls()
send.ehlo()
send.login(login_user, login_pass)
send.sendmail(from_addr, [to_addr], mail.as_string())
send.close()

もちろんGMailのユーザ名とパスワード、送信先メールアドレスは適切な内容に変更する。スクリプト中にパスワードを直接記述するのは危険なので、Python的にはPitモジュールを使ってパスワード管理するのが良いらしい。このへんは後で調べる。

このスクリプトを実行するとifconfigの実行結果がGMailで送信される。シェルで実行して問題がなければ /etc/rc.local に追加して起動時に自動実行させれば良い。

pi@raspberrypi ~ $ sudo nano /etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
printf "My IP address is %s\n" "$_IP"
fi

python /home/pi/PythonProjects/MyIP.py

exit 0

Raspberry Piを再起動して、メールが送られてくればOK。

同じ方法でGPIOポートに接続したセンサー類の情報をGMailで送信する事も可能なので、色々と応用できそうだ。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中