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 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))

50
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("#")

26
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~ο~ μέρος)
=== Η διεπαφή του χρήστη

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})
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:

Loading…
Cancel
Save