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