GPS-отчет / оповещение по почте / SMTP - PullRequest
0 голосов
/ 25 января 2019

просто для того, чтобы поделиться небольшим кодом python3 для малины, который я использую для управления своей лодкой, когда я оставляю ее на якоре: она считывает данные с usb gps на малине и отправляет отчеты по почте / smtp: каждые мм минуты (1 <мм<= 60), а в случае скорости> 0 или изменения положения.(для подключения к интернету я использую 4G airbox, подключенный к Raspberry через Wi-Fi)

Вот мой код, я изучаю Python, поэтому, пожалуйста, не стесняйтесь комментировать и исправлять :)

Одна вещьМне не нравится разрешать почту через smtp, в моей учетной записи Google мне пришлось «разрешить не защищать приложения» по параметрам безопасности. Есть ли способ остаться с нормальными параметрами безопасности?

import gps
import time
import sys, os
import smtplib
# https://learn.adafruit.com/adafruit-ultimate-gps-on-the-raspberry-pi/using-your-gps 
# Listen on port 2947 (gpsd) of localhost
session = gps.gps("localhost", "2947")
session.stream(gps.WATCH_ENABLE | gps.WATCH_NEWSTYLE)
msg = "0"
subject = "gps"
lat = -0.000001
lon = -0.000001
speed = 0.001
time0 = ""
minutes = "00"
secondes = "00"
# delai envoi mails en min (<=60)
delai = 60
# tolérance vitesse max
maxspeed = 0.2
# tolérance variation latitude et longitudes alerte position (max entre 2 positions successives ou entre position courante et initiale)
ecartlat = 0.000005
ecartlon = 0.000005
# pour éviter de trop d'alertes en cas de dérive permanente, la tolérance sur les écarts à la position initiale sera augmentée toutes les 3 alertes
ecartinitlat = ecartlat
ecartinitlon = ecartlon
# position initiale ( moyenne sur 120  mesures  ~ 2 minutes)
averagelat = 0.0
somlat = 0.0
averagelon = 0.0
somlon = 0.0
# nombre lectures
n = 0
nalertinitlat = 0
nalertinitlon = 0
nalertspeed = 0
while True:
    try:
        report = session.next()
        # Wait for a 'TPV' report and display the current time
        # To see all report data, uncomment the line below
        # print(report)
        if report['class'] == 'TPV':
            if hasattr(report, 'time') and hasattr(report, 'speed') and hasattr(report, 'lat') and hasattr(report, 'lon'):
                n += 1
                subject = "gps"
                time0 = report.time
                minutes = time0[14:16]
                secondes = time0[17:19]
                speed = report.speed
                if n < 120:
                    somlat += report.lat
                    averagelat = somlat/n
                    if abs(averagelat-report.lat) > ecartlat:
                        print("ecart lat: ", averagelat - report.lat) 
                    somlon += report.lon
                    averagelon = somlon/n
                    if abs(averagelon-report.lon) > ecartlon:
                        print("ecart lon: ", averagelon - report.lon)
                elif n == 120:
                    averagelat = round(averagelat,6)
                    averagelon = round(averagelon,6)
                    print("lat initial: ", averagelat, "\r\nlon initial: ", averagelon)
                # try sending the email alert si vitesse>0 ou changement position>ecart ou toutes les "delai" minutes (à 00s)
                elif (((int(minutes)+1) % delai == 0) and (int(secondes)  == 0)) or report.speed >= maxspeed or abs(report.lat - averagelat) > ecartinitlat or abs(report.lon - averagelon) > ecartinitlon or  abs(report.lat - lat) > ecartlat or abs(report.lon - lon) > ecartlon:
                    if speed >= maxspeed:
                        subject += " ALERT SPEED"
                        nalertspeed += 1
                        if nalertspeed > 2:
                            subject += " MAXSPEED+"
                            maxspeed += 0.01
                            nalertspeed = 0
                    if abs(report.lat - averagelat) > ecartinitlat or  abs(report.lon - averagelon) > ecartinitlon:
                        subject += " ALERT POSITION INITIALE"
                        if abs(report.lat - averagelat) > ecartinitlat:
                            nalertinitlat +=1
                            if nalertinitlat > 2:
                                subject += " ECART POS INIT LAT+"
                                nalertinitlat = 0
                                ecartinitlat += abs(report.lat - averagelat)
                        if abs(report.lon - averagelon) > ecartinitlon:
                            nalertinitlon += 1
                            if nalertinitlon > 2:
                                subject += " ECART POS INIT LON+"
                                nalertinitlon = 0
                                ecartinitlon += abs(report.lon - averagelon)
                    if abs(report.lat - lat) > ecartlat or abs(report.lon - lon) > ecartlon:
                        subject += " ALERT POSITIONS SUCCESSIVES"
                    msg = """From: toto@gmail.com\nTo: toto@gmail.com\nSubject: {}\n\ntime: {}\r\nspeed: {}\r\nlat: {} , ecart initial: {}\r\nlon: {} , ecart initial: {}""".format(str('%s' % (subject)), str('%s' % (time0)), str('%f' % (speed)), str('%f' % (report.lat)), str('%f' % (averagelat - report.lat)), str('%f' % (report.lon)), str('%f' % (averagelon - report.lon)))
                    print(msg)
                    try:
                        server = smtplib.SMTP('smtp.gmail.com', 587)
                        server.starttls()
                        server.login("toto@gmail.com", "totopassword")
                        server.sendmail("toto@gmail.com", "toto@gmail.com", msg)
                        server.quit()
                    except smtplib.SMTPException as err:
                        print (str(err))
                        print("Couldn't send mail")
                lat = report.lat
                lon = report.lon
    except KeyError:
        pass
    except KeyboardInterrupt:
        quit()
    except StopIteration:
        session = None
        print("GPSD has terminated")
...