本帖最后由 土豆变薯条 于 2013-12-11 10:32 编辑
本帖子将带你在 pcDuino 上逐步实现邮件的收发( python 语言),并且利用邮件来控制 GPIO 。这样你有了 pcDuino 就可以通过邮件的方式来远程控制你的家里的一些电器的开关,自己就可以轻松实现智能家居。本帖子分三节来带你一步步实现 GPIO 控制:第一节:发送邮件;第二节:接收邮件;第三节:邮件控制 GPIO ,并回复邮件,下面就来看看具体的代码实现。
一:发送邮件
python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议族,它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器,就可以把E-mail寄到收信人的服务器上了,整个过程只要几分钟。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件。
SMTP类构造函数,表示与SMTP服务器之间的连接,通过这个连接可以向smtp服务器发送指令,执行相关操作(如:登陆、发送邮件),所有参数都是可选的。
* host:smtp服务器主机名
* port:smtp服务的端口,默认是25;如果在创建SMTP对象的时候提供了这两个参数(host、port),在初始化的时候会自动调用connect方法去连接服务器。
下面介绍下smtplib.SMTP提供的一些类:
* SMTP.set_debuglevel(level):设置是否为调试模式。默认为False,即非调试模式,表示不输出任何调试信息。
* SMTP.connect(]):连接到指定的smtp服务器。参数分别表示smpt主机和端口。注意: 也可以在host参数中指定端口号(如:smpt.yeah.net:25),这样就没必要给出port参数。
* SMTP.docmd(cmd):向smtp服务器发送指令。可选参数argstring表示指令的参数。
* SMTP.helo() :使用“helo”指令向服务器确认身份。相当于告诉smtp服务器“我是谁”。
* SMTP.has_extn(name):判断指定名称在服务器邮件列表中是否存在。出于安全考虑,smtp服务器往往屏蔽了该令。
* SMTP.verify(address) :判断指定邮件地址是否在服务器中存在。出于安全考虑,smtp服务器往往屏蔽了该指令。
* SMTP.login(user, password) :登陆到smtp服务器。现在几乎所有的smtp服务器,都必须在验证用户信息合法之后才允许发送邮件。
* SMTP.sendmail(from_addr, to_addrs, msg) :发送邮件。这里要注意一下第三个参数,msg是字符串,表示件。我们知道邮件一般由标题,发信人,收件人,邮件内容,附件等构成,发送邮件的时候,要注意msg的格式。这个格式是smtp协议中定义的格式。
* SMTP.quit() :断开与smtp服务器的连接。
发送邮件的过程一般是:
1. 连接stmp服务器
2. 发送用户名和密码进行验证
3. 编写邮件信息
4. 发送邮件
5.退出
示例代码:
import smtplib
from email.mime.text import MIMEText
mail_to=”xxxxxx”
#接收邮件的地址
def send_mail(to_list,sub,content):
#to_list 收件人地址
#sub 邮件主题
#content 邮件内容
mail_host = ”smtp.qq.com”
#qq邮箱stmp服务器地址为smtp.qq.com
#如果你使用的是其他邮箱,则可以查询一下具体的 stmp服务器地址
mail_user=”xxxxx”
#输入你邮箱的用户名
mail_pass=”xxxxx”
#输入你邮箱的密码
mail_postfix=”xxx.com”
#输入你邮箱的后缀,这里使用的qq邮箱,则为qq.com,如果使用的是网易163邮箱,则为:163.com
me=mail_user+”<”+mail_user+”@”+mail_postfix+”>”
msg = MIMEText(content)
msg['Subject'] = sub
msg['From'] = me
msg['To'] = to_list
try:
s = smtplib.SMTP()
s.connect(mail_host)
s.login(mail_user,mail_pass)
s.sendmail(me, to_list, msg.as_string())
s.close()
return True
except Exception, e:
print str(e)
return False
if __name__ == ’__main__’:
if send_mail(mail_to,”From pcDuino”,”Hello World !”):
print ”send mail successful !”
else:
print ”send mail failed !”
在pcDuino上测试运行(pcDuino必须要连接上网络):
将上面测试代码保存为 “sendEmail.py”文件、运行代码,我们可以看到邮件已发送成功:
打开目的邮箱(mail_to),我们可以看到从pcDuino发送的邮件了:
二:接受邮件
python的poplib模块是用来从pop3收取邮件的,也可以说它是处理邮件的第一步。POP3(Post Office Protocol 3)即邮局协议的第3个版本,它是规定个人计算机如何连接到互联网上的邮件服务器进行收发邮件的协议。它是因特网电子邮件的第一个离线协议标准,POP3协议允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时根据客户端的操作删除或保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。
下面介绍下poplib提供的一些类:
* poplib.POP3(server) 连接到邮箱服务器
* poplib.user(username)将用户名发送至服务器,等候服务器的正在等候用户密码的返回信息
* poplib.pass_(password)将密码发送至服务器,进行登录。如果登录失败,会引发异常。
* poplib.stat() 返回长度为2的元组:分别表示邮箱中邮件的数量、邮件消息的总大小(字节数)。
* poplib.list() 返回长度为3的元组,分别表示服务器的返回信息、消息列表、返回信息的大小。
* poplib.retr(messagenumber)返回长度为3的元组,分别表示服务器的返回信息、指定标号邮件的所有行、邮件消息的大小(字节数)。
* poplib.quit() 结束连接并退出。
收取邮件的过程一般是:
1. 连接pop3服务器
2. 发送用户名和密码进行验证
3. 获取邮箱中信件信息
4. 收取邮件
5. 退出
示例代码:
import poplib
from email import parser
host = ’pop.xx.com’
username = ’xxxxxxx@xx.com’
password = ’xxxxx’
pop_conn = poplib.POP3_SSL(host)
pop_conn.user(username)
pop_conn.pass_(password)
#Get messages from server:
Messages = [pop_conn.retr(i) for i in range(1,len(pop_conn.list()[1]) + 1)]
# Concat message pieces:
messages = ["\n".join(mssg[1]) for mssg in messages]
#Parse message intom an email object:
messages = [parser.Parser().parsestr(mssg) for mssg in messages]
for message in messages:
print message['From']
print message['To']
print message['Subject']
pop_conn.quit()
在pcDuino上测试运行:
将上面测试代码保存为 “readEmail.py”文件、运行代码,
我们可以看到读取邮件的发件人、收件人以及主题:
三:邮件控制GPIO,并回复邮件
我们前面已经实现了邮件的收发,现在我们来利用邮件来控制GPIO。首先我们在pcDuino上安装pcduino-python,如果你的板子上面没有安装 git-core 就会提示你git 命令找不到,我们先安装 git-core ,再来安装pcduino-python。
提示错误:
安装 git-core :
安装pcduino-python测试库 :
在ubuntu目录下查看 ‘pcduino-python’:
现在前提工作已完成,接下来利用邮件控制GPIO,具体实现的功能是:在pcDuino的某个GPIO接上一个LED,发送一封邮件到pcDuino,pcDuino改变LED当前的状态,并且回复一封邮件给发件人,告诉发件人LED当前的亮灭状态。
代码实现步骤:
(1)初始化GPIO,设置LED初始状态为灭;
(2)设置pcDuino上的服务邮箱的登录信息
(3)登录设置的邮箱,查看是否有新的邮件:
a) 有:改变当前LED亮灭状态,回复发送者当前的LED状态
b) 没有:LED保持当前状态不变
新建python测试代码:
(1)进入pcduino-python/Samples 目录:
(2)复制 “blink_led”到当前目录,命名为”email_test”:
(3)进入email_test文件夹,删除blink_led.py 文件
将下面测试代码保存为 “email_test.py”:
import gpio
import sys
import smtplib
from email.mime.text import MIMEText
import poplib
from email import parser
import time
led_pin = ”gpio8″
mail_to=” ”
host = ’pop.qq.com’
username = ’xxxxx@qq.com’
password = ’xxxx’
pop_conn = poplib.POP3_SSL(host)
pop_conn.user(username)
pop_conn.pass_(password)
def delayMicroseconds(us):
time.sleep(1.0*us/1000/1000)
def delay(ms):
time.sleep(1.0*ms/1000)
def send_mail(to_list,sub,content):
mail_host=”smtp.qq.com”
mail_user=”xxxx”
mail_pass=”xxxx
mail_postfix=”qq.com”
me=mail_user+”<”+mail_user+”@”+mail_postfix+”>”
msg = MIMEText(content)
msg['Subject'] = sub
msg['From'] = me
msg['To'] = to_list
try:
s = smtplib.SMTP()
s.connect(mail_host)
s.login(mail_user,mail_pass)
s.sendmail(me, to_list, msg.as_string())
s.close()
return True
except Exception, e:
print str(e)
return False
def ReadEmail():
pop_conn = poplib.POP3_SSL(host)
pop_conn.user(username)
pop_conn.pass_(password)
#Get messages from server:
messages = [pop_conn.retr(i) for i in range(1, len(pop_conn.list()[1]) + 1)]
#Concat message pieces:
messages = ["\n".join(mssg[1]) for mssg in messages]
#Parse message intom an email object:
messages = [parser.Parser().parsestr(mssg) for mssg in messages]
message = parser.Parser().parsestr(mssg)
#print message['From']
return message['From']
pop_conn.quit()
def Email_checker():
pop_conn = poplib.POP3(host)
pop_conn.user(username)
pop_conn.pass_(password)
ret = pop_conn.stat()
return ret[0]
def setup():
gpio.pinMode(led_pin, gpio.OUTPUT)
gpio.digitalWrite(led_pin, gpio.LOW)
def loop():
new_num = Email_checker()
old_num = new_num
print ’initialization is successful !’
while True:
new_num = Email_checker()
if new_num!=old_num:
if new_num%2== 1:
gpio.digitalWrite(led_pin, gpio.HIGH)
mail_to = ReadEmail()
if send_mail(mail_to,”LED Status”,”The LED status is HIGH !”):
print ”Replay mail successful !”
else:
print ”Replay mail failed !”
else :
gpio.digitalWrite(led_pin, gpio.LOW)
mail_to = ReadEmail()
if send_mail(mail_to,”LED Status”,”The LED status is LOW !”):
print ”Replay mail successful !”
else:
print ”Replay mail failed !”
old_num = new_num
delay(1000);
setup()
while True :
loop()
在pcDuino - D8上接一个LED,运行email_test.py
没有发邮件前,LED处于熄灭状态:
进入另外一个邮箱,给pcDuino上的服务邮箱发送邮件:
此时我们可以看见LED已经点亮,pcDuino已回复邮件给发送者,说明当前LED的状态、并且终端显示回复邮件成功:
接着再发送一封邮件到pcDuino,可以看见LED熄灭,pcDuino已回复邮件给发送者,说明当前LED的状态、并且终端显示回复邮件成功:
帖子出自:http://cnlearn.linksprite.com/?p=1287
|