600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 树莓派4B开机自启动Python程序 发送WIFI-IP至指定邮箱

树莓派4B开机自启动Python程序 发送WIFI-IP至指定邮箱

时间:2020-01-07 11:52:58

相关推荐

树莓派4B开机自启动Python程序 发送WIFI-IP至指定邮箱

树莓派4B开机自启动Python程序,发送WIFI-IP至指定邮箱

树莓派开机自启动Python并发送IP地址到指定邮箱环境用Python发送邮件获取WIFI的IP地址整合发送邮件和获取WIFI-IP的程序开机自启动

树莓派开机自启动Python并发送IP地址到指定邮箱

作为电子工程师,我之前都是使用STM32、51单片机或FPGA作为嵌入式开发控制核心,通过C语言或者VHDL进行开发。偶然一次了解到树莓派强大的功能和兼容性,可以直接用Python开发,我决定试一试这个有趣的东西。

在调试树莓派远程登录时,我发现必须要知道树莓派的IP才能连接,如果树莓派能够自己发送一个IP到邮箱岂不是妙哉?

我搜了一下,发现还有不少人和我想法一样。

话不多说,开始我们的工作:

环境

Python 3.7

用Python发送邮件

目前Python中可以采用smtplib库做这件事情。参考代码:

from time import sleepdef sentemail():host = '' # 设置发件服务器地址port = 465 # 设置发件服务器端口号。注意,这里有SSL和非SSL两种形式,现在一般是SSL方式sender = 'xxxx@' # 设置发件邮箱,一定要自己注册的邮箱pwd = 'xxxx' # 设置发件邮箱的授权码密码,根据163邮箱提示,登录第三方邮件客户端需要授权码receiver = 'xxx@' # 设置邮件接收人,可以是QQ邮箱body = '<h1>测试</h1><p>树莓派</p>' # 设置邮件正文,这里是支持HTML的msg = MIMEText(body, 'html') # 设置正文为符合邮件格式的HTML内容msg['subject'] = '发送邮件测试' # 设置邮件标题msg['from'] = sender # 设置发送人msg['to'] = receiver # 设置接收人try:s = smtplib.SMTP_SSL(host, port) # 注意!如果是使用SSL端口,这里就要改为SMTP_SSLs.login(sender, pwd) # 登陆邮箱s.sendmail(sender, receiver, msg.as_string())# 发送邮件!print ('Done.sent email success')except smtplib.SMTPException:print ('Error.sent email fail')if __name__ == '__main__':sentemail()

我是参考别人的程序写的,链接如下:raspberry PI 将Python脚本写成服务并设置开机启动

这个代码可以先测试好。接着我们准备第二步。

获取WIFI的IP地址

在Python中获取本机IP地址可以参考python 获取本机ip地址的两种实现方法

我的程序如下:

#!/usr/bin/pythonimport socketimport fcntlimport structdef get_ip_address(ifname):s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)return socket.inet_ntoa(fcntl.ioctl(s.fileno(),0x8915, # SIOCGIFADDRstruct.pack('256s', bytes(ifname[:15],'utf-8')))[20:24])ip1 = get_ip_address('wlan0')print(ip1)

将该程序命名为:get_ip.py

整合发送邮件和获取WIFI-IP的程序

将发送邮件的程序稍作修改,调用获取IP的程序。程序命名为:send_mail.py

代码见下:

import smtplibfrom email.mime.text import MIMEText # 引入smtplib和MIMETextfrom time import sleepfrom get_ip import get_ip_addressdef sentemail(text_to_send):host = '' # 设置发件服务器地址port = 465 # 设置发件服务器端口号。注意,这里有SSL和非SSL两种形式,现在一般是SSL方式sender = 'xxx@' # 设置发件邮箱,一定要自己注册的邮箱pwd = 'xxx' # 设置发件邮箱的授权码密码,根据163邮箱提示,登录第三方邮件客户端需要授权码receiver = 'xxx@' # 设置邮件接收人,可以是QQ邮箱body = '<h1>Your have sent IP successfully</h1><p>IP of Lijiwei_raspberry:</h1></p>%s</p>' %text_to_send# 设置邮件正文,这里是支持HTML的msg = MIMEText(body, 'html') # 设置正文为符合邮件格式的HTML内容msg['subject'] = '树莓派IP' # 设置邮件标题msg['from'] = sender # 设置发送人msg['to'] = receiver # 设置接收人try:s = smtplib.SMTP_SSL(host, port) # 注意!如果是使用SSL端口,这里就要改为SMTP_SSLs.login(sender, pwd) # 登陆邮箱s.sendmail(sender, receiver, msg.as_string())# 发送邮件!print ('Done.sent email success')except smtplib.SMTPException:print ('Error.sent email fail')if __name__ == '__main__':ip1 = get_ip_address('wlan0')sentemail(ip1)

开机自启动

开机自启动我摸索了两天多,网上各种办法都试了一遍,发现还是要看英文原版。

参考原版网页:Run a script on start up

注意以下几点 It must start with a shebang (#!/bin/bash) followed by a LSB header, a set of specially formatted comments that contain information about the service.

这点我不是很明确,但是根据该文件夹中bluetooth服务的写法,即“#空格!/bin/bash”;缩进规则尽量按照bluetooth中的,避免出错; 用nano编辑代码: 在编辑前,将terminal的权限设为root,即:sudo su root新建并编辑:sudo nano /etc/init.d/mailip把代码编辑好,保存并退出(ctrl+Ob保存, ctrl+X退出)

编辑时注意,要添加延迟命令,否则该服务会在boot的同时运行,则出现错误,即添加:sleep 10s

注:1s即1秒,1m即1分钟升级该服务的权限:sudo chmod +x /etc/init.d/mailip启动该服务:sudo /etc/init.d/mailip start

这时,terminal中会显示运行python程序将该程序加入到自启动中:

sudo update-rc.d /etc/init.d/mailip

注明:如果工作目录已经设置为/etc/init.d则要注意不要写绝对路径了,这样就可以:sudo update-rc.d mailip,否则会告诉你无法读出 重启树莓派,一会儿就会自动收到邮件啦

我的代码:

#! /bin/bash# /etc/init.d/mailip### BEGIN INIT INFO# Provides:ljw# Required-Start: $remote_fs $syslog# Required-Stop:$remote_fs $syslog# Default-Start:2 3 4 5# Default-Stop:0 1 6# Short-Description: Example initscript# Description: This service is a test### END INIT INFOcase $1 in start)echo "Starting mailip"sleep 10ssu pi -c "python3 /home/pi/mail_ip/send_mail.py";;stop)echo "Stopping mailip"killall mailip;;*)echo "Usage: /etc/init.d/mailip start|stop"exit 1;;esacexit 0

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。