{"id":434,"date":"2018-06-17T22:04:27","date_gmt":"2018-06-17T22:04:27","guid":{"rendered":"https:\/\/www.wpvs.de\/iot-2018\/?p=434"},"modified":"2021-05-14T10:07:04","modified_gmt":"2021-05-14T08:07:04","slug":"fahrtenbuch-5-gsm-und-gps-modul-ansteuern","status":"publish","type":"post","link":"https:\/\/www.iot-embedded.de\/iot-2018\/projekt-fahrtenbuch\/fahrtenbuch-5-gsm-und-gps-modul-ansteuern\/","title":{"rendered":"Fahrtenbuch (5): GSM- und GPS-Modul ansteuern"},"content":{"rendered":"<p>Um die Position des Fahrzeugs zu ermitteln und an den Webserver zu senden, wird eine GSM- und GPS-Modul verwendet. Wir haben uns f\u00fcr das Modul &#8222;<a href=\"https:\/\/www.amazon.de\/AZDelivery-Shield-Antenne-Arduino-GRATIS\/dp\/B0721T8CDZ\"><span id=\"productTitle\" class=\"a-size-large\">AZDelivery SIM 808 GPRS\/GSM Shield<\/span><\/a>&#8220; entschieden. In diesem Set sind die ben\u00f6tigten Antennen enthalten.<\/p>\n<p>Zur Kommunikation zwischen RaspberryPi und Sim-Modul wird die serielle Schnittstelle verwendet. Diese nutzt die Ports TX und RX des RaspberryPi&#8217;s. Zudem wird das Sim-Modul \u00fcber ein externes Netzteil mit Strom versorgt.<\/p>\n<p>Folgendes Tutorial beschreibt, wie die serielle Schnittstelle konfiguriert werden muss: <a href=\"http:\/\/www.rhydolabz.com\/wiki\/?p=15764\">http:\/\/www.rhydolabz.com\/wiki\/?p=15764<\/a><\/p>\n<p>Nachdem diese Schritte durchgef\u00fchrt wurden, kann der Raspi mit dem Modul kommunizieren. Dazu werden sogenannte AT-Befehle verwendet. Das Modul lie\u00dft diese aus und sendet entsprechend eine Antwort zur\u00fcck. Beispielsweie sendet das GPS-Modul nach erhalt des Befehls <em>AT+CGNSINF <\/em>die aktuelle Position zur\u00fcck. F\u00fcr die Internetverbindung sind allerdings mehrere AT-Befehle n\u00f6tig. Folgendes Beispiel sendet einen json-String an einen Webserver (gr\u00fcn sind die Antworten des Moduls):<\/p>\n<blockquote><p>AT+HTTPINIT<br \/>\n<span style=\"color: #339966\">OK<\/span><br \/>\nAT+HTTPPARA=&#8220;CID&#8220;,1<br \/>\n<span style=\"color: #339966\">OK<\/span><br \/>\nAT+HTTPPARA=&#8220;URL&#8220;,&#8220;http:\/\/URL-DER-REST-API&#8220;<br \/>\n<span style=\"color: #339966\">OK<\/span><br \/>\nAT+HTTPPARA=&#8220;CONTENT&#8220;,&#8220;application\/json&#8220;<br \/>\n<span style=\"color: #339966\">OK<\/span><br \/>\nAT+HTTPDATA=100,5000<br \/>\n<span style=\"color: #339966\">DOWNLOAD<\/span><\/p>\n<p>Zu sendete Daten, bspw. json-String<\/p>\n<p><span style=\"color: #339966\">OK<\/span><br \/>\nAT+HTTPACTION=1<br \/>\n<span style=\"color: #339966\">OK<\/span><br \/>\nAT+HTTPTERM<br \/>\n<span style=\"color: #339966\">OK<\/span><\/p><\/blockquote>\n<p>Somit k\u00f6nnen nun die Positionen an den Webserver gesendet werden. Folgender Code stellt dies dar:<\/p>\n<blockquote><p>import threading<br \/>\nfrom threading import Thread<br \/>\nimport serial<br \/>\nimport os, time, json<br \/>\n# Enable Serial Communication<\/p>\n<p>port = serial.Serial(&#8222;\/dev\/ttyS0&#8220;, baudrate=9600, timeout=1)<\/p>\n<p>class Fahrt:<\/p>\n<p style=\"padding-left: 30px\">def __init__(self):<\/p>\n<p style=\"padding-left: 60px\">#FAHRT-ID von Server holen und Token generieren<br \/>\nprint &#8222;NEUE FAHRT GESTARTET&#8220;<br \/>\nself.id = 123<br \/>\nself.startTime = int(time.time())<br \/>\nself.wegpunkteBuffer = []<br \/>\nself.wegpunkte = []<\/p>\n<p style=\"padding-left: 30px\">def clearBuffer(self): #Buffer leeren nach senden<\/p>\n<p style=\"padding-left: 60px\">self.wegpunkte.extend(self.wegpunkteBuffer)<br \/>\nself.wegpunkteBuffer = []<\/p>\n<p style=\"padding-left: 30px\">def toJSON(self, withWP): #Fahrt-Objekt in json-String umwandeln<\/p>\n<p style=\"padding-left: 60px\">if withWP == True:<\/p>\n<p style=\"padding-left: 90px\">return json.dumps(self, default=lambda x: x.__dict__)<\/p>\n<p style=\"padding-left: 60px\">elif withWP == False:<\/p>\n<p style=\"padding-left: 90px\">wp = self.wegpunkte<br \/>\ndel self.wegpunkte<br \/>\njsonStr = json.dumps(self, default=lambda x: x.__dict__)<br \/>\nself.wegpunkte = wp<br \/>\nreturn jsonStr<\/p>\n<p>class Koordinate:<\/p>\n<p style=\"padding-left: 30px\">def __init__(self, time, lat, lon):<\/p>\n<p style=\"padding-left: 60px\">self.time = time<br \/>\nself.lat = lat<br \/>\nself.lon = lon<\/p>\n<p>def getGPS(): #Funktion gibt Koordinaten zur\u00fcck<\/p>\n<p style=\"padding-left: 30px\">port.write(&#8218;AT+CGNSPWR=1&#8217;+&#8217;\\r\\n&#8216;)<br \/>\nrcv = port.read(1000)<br \/>\nprint rcv<\/p>\n<p style=\"padding-left: 30px\">while True: #GPS-Lesen biss Punkt gefunden<\/p>\n<p style=\"padding-left: 60px\">port.write(&#8218;AT+CGNSINF&#8217;+&#8217;\\r\\n&#8216;)<br \/>\nrcv = port.read(1000)<br \/>\nprint rcv<br \/>\na = rcv.split(&#8222;,&#8220;,5)<br \/>\nif a[1] == &#8222;1&#8220;:<\/p>\n<p style=\"padding-left: 90px\">coords = Koordinate(a[2], a[3], a[4])<br \/>\nprint &#8222;Lat: &#8222;+coords.lat+&#8220; &#8211; Lon: &#8222;+coords.lon<br \/>\nbreak<\/p>\n<p style=\"padding-left: 60px\">return coords<\/p>\n<p>def senden(): #Funktion sendet Fahrt-Objekt an Server<\/p>\n<p style=\"padding-left: 30px\">print &#8222;SENDE DATEN&#8230; &#8230; &#8230;&#8220;<br \/>\nport.write(&#8218;AT+SAPBR=3,1,&#8220;APN&#8220;,&#8220;internet.t-mobile&#8220;&#8218;+&#8217;\\r\\n&#8216;)<br \/>\nrcv = port.read(100)<br \/>\nprint rcv<br \/>\nport.write(&#8218;AT+SAPBR=1,1&#8217;+&#8217;\\r\\n&#8216;)<br \/>\nrcv = port.read(100)<br \/>\nprint rcv<br \/>\nport.write(&#8218;AT+HTTPSSL=1&#8217;+&#8217;\\r\\n&#8216;)<br \/>\nrcv = port.read(100)<br \/>\nprint rcv<br \/>\nport.write(&#8218;AT+HTTPINIT&#8217;+&#8217;\\r\\n&#8216;)<br \/>\nrcv = port.read(100)<br \/>\nprint rcv<br \/>\nport.write(&#8218;AT+HTTPPARA=&#8220;CID&#8220;,1&#8217;+&#8217;\\r\\n&#8216;)<br \/>\nrcv = port.read(100)<br \/>\nprint rcv<br \/>\nport.write(&#8218;AT+HTTPPARA=&#8220;URL&#8220;,&#8220;http:\/\/ptsv2.com\/t\/vwe6f-1528377575\/post&#8220;&#8218;+&#8217;\\r\\n&#8216;)<br \/>\nrcv = port.read(100)<br \/>\nprint rcv<br \/>\nport.write(&#8218;AT+HTTPPARA=&#8220;CONTENT&#8220;,&#8220;application\/json&#8220;&#8218;+&#8217;\\r\\n&#8216;)<br \/>\nrcv = port.read(100)<br \/>\nprint rcv<br \/>\nsendJson = f.toJSON(False)<br \/>\nport.write(&#8218;AT+HTTPDATA=&#8217;+str(len(sendJson))+&#8216;,1000&#8217;+&#8217;\\r\\n&#8216;)<br \/>\nrcv = port.read(100)<br \/>\nprint rcv<br \/>\nport.write(sendJson)<br \/>\nrcv = port.read(1000)<br \/>\nprint rcv<br \/>\ntime.sleep(2)<br \/>\nport.write(&#8218;AT+HTTPACTION=1&#8217;+&#8217;\\r\\n&#8216;)<br \/>\nrcv = port.read(100)<br \/>\nprint &#8222;___&#8220;<br \/>\nprint rcv<br \/>\nport.write(&#8218;AT+HTTPTERM&#8217;+&#8217;\\r\\n&#8216;)<br \/>\nrcv = port.read(100)<br \/>\nprint &#8222;___&#8220;<br \/>\nprint rcv<br \/>\ntime.sleep(4)<br \/>\nf.clearBuffer()<\/p>\n<p>def gpsLoop(): #Intervall, um Position zu speichern<\/p>\n<p style=\"padding-left: 30px\">while True:<\/p>\n<p style=\"padding-left: 60px\">print &#8222;LESE GPS&#8230; &#8230; &#8230;&#8220;<br \/>\nf.wegpunkteBuffer.append(getGPS()) #Coordinaten in Buffer einf\u00fcgen<br \/>\nprint &#8222;Anzahl Wegpunkte in Buffer: &#8222;+str(len(f.wegpunkteBuffer))<br \/>\nif len(f.wegpunkteBuffer) == 5: #Senden wenn 5 Wegpunkte in Buffer<\/p>\n<p style=\"padding-left: 90px\">senden() #Wegpunkte in Buffer an Webserver senden<br \/>\ntime.sleep(30) #Sekunden Pause zwischen den GPS-Fixes<\/p>\n<p style=\"text-align: left\">def count(): #Multithreading testen<\/p>\n<p style=\"text-align: left;padding-left: 30px\">i = 1<br \/>\nwhile True:<\/p>\n<p style=\"text-align: left;padding-left: 60px\">print str(i) + &#8222;: LESE RFID&#8230; &#8230; &#8230; Programm beenden mit STRG + Z&#8220;<br \/>\ni += 1<br \/>\ntime.sleep(1)<br \/>\nif i == 0:<\/p>\n<p style=\"text-align: left;padding-left: 90px\">break<\/p>\n<p>f = Fahrt()<br \/>\nport.write(&#8218;AT&#8217;+&#8217;\\r\\n&#8216;) #serielle Schnittstelle testen<br \/>\nrcv = port.read(10)<br \/>\nprint rcv<br \/>\nif __name__ == &#8218;__main__&#8216;:\u00a0 #Multithread -&gt;zwei Funktionen parallel ausf\u00fchren<\/p>\n<p style=\"padding-left: 30px\">Thread(target = gpsLoop).start()<br \/>\nThread(target = count).start()<\/p>\n<\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Um die Position des Fahrzeugs zu ermitteln und an den Webserver zu senden, wird eine GSM- und GPS-Modul verwendet. Wir haben uns f\u00fcr das Modul &#8222;AZDelivery SIM 808 GPRS\/GSM Shield&#8220; entschieden. In diesem Set sind die ben\u00f6tigten Antennen enthalten. Zur<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[2],"tags":[],"_links":{"self":[{"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/posts\/434"}],"collection":[{"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/comments?post=434"}],"version-history":[{"count":1,"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/posts\/434\/revisions"}],"predecessor-version":[{"id":631,"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/posts\/434\/revisions\/631"}],"wp:attachment":[{"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/media?parent=434"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/categories?post=434"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2018\/wp-json\/wp\/v2\/tags?post=434"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}