Browse Source

Update v1.3

master
Evangelos Oulis 5 years ago
parent
commit
cbe6fbd23f
  1. 31
      autonomousCarGateway/carClient.py
  2. 50
      gatewayNode/parking.py
  3. 26
      project.adoc
  4. BIN
      serverNode/__pycache__/serv.cpython-37.pyc
  5. 5
      serverNode/serv.py

31
autonomousCarGateway/carClient.py

@ -4,21 +4,22 @@
import json import json
import requests import requests
import serial
server_ip = "iot-smart-parking.herokuapp.com" server_ip = "192.168.1.13"#"iot-smart-parking.herokuapp.com"
server_port = "443" server_port = "8080"#"443"
API_ENDPOINT = 'https://' + server_ip + ':' + server_port + '/' API_ENDPOINT = 'http://' + server_ip + ':' + server_port + '/'
try: try:
# ser = serial.Serial( ser = serial.Serial(
# port='/dev/ttyACM0', port='/dev/ttyACM0',
# baudrate = 9600, baudrate = 9600,
# parity=serial.PARITY_NONE, parity=serial.PARITY_NONE,
# stopbits=serial.STOPBITS_ONE, stopbits=serial.STOPBITS_ONE,
# bytesize=serial.EIGHTBITS, bytesize=serial.EIGHTBITS,
# timeout=1 timeout=1
# ) )
c = requests.get(url=API_ENDPOINT, params = {}) c = requests.get(url=API_ENDPOINT, params = {})
doc = c.json() doc = c.json()
@ -30,9 +31,11 @@ try:
break break
print ("Free parking is Number: " + str(parking['no'])) print ("Free parking is Number: " + str(parking['no']))
ser.flush()
ser.write(str.encode(str(parking['no'])))
# ser.write("b'" + parking['no'] + "'") # ser.write("b'" + parking['no'] + "'")
# ser.flush() ser.flush()
except (NameError, TypeError) as e: except (NameError, TypeError) as e:
print ("No free parking") print ("No free parking" + str(e))
except requests.exceptions.ConnectionError: except requests.exceptions.ConnectionError:
print("No Internet access") print("No Internet access" + str(e))

50
gatewayNode/parking.py

@ -9,33 +9,33 @@ import json
# Open file to configure communication with server. # Open file to configure communication with server.
with open('/home/pi/project/data.json', 'r') as json_file: 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: if json_data != "" and json_data != None:
server_par = json.loads(json_data.replace('\n','').replace(' ','')) server_par = json.loads(json_data.replace('\n','').replace(' ',''))
server_ip = server_par['ip'] server_ip = server_par['ip']
server_port = server_par['port'] server_port = server_par['port']
if server_ip != None and server_port != None: if server_ip != None and server_port != None:
API_ENDPOINT = 'http://' + server_ip + ':' + server_port + '/parkingStatus' API_ENDPOINT = 'http://' + server_ip + ':' + server_port + '/parkingStatus'
ser = serial.Serial( ser = serial.Serial(
port='/dev/ttyACM0', port='/dev/ttyACM0',
baudrate = 9600, baudrate = 9600,
parity=serial.PARITY_NONE, parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE, stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS, bytesize=serial.EIGHTBITS,
timeout=1 timeout=1
) )
counter=0 counter=0
ser.readline() ser.readline()
prev_status = "-1" prev_status = "-1"
device_session = requests.session() device_session = requests.session()
data = """{"username" :""" + server_par['username'] + """, "password":""" + server_par['password'] + """, "device": """ + server_par['device'] + """}""" data = """{"username" :""" + server_par['username'] + """, "password":""" + server_par['password'] + """, "device": """ + server_par['device'] + """}"""
s.post(url = API_ENDPOINT, data = data) s.post(url = API_ENDPOINT, data = data)
while 1: while 1:
park_status = ser.readline() park_status = ser.readline()
park_status_data = str(park_status).split("#") park_status_data = str(park_status).split("#")

26
project.adoc

@ -201,10 +201,9 @@ mysql-connector
έναρξη του process. Αυτό το αρχείο ονομάζεται Procfile . Στο αρχείο αυτό αναφέτεται ένα gunicorn module. έναρξη του process. Αυτό το αρχείο ονομάζεται Procfile . Στο αρχείο αυτό αναφέτεται ένα gunicorn module.
Ο gunicorn είναι ένας Python HTTP WEB server. Αυτό ουσιαστικά είναι ο ο πυρήνας για την εκτέλεση του API μας. Ο gunicorn είναι ένας Python HTTP WEB server. Αυτό ουσιαστικά είναι ο ο πυρήνας για την εκτέλεση του API μας.
<<<<<<< HEAD
* Έπειτα με μια απομακρυσμένη σύνδεση στη βάση μας της οποίας τα στοιχεία πρόσβασης γίνονται στο Heroku, * Έπειτα με μια απομακρυσμένη σύνδεση στη βάση μας της οποίας τα στοιχεία πρόσβασης γίνονται στο Heroku,
πραγματοποιούμε μία σύνδεση και δημιουργούμε τον πίνακά μας για την αποθήκευση. πραγματοποιούμε μία σύνδεση και δημιουργούμε τον πίνακά μας για την αποθήκευση.
=======
Το αρχείο αυτό έχει τη μορφή αυτή: Το αρχείο αυτό έχει τη μορφή αυτή:
[source, conf] [source, conf]
@ -222,9 +221,21 @@ Source: https://gunicorn.org
* Έπειτα με μια απομακρυσμένη σύνδεση στη βάση μας της οποίας τα στοιχεία πρόσβασης δίνονται από Heroku, * Έπειτα με μια απομακρυσμένη σύνδεση στη βάση μας της οποίας τα στοιχεία πρόσβασης δίνονται από 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 ουσιαστικά σηκώνει δύο υπηρεσίες. Αυτές είναι: Το REST API ουσιαστικά σηκώνει δύο υπηρεσίες. Αυτές είναι:
* / [GET]: επιστρέφει ένα Array από JSON objects, ένα JSON για κάθε θέση του parking αν είναι διαθέσιμη ή όχι κωδικοποιημένα με 0 ή 1. * / [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}] [{"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 να είναι ικανός να τα επεξεργαστεί και να τα αποθηκεύσει ορίζονται στο body σε αναπαράσταση JSON, έτσι ώστε ο Server να είναι ικανός να τα επεξεργαστεί και να τα αποθηκεύσει
στη βάση δεδομένων που χρησιμοποιούμε. στη βάση δεδομένων που χρησιμοποιούμε.
@ -248,6 +259,11 @@ Source: https://gunicorn.org
{"no": 2, "status": false} {"no": 2, "status": false}
---- ----
Ακόμα το REST API υποστυρίζει μηχανιμσό αυθεντικοποίησης έτσι ώστε οι μεταβολές-ενημερώσεις των θέσεων του parking
να γίνονται μόνο από τους εξουσιοδοτημένους κόμβους του συστήματος. Αυτό επιτυγχάνεται με την ενεργοποίηση μίας
υπηρεσίας όπως περιγράφεται παρακάτω:
* /authentication [POST] (content-type = "application/json):
== Διεπαφή Χρήστη (4~ο~ μέρος) == Διεπαφή Χρήστη (4~ο~ μέρος)
=== Η διεπαφή του χρήστη === Η διεπαφή του χρήστη

BIN
serverNode/__pycache__/serv.cpython-37.pyc

Binary file not shown.

5
serverNode/serv.py

@ -49,6 +49,8 @@ def getParkings():
parks.append({"no": res[0], "status": False}) parks.append({"no": res[0], "status": False})
return parks return parks
# Define a function that get if a user with exiting credencials
# username and password is authenticated.
def isMember(username, password): def isMember(username, password):
myCursor.execute("SELECT * FROM USERS") myCursor.execute("SELECT * FROM USERS")
myRes = myCursor.fetchall() myRes = myCursor.fetchall()
@ -61,6 +63,8 @@ def isMember(username, password):
return isValid return isValid
# Function that return if the requested user is authenticated
# or not (True / False).
def isAuthenticated(): def isAuthenticated():
if 'device_id' in session: if 'device_id' in session:
return True return True
@ -75,6 +79,7 @@ def isAuthenticated():
# other methods include put, delete, etc. # other methods include put, delete, etc.
class Parking(Resource): class Parking(Resource):
def get(self): def get(self):
parks = None
try: try:
parks = getParkings() parks = getParkings()
except mysql.connector.errors.DatabaseError as e: except mysql.connector.errors.DatabaseError as e:

Loading…
Cancel
Save