大多数树莓派用户都是使用SSH或者VNC的方式来管理自己的树莓派,这样的方式比较快速便捷。但是当树莓派重启的时 候,如果树莓派的IP地址发生变更,那么大部分情况下需要用户手动接上显示器或者使用网络嗅探工具来得到树莓派的IP地址。
有没有什么方法可以让树莓派“说”出自己的IP地址呢?这里为大家介绍一种使用Python编程并让树莓派自动发送IP地址到指定邮箱的方法。
准备:
-
支持SMITP/IMAP的邮箱(本文以QQ邮箱为例)
-
树莓派安装Python3环境
-
XShell和XFTP工具
1.邮箱设置
首先进入QQ邮箱->设置->帐户选项,开启如下设置以便支持发信服务。
生效后点击生成授权码选项:
验证身份后可以得到一串字符,暂时保存。
2.编写Python发信脚本
首先导入必备的模块:
# -*- coding: utf-8 -*-
import socket
import smtplib
import os
from email.mime.text import MIMEText
from datetime import datetime
from urllib.request import urlopen
编写获取内网IP的方法:
def get_host_ip():
try:
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.connect(('8.8.8.8',80))
ip=s.getsockname()[0]
finally:
s.close()
return ip
编写获取公网IP的方法:
def get_public_ip():
# 从该网站读取请求的IP地址
return urlopen('http://ip.42.pl/raw').read()
编写发信模块:
def send_email():
mail= MIMEText('时间:%s\n内网IP地址:' % datetime.now() + get_host_ip() + '\n公网IP地址:%s' % get_public_ip())
# 设置邮件主题
mail["Subject"] = "树莓派定时任务-IP地址"
# 寄件者
mail["From"] = 'RaspberryPi'
# 收件者
mail["To"] = 'BestVincent'
# 邮箱账号
from_addr = "[email protected]"
# 刚才复制的密钥字符串
password = "xxxxxxx"
# smtp服务器地址
smtp_server = 'smtp.qq.com'
# 收件人地址
to_addr = "[email protected]"
try:
# smtp协议的默认端口是25,QQ邮箱smtp服务器端口是465
# 参数分别是:smtp服务器地址、端口、超时设置
server = smtplib.SMTP_SSL(smtp_server, 465, timeout = 20)
# 登录邮箱
server.login(from_addr, password)
# 设置发件邮箱、收件地址和内容
server.sendmail(from_addr, [to_addr], mail.as_string())
server.quit()
print('Mail Success!')
except Exception as e:
print('Mail Faild:%s'% e)
主函数:
if __name__ == '__main__':
send_email()
3.使用Xshell远程登陆树莓派上传并运行脚本:
登陆Xshell后,打开XFTP上传脚本
运行脚本:
Python3 get_ip.py
运行成功以后,收到来自树莓派发送的邮件
4.设置开机自动运行
由于需要每次开机时运行整个Python脚本,所以要编辑一下系统开机的Shell命令。
vim /etc/rc/local
在exit 0之前加入如图代码,sleep 30 指等待30s,因为树莓派需要先连接网络后才能发邮件。第二行的内容的第一部分是python解释器的位置,第二个是脚本放置的文件目录。编辑完保存退出,每次重启后都会发现IP地址自动发送到我们设定的邮箱中了!
注:本文中涉及的工具均可在本公众号内找到,部分参考内容源于网络。