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
DOWNLOADZu 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 Communicationport = 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 jsonStrclass Koordinate:
def __init__(self, time, lat, lon):
self.time = time
self.lat = lat
self.lon = londef getGPS(): #Funktion gibt Koordinaten zurück
port.write(‚AT+CGNSPWR=1’+’\r\n‘)
rcv = port.read(1000)
print rcvwhile 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
breakreturn 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 Buffersenden() #Wegpunkte in Buffer an Webserver senden
time.sleep(30) #Sekunden Pause zwischen den GPS-Fixesdef 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ührenThread(target = gpsLoop).start()
Thread(target = count).start()