diff --git a/autonomousCarGateway/carClient.py b/autonomousCarGateway/carClient.py index 6f20203..049a98a 100644 --- a/autonomousCarGateway/carClient.py +++ b/autonomousCarGateway/carClient.py @@ -4,21 +4,22 @@ import json import requests +import serial -server_ip = "iot-smart-parking.herokuapp.com" -server_port = "443" -API_ENDPOINT = 'https://' + server_ip + ':' + server_port + '/' +server_ip = "192.168.1.13"#"iot-smart-parking.herokuapp.com" +server_port = "8080"#"443" +API_ENDPOINT = 'http://' + server_ip + ':' + server_port + '/' try: -# ser = serial.Serial( -# port='/dev/ttyACM0', -# baudrate = 9600, -# parity=serial.PARITY_NONE, -# stopbits=serial.STOPBITS_ONE, -# bytesize=serial.EIGHTBITS, -# timeout=1 -# ) + ser = serial.Serial( + port='/dev/ttyACM0', + baudrate = 9600, + parity=serial.PARITY_NONE, + stopbits=serial.STOPBITS_ONE, + bytesize=serial.EIGHTBITS, + timeout=1 + ) c = requests.get(url=API_ENDPOINT, params = {}) doc = c.json() @@ -30,9 +31,11 @@ try: break print ("Free parking is Number: " + str(parking['no'])) + ser.flush() + ser.write(str.encode(str(parking['no']))) # ser.write("b'" + parking['no'] + "'") -# ser.flush() + ser.flush() except (NameError, TypeError) as e: - print ("No free parking") + print ("No free parking" + str(e)) except requests.exceptions.ConnectionError: - print("No Internet access") + print("No Internet access" + str(e)) diff --git a/gatewayNode/parking.py b/gatewayNode/parking.py index f796675..4d94b8d 100644 --- a/gatewayNode/parking.py +++ b/gatewayNode/parking.py @@ -9,33 +9,33 @@ import json # Open file to configure communication with server. with open('/home/pi/project/data.json', 'r') as json_file: - json_data = json_file.read() + json_data = json_file.read() if json_data != "" and json_data != None: - server_par = json.loads(json_data.replace('\n','').replace(' ','')) - - server_ip = server_par['ip'] - server_port = server_par['port'] - - if server_ip != None and server_port != None: - API_ENDPOINT = 'http://' + server_ip + ':' + server_port + '/parkingStatus' - ser = serial.Serial( - port='/dev/ttyACM0', - baudrate = 9600, - parity=serial.PARITY_NONE, - stopbits=serial.STOPBITS_ONE, - bytesize=serial.EIGHTBITS, - timeout=1 - ) - counter=0 - - ser.readline() - prev_status = "-1" - - device_session = requests.session() - data = """{"username" :""" + server_par['username'] + """, "password":""" + server_par['password'] + """, "device": """ + server_par['device'] + """}""" - - s.post(url = API_ENDPOINT, data = data) + server_par = json.loads(json_data.replace('\n','').replace(' ','')) + + server_ip = server_par['ip'] + server_port = server_par['port'] + + if server_ip != None and server_port != None: + API_ENDPOINT = 'http://' + server_ip + ':' + server_port + '/parkingStatus' + ser = serial.Serial( + port='/dev/ttyACM0', + baudrate = 9600, + parity=serial.PARITY_NONE, + stopbits=serial.STOPBITS_ONE, + bytesize=serial.EIGHTBITS, + timeout=1 + ) + counter=0 + + ser.readline() + prev_status = "-1" + + device_session = requests.session() + data = """{"username" :""" + server_par['username'] + """, "password":""" + server_par['password'] + """, "device": """ + server_par['device'] + """}""" + + s.post(url = API_ENDPOINT, data = data) while 1: park_status = ser.readline() park_status_data = str(park_status).split("#") diff --git a/project.adoc b/project.adoc index f457948..baac1a9 100644 --- a/project.adoc +++ b/project.adoc @@ -201,10 +201,9 @@ mysql-connector έναρξη του process. Αυτό το αρχείο ονομάζεται Procfile . Στο αρχείο αυτό αναφέτεται ένα gunicorn module. Ο gunicorn είναι ένας Python HTTP WEB server. Αυτό ουσιαστικά είναι ο ο πυρήνας για την εκτέλεση του API μας. -<<<<<<< HEAD * Έπειτα με μια απομακρυσμένη σύνδεση στη βάση μας της οποίας τα στοιχεία πρόσβασης γίνονται στο Heroku, πραγματοποιούμε μία σύνδεση και δημιουργούμε τον πίνακά μας για την αποθήκευση. -======= + Το αρχείο αυτό έχει τη μορφή αυτή: [source, conf] @@ -222,9 +221,21 @@ Source: https://gunicorn.org * Έπειτα με μια απομακρυσμένη σύνδεση στη βάση μας της οποίας τα στοιχεία πρόσβασης δίνονται από Heroku, πραγματοποιούμε μία σύνδεση και δημιουργούμε τον πίνακά μας για την αποθήκευση των δεδομένων. ->>>>>>> 6cae23e4eeddcdfcc8a558241aeb46b4de0153df -==== REST API +==== Σε άλλη περίπτωση Deployment στο Localhost + +Στην περίπτωση όπου η πλατφόρμα Heroku μας περιορίζει στα ερωτήματα στη βάση δεδομένων που χρησιμοποιούμε +κάνουμε deploy της εφαρμογής στον localhost. Για να το επιτύχουμε αυτό θα εκτελέσουμε τις εξής εντολές στο +terminal. + +[source, script] +---- +export FLASK_APP=serv +export FLASK_DEBUG=1 +flask run --host=[IP-v4] --port=8080 +---- + +==== Περιγραφή REST API Το REST API ουσιαστικά σηκώνει δύο υπηρεσίες. Αυτές είναι: * / [GET]: επιστρέφει ένα Array από JSON objects, ένα JSON για κάθε θέση του parking αν είναι διαθέσιμη ή όχι κωδικοποιημένα με 0 ή 1. @@ -237,7 +248,7 @@ Source: https://gunicorn.org [{"no": 1, "status": false}, {"no": 2, "status": false}, {"no": 3, "status": false}, {"no": 4, "status": true}, {"no": 5, "status": false}, {"no": 6, "status": false}, {"no": 7, "status": false}, {"no": 8, "status": false}] ---- -* /parkingStatus [POST]: που μας επιτρέπει να αλλάξουμε την κατάσταση μίας θέσης parking. Στο POST τα δεδομένα +* /parkingStatus [POST] (content-type = "application/json"): που μας επιτρέπει να αλλάξουμε την κατάσταση μίας θέσης parking. Στο POST τα δεδομένα ορίζονται στο body σε αναπαράσταση JSON, έτσι ώστε ο Server να είναι ικανός να τα επεξεργαστεί και να τα αποθηκεύσει στη βάση δεδομένων που χρησιμοποιούμε. @@ -248,6 +259,11 @@ Source: https://gunicorn.org {"no": 2, "status": false} ---- +Ακόμα το REST API υποστυρίζει μηχανιμσό αυθεντικοποίησης έτσι ώστε οι μεταβολές-ενημερώσεις των θέσεων του parking +να γίνονται μόνο από τους εξουσιοδοτημένους κόμβους του συστήματος. Αυτό επιτυγχάνεται με την ενεργοποίηση μίας +υπηρεσίας όπως περιγράφεται παρακάτω: + +* /authentication [POST] (content-type = "application/json): == Διεπαφή Χρήστη (4~ο~ μέρος) === Η διεπαφή του χρήστη diff --git a/serverNode/__pycache__/serv.cpython-37.pyc b/serverNode/__pycache__/serv.cpython-37.pyc index ea35366..d11e2ef 100644 Binary files a/serverNode/__pycache__/serv.cpython-37.pyc and b/serverNode/__pycache__/serv.cpython-37.pyc differ diff --git a/serverNode/serv.py b/serverNode/serv.py index dc321b2..2784887 100644 --- a/serverNode/serv.py +++ b/serverNode/serv.py @@ -49,6 +49,8 @@ def getParkings(): parks.append({"no": res[0], "status": False}) return parks +# Define a function that get if a user with exiting credencials +# username and password is authenticated. def isMember(username, password): myCursor.execute("SELECT * FROM USERS") myRes = myCursor.fetchall() @@ -61,6 +63,8 @@ def isMember(username, password): return isValid +# Function that return if the requested user is authenticated +# or not (True / False). def isAuthenticated(): if 'device_id' in session: return True @@ -75,6 +79,7 @@ def isAuthenticated(): # other methods include put, delete, etc. class Parking(Resource): def get(self): + parks = None try: parks = getParkings() except mysql.connector.errors.DatabaseError as e: