จากตอนที่แล้ว (คลิก) เราได้ทำความเข้าใจเรื่องการใช้งาน crond service ของ Linux กันไปแล้ว วันนี้ เราจะมาสร้างระบบคอยตรวจสอบ WAN IP Address ของ Router แล้วให้ส่งค่า IP Address ของ Router ที่ได้รับจาก ISP (ผู้ให้บริการอินเตอร์เนตที่เราใช้อยู่ ) หาก IP Address เกิดการเปลี่ยนแปลงเนื่องจากเหตุผลใดๆ ก็ตาม ให้ทำการส่งค่า IP Address ใหม่ ไปบอกเราทาง E-mail นะครับ
จริงๆ หลักการ ก็ไม่ได้ยากอะไร เราจะให้บอร์ด Raspberry Pi ทำการเรียกไฟล์สคริปต์ php จาก Web Server ตัวหนึ่งที่ผมได้นำไฟล์ ip.php ไปฝากไว้ ซึ่งภายในไฟล์นี้ มีเพียงคำสั่งแสดง Remote ip address ซึ่งก็คือ IP Address ของ Router นั่นเอง
<?php echo $_SERVER['REMOTE_ADDR']; ?>
เมื่อได้ค่า router IP Address มาแล้ว หาก IP Address ไม่ตรงกับที่เคยเก็บค่าไว้ ก็จะทำการส่ง E-mail ไปบอกเรา ว่า ตอนนี้ IP Address ได้มีการเปลี่ยนแปลงเกิดขึ้นแล้วนะ ซึ่งเราจะนำ IP Address ของ Router ที่ได้ ไปสร้างโปรเจคอื่นต่อไป แต่ตอนนี้ เอาเพียงเท่านี้ก่อนนะครับ เดี๋ยวจะงง
การทำงานคร่าวๆ ก็คือ ในตอนแรก Raspberry Pi เรียกดูไฟล์ ip.php ตาม URL ที่กำหนด
Raspberry Pi---> Access Point + Router--->request http://monitoring.orgfree.com/ip.php
จากนั้น web server monitoring.orgfree.com ตอบกลับ Remote IP Address ซึ่งนั่นเป็น IP Address ของ Router ที่เราได้รับจาก ISP ขณะนั้น
Raspberry Pi<--- Access Point + Router<---response Remote IP Address
จากนั้น เราก็จะนำค่า IP Address ไปเปรียบเทียบกับค่าที่เก็บไว้ใน text file ว่าค่าตรงกันหรือไม่ หากไม่ตรงกัน ก็จะทำการส่ง E-mail ไปบอกเรา ซึ่งเราจะนำโค๊ดจากก่อนหน้านี้ มาทำการปรับปรุง จะได้ว่า
#-------------------------------------------------------------------------------
# Name: router.py
# Purpose: for checking router's ip address
#
# Author: http://raspberry-pi-th.blogspot.com
#
# Created: 22/12/2012
# Copyright: (c) raspberry-pi-th.blogspot.com 2012
#-------------------------------------------------------------------------------
import smtplib
import urllib2
host = "http://monitoring.orgfree.com"
script = "ip.php"
path = "/"
file_target = '/home/pi/ip.txt'
def sendmail(ip_remote):
SMTP_SERVER = 'smtp.gmail.com'
SMTP_PORT = 587
sender = 'raspberry router ip checker'
recipient = '------------------' # email ผู้รับ
subject = 'Router IP Address notice'
body = 'Your router\'s ip address is changed to ' + ip_remote
headers = ["From: " + sender,
"Subject: " + subject,
"To: " + recipient,
"MIME-Version: 1.0",
"Content-Type: text/html"]
headers = "\r\n".join(headers)
username = ‘---------------------’ # user name gmail
password = '----------------------' # password gmail
server = smtplib.SMTP(SMTP_SERVER,SMTP_PORT)
server.ehlo()
server.starttls()
server.ehlo()
server.login(username,password)
server.sendmail(sender,recipient,headers + "\r\n\r\n" + body)
server.quit()
try:
ip_remote = urllib2.urlopen(host + path + script).read()
print "ip remote " + ip_remote
try:
f = open(file_target,'r')
read_ip = f.read()
print "readout " + read_ip
if (read_ip <> ip_remote):
f.close()
f = open(file_target,'w')
f.write(ip_remote)
sendmail(ip_remote)
print "Email was sending"
f.close()
except Exception,e:
print 'exception ' , e
f = open(file_target,'w')
f.write(ip_remote)
f.close()
sendmail(ip_remote)
print "New file was created"
except urllib2.HTTPError, e:
print host + path + script + " : " + str(e.code) + " " + str(e.msg)
#----------------- sript ending ----------------------------------
หมายเหตุ อย่าลืมใส่ username / password gmail account ของเราด้วยนะครับ
บันทึกไฟล์นี้ ชื่อ router.py ไว้ที่ /home/pi อาจจะต้องทำการเปลี่ยนโหมด หากจำเป็น ด้วยคำสั่ง chmod 774 /home/pi/router.py จากนั้น นำสคริปต์ python ของเราไปฝากไว้ใน crontab (จากตอนที่แล้วของเรา) ให้ทำการเช็คทุกๆนาที หรือจะทุกๆ 10 นาที หรือ ทุกๆ ชั่วโมง ก็แล้วแต่ ความต้องการของเรา ในทีนี้ ผมให้มันเช็ค ทุกๆ นาทีหล่ะกัน จะได้เงื่อนไขใน crontab ดังนี้
* * * * * python /home/pi/router.py
ทำการบันทึก crond service แล้วรอดูผลที่ E-mail ของเรา ซึ่งในครั้งแรก ควรจะมีการส่งเมล์มาบอกเราทันที ที่สคริปต์ทำงาน เพราะว่า ไม่เคยมีไฟล์ ip.txt (ซึ่งได้จากรันสคริปต์ router.py) ปรากฏขึ้นเลยมาก่อน ก็เข้าเงื่อนไขการส่ง E-mail
เราลองลบไฟล์ ip.txt หรือไม่ก็ลองเข้าไปแก้ไข IP Address ภายในไฟล์ ip.txt แล้วลองสังเกตการเปลี่ยนแปลง ว่ายังมีการส่ง E-mail มาที่เราหรือเปล่า ซึ่งควรจะมีการส่งมา
จากนั้น เพื่อนๆ อาจจะทำการแก้ไขเงื่อนไขใน crontab เมื่อมั่นใจแล้วว่า สคริปต์ของเราทำงานได้อย่างที่ต้องการ โดยอาจจะเปลี่ยนเป็นเช็ค ทุกๆ ห้านาที ก็ได้ เพื่อไม่เป็นการ request ไปที่ web server มากเกินไป (อาจโดนเตะออก เหมือน spam ได้ )
ตั้งค่าใน crontab ใหม่ดังนี้
0,5,10,15,20,25,30,35,40,45,50,55 * * * * python /home/pi/router.py
ก็มีเพียงแค่นี้ สำหรับบทความตอนนี้ ต่อไปเราก็จะทำการ Forward Port ที่ Router ของเราให้ส่งตรงข้อมูลไปที่บอร์ด Raspbbery Pi ของเราอีกที ซึ่งนั่นจะทำให้เรา สามารถควบคุมระยะไกล จากที่ใดๆ ก็ได้มาที่บอร์ด Raspbbery Pi โดยผ่านหมายเลข router IP Address ของเรา ที่ซึ่งแม้ IP จะถูกเปลี่ยนแปลงไป เราก็ยังสามารถติดตามได้ว่า Router IP Address ของเราตอนนี้ ได้หมายเลขอะไร ซึ่งผมจะได้แสดงให้ดูในครั้งต่อไปครับ ^_^
7 ความคิดเห็น:
เป็นไอเดียที่เจ๋งครับ ผมขอเอาไปลงที่ http://www.facebook.com/RaspberryPi66 ได้รึเปล่าครับ
ยินดีครับ อย่าลืมใส่ back link กลับมาด้วยหล่ะกัน
เพิ่มเติมให้นิดนึงคับ สำหรับท่านที่รันแล้วเกิด error ตามรายละเอียดด้านล่าง
Traceback (most recent call last):
File "/var/etc/script/ipcheck.py", line 41, in
ip_remote = urllib2.urlopen(host + path + script).read()
File "/usr/lib/python2.7/urllib2.py", line 127, in urlopen
return _opener.open(url, data, timeout)
File "/usr/lib/python2.7/urllib2.py", line 401, in open
response = self._open(req, data)
File "/usr/lib/python2.7/urllib2.py", line 419, in _open
'_open', req)
File "/usr/lib/python2.7/urllib2.py", line 379, in _call_chain
result = func(*args)
File "/usr/lib/python2.7/urllib2.py", line 1211, in http_open
return self.do_open(httplib.HTTPConnection, req)
File "/usr/lib/python2.7/urllib2.py", line 1181, in do_open
raise URLError(err)
urllib2.URLError:
ให้ท่านทำการติดตั้ง package host ก่อนด้วยคับ
apt-get install -y host
ช่วยแก้ตรง
recipient = 'wisit.paewkratok@gmail.com'
ให้เป็น
recipient = 'อีเมล์ของตัวเอง'
ด้วย
ผมอยากทราบว่าโค้ดตรง
0,5,10,15,20,25,30,35,40,45,50,55 * * * * python /home/pi/router.py
เพิ่มไปเพื่ออ่ะไรครับ
เป็นการตั้งค่า cron job ใน linux ครับ อยากทราบว่ามีความหมายว่าอะไร ศึกษาข้อมูลเพิ่มเติมจากในอินเตอร์เนตครับ เยอะมาก
เข้าใจแล้วครับ ขอบคุณมากครับ ^^
Post a Comment