树莓派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 sleep

def sentemail():
    host = 'smtp.163.com'  
    # 设置发件服务器地址
    port = 465  
    # 设置发件服务器端口号。注意,这里有SSL和非SSL两种形式,现在一般是SSL方式
    sender = '[email protected]'  
    # 设置发件邮箱,一定要自己注册的邮箱
    pwd = 'xxxx'  
    # 设置发件邮箱的授权码密码,根据163邮箱提示,登录第三方邮件客户端需要授权码
    receiver = '[email protected]' 
    # 设置邮件接收人,可以是QQ邮箱
    body = '

测试

树莓派

' # 设置邮件正文,这里是支持HTML的 msg = MIMEText(body, 'html') # 设置正文为符合邮件格式的HTML内容 msg['subject'] = '发送邮件测试' # 设置邮件标题 msg['from'] = sender # 设置发送人 msg['to'] = receiver # 设置接收人 try: s = smtplib.SMTP_SSL(host, port) # 注意!如果是使用SSL端口,这里就要改为SMTP_SSL s.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/python
 
import socket
import fcntl
import struct

def get_ip_address(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    return socket.inet_ntoa(fcntl.ioctl(
            s.fileno(),
            0x8915,  # SIOCGIFADDR
            struct.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 smtplib
from email.mime.text import MIMEText  
# 引入smtplib和MIMEText
from time import sleep
from get_ip import get_ip_address

def sentemail(text_to_send):
    host = 'smtp.163.com'  
    # 设置发件服务器地址
    port = 465  
    # 设置发件服务器端口号。注意,这里有SSL和非SSL两种形式,现在一般是SSL方式
    sender = '[email protected]'  
    # 设置发件邮箱,一定要自己注册的邮箱
    pwd = 'xxx'  
    # 设置发件邮箱的授权码密码,根据163邮箱提示,登录第三方邮件客户端需要授权码
    receiver = '[email protected]' 
    # 设置邮件接收人,可以是QQ邮箱
    body = '

Your have sent IP successfully

IP of Lijiwei_raspberry:

%s

' %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_SSL s.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

  1. 注意以下几点
  • 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中的,避免出错;
  1. 用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,否则会告诉你无法读出
  1. 重启树莓派,一会儿就会自动收到邮件啦
    我的代码:
#! /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 INFO


case $1 in 
  start)
	echo "Starting mailip"
	sleep 10s
	su 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
	;;
esac

exit 0

你可能感兴趣的:(树莓派)