просто для того, чтобы поделиться небольшим кодом 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")