Elaborazione e trasmissione dei dati tramite il protocollo di comunicazione WebSocket
Cerințe pentru finalizare
Elaborazione e trasmissione dei dati tramite il protocollo di comunicazione WebSocket
Lo scopo di questo compito è trasmettere i dati misurati dal sensore a un'applicazione web. All'applicazione vengono inviati due tipi di dati, il primo è il peso totale misurato dal sensore e il secondo è il numero di prodotti ottenuto dividendo il peso totale per il peso unitario di un singolo prodotto.
Web-socket stabilisce la comunicazione tra il sensore e l'applicazione web. In questo caso d'uso, verrà implementata solo la direzione dal sensore alla web-app per trasmettere i dati del sensore alla web-app. La libreria Flask-Socket IO viene utilizzata per stabilire la comunicazione web-socket. È necessario eseguire il seguente comando per installare la libreria flask-socketio sul computer o su Raspberry Pi.sudo pip3 install flask-socketio
Il file application.py implementa sia la comunicazione web-socket dal lato del sensore sia il calcolo del peso. Se non si è scaricato il file dal repository, si può creare un file vuoto con questo nome e incollare il contenuto dell'elenco 1.
<span>from flask_socketio import SocketIO, emit
from flask import Flask, render_template, url_for, copy_current_request_context
from time import sleep
from threading import Thread, Event
app = Flask( name )
app.config['SECRET_KEY'] = 'secret!'
app.config['DEBUG'] = True
#turn the flask app into a socketio app
socketio = SocketIO(app, async_mode=None, logger=True, engineio_logger=True)
thread = Thread()
thread_stop_event = Event()
EMULATE_HX711 = True
if not EMULATE_HX711:
import RPi.GPIO as GPIO from hx711 import HX711
else:
from emulated_hx711 import HX711
def get_data():
hx = HX711(5, 6)
hx.set_reading_format("MSB", "MSB")
hx.set_reference_unit(308)
hx.reset()
hx.tare()
num_of_objects = 0
last_value = 0
while not thread_stop_event.isSet():
val = hx.get_weight(5)
if val > last_value:
if 30 <= abs(val - last_value) <= 75:
# print "Difference: %d" % (val - last_value)
num_of_objects += 1
last_value = val
elif last_value > val:
if 30 <= abs(last_value - val):
num_of_objects = max(0, num_of_objects - 1)
last_value = val
hx.power_down()
hx.power_up()
number = str(val) + ',' + str(num_of_objects)
socketio.emit('newnumber', {'number': number}, namespace='/test')
socketio.sleep(5)
@app.route('/') def index():
#only by sending this page first will the client be connected to the socketio instance return render_template('index.html')
@socketio.on('connect', namespace='/test') def test_connect():
# need visibility of the global thread object
global thread
print('Client connected')
#Start the random number generator thread only if the thread has not been started before.
if not thread.isAlive():
print("Starting Thread")
thread = socketio.start_background_task(get_data)
@socketio.on('disconnect', namespace='/test')
def test_disconnect():
print('Client disconnected')
if __name__== '_main_':
socketio.run(app)</span>
È possibile eseguire il codice di cui sopra richiamando il seguente comando:
python Applicazione.py