Um die Position des Fahrzeugs zu ermitteln und an den Webserver zu senden, wird eine GSM- und GPS-Modul verwendet. Wir haben uns für das Modul „AZDelivery SIM 808 GPRS/GSM Shield“ entschieden. In diesem Set sind die benötigten Antennen enthalten.

Zur Kommunikation zwischen RaspberryPi und Sim-Modul wird die serielle Schnittstelle verwendet. Diese nutzt die Ports TX und RX des RaspberryPi’s. Zudem wird das Sim-Modul über ein externes Netzteil mit Strom versorgt.

Folgendes Tutorial beschreibt, wie die serielle Schnittstelle konfiguriert werden muss: http://www.rhydolabz.com/wiki/?p=15764

Nachdem diese Schritte durchgeführt wurden, kann der Raspi mit dem Modul kommunizieren. Dazu werden sogenannte AT-Befehle verwendet. Das Modul ließt diese aus und sendet entsprechend eine Antwort zurück. Beispielsweie sendet das GPS-Modul nach erhalt des Befehls AT+CGNSINF die aktuelle Position zurück. Für die Internetverbindung sind allerdings mehrere AT-Befehle nötig. Folgendes Beispiel sendet einen json-String an einen Webserver (grün sind die Antworten des Moduls):

AT+HTTPINIT
OK
AT+HTTPPARA=“CID“,1
OK
AT+HTTPPARA=“URL“,“http://URL-DER-REST-API“
OK
AT+HTTPPARA=“CONTENT“,“application/json“
OK
AT+HTTPDATA=100,5000
DOWNLOAD

Zu sendete Daten, bspw. json-String

OK
AT+HTTPACTION=1
OK
AT+HTTPTERM
OK

Somit können nun die Positionen an den Webserver gesendet werden. Folgender Code stellt dies dar:

import threading
from threading import Thread
import serial
import os, time, json
# Enable Serial Communication

port = serial.Serial(„/dev/ttyS0“, baudrate=9600, timeout=1)

class Fahrt:

def __init__(self):

#FAHRT-ID von Server holen und Token generieren
print „NEUE FAHRT GESTARTET“
self.id = 123
self.startTime = int(time.time())
self.wegpunkteBuffer = []
self.wegpunkte = []

def clearBuffer(self): #Buffer leeren nach senden

self.wegpunkte.extend(self.wegpunkteBuffer)
self.wegpunkteBuffer = []

def toJSON(self, withWP): #Fahrt-Objekt in json-String umwandeln

if withWP == True:

return json.dumps(self, default=lambda x: x.__dict__)

elif withWP == False:

wp = self.wegpunkte
del self.wegpunkte
jsonStr = json.dumps(self, default=lambda x: x.__dict__)
self.wegpunkte = wp
return jsonStr

class Koordinate:

def __init__(self, time, lat, lon):

self.time = time
self.lat = lat
self.lon = lon

def getGPS(): #Funktion gibt Koordinaten zurück

port.write(‚AT+CGNSPWR=1’+’\r\n‘)
rcv = port.read(1000)
print rcv

while True: #GPS-Lesen biss Punkt gefunden

port.write(‚AT+CGNSINF’+’\r\n‘)
rcv = port.read(1000)
print rcv
a = rcv.split(„,“,5)
if a[1] == „1“:

coords = Koordinate(a[2], a[3], a[4])
print „Lat: „+coords.lat+“ – Lon: „+coords.lon
break

return coords

def senden(): #Funktion sendet Fahrt-Objekt an Server

print „SENDE DATEN… … …“
port.write(‚AT+SAPBR=3,1,“APN“,“internet.t-mobile“‚+’\r\n‘)
rcv = port.read(100)
print rcv
port.write(‚AT+SAPBR=1,1’+’\r\n‘)
rcv = port.read(100)
print rcv
port.write(‚AT+HTTPSSL=1’+’\r\n‘)
rcv = port.read(100)
print rcv
port.write(‚AT+HTTPINIT’+’\r\n‘)
rcv = port.read(100)
print rcv
port.write(‚AT+HTTPPARA=“CID“,1’+’\r\n‘)
rcv = port.read(100)
print rcv
port.write(‚AT+HTTPPARA=“URL“,“http://ptsv2.com/t/vwe6f-1528377575/post“‚+’\r\n‘)
rcv = port.read(100)
print rcv
port.write(‚AT+HTTPPARA=“CONTENT“,“application/json“‚+’\r\n‘)
rcv = port.read(100)
print rcv
sendJson = f.toJSON(False)
port.write(‚AT+HTTPDATA=’+str(len(sendJson))+‘,1000’+’\r\n‘)
rcv = port.read(100)
print rcv
port.write(sendJson)
rcv = port.read(1000)
print rcv
time.sleep(2)
port.write(‚AT+HTTPACTION=1’+’\r\n‘)
rcv = port.read(100)
print „___“
print rcv
port.write(‚AT+HTTPTERM’+’\r\n‘)
rcv = port.read(100)
print „___“
print rcv
time.sleep(4)
f.clearBuffer()

def gpsLoop(): #Intervall, um Position zu speichern

while True:

print „LESE GPS… … …“
f.wegpunkteBuffer.append(getGPS()) #Coordinaten in Buffer einfügen
print „Anzahl Wegpunkte in Buffer: „+str(len(f.wegpunkteBuffer))
if len(f.wegpunkteBuffer) == 5: #Senden wenn 5 Wegpunkte in Buffer

senden() #Wegpunkte in Buffer an Webserver senden
time.sleep(30) #Sekunden Pause zwischen den GPS-Fixes

def count(): #Multithreading testen

i = 1
while True:

print str(i) + „: LESE RFID… … … Programm beenden mit STRG + Z“
i += 1
time.sleep(1)
if i == 0:

break

f = Fahrt()
port.write(‚AT’+’\r\n‘) #serielle Schnittstelle testen
rcv = port.read(10)
print rcv
if __name__ == ‚__main__‘:  #Multithread ->zwei Funktionen parallel ausführen

Thread(target = gpsLoop).start()
Thread(target = count).start()

Fahrtenbuch (5): GSM- und GPS-Modul ansteuern