.. note::

    Ciao, benvenuto nella Community di appassionati di SunFounder Raspberry Pi, Arduino e ESP32 su Facebook! Approfondisci le tue conoscenze su Raspberry Pi, Arduino e ESP32 insieme ad altri appassionati.

    **Perché unirti?**

    - **Supporto esperto**: Risolvi i problemi post-vendita e le sfide tecniche con l'aiuto della nostra community e del nostro team.
    - **Impara e condividi**: Scambia consigli e tutorial per migliorare le tue competenze.
    - **Anteprime esclusive**: Ottieni accesso anticipato agli annunci di nuovi prodotti e alle anteprime.
    - **Sconti speciali**: Approfitta di sconti esclusivi sui nostri prodotti più recenti.
    - **Promozioni festive e giveaway**: Partecipa a promozioni festive e concorsi a premi.

    👉 Pronto a esplorare e creare con noi? Clicca su [|link_sf_facebook|] e unisciti oggi stesso!

.. _nt_mqtt_publish:

5. Sistema di chiamata in cloud con @MQTT
===============================================

Il Message Queuing Telemetry Transport (MQTT) è un semplice protocollo di messaggistica.
È anche il protocollo di messaggistica più comune per l'Internet delle Cose (IoT).

I protocolli MQTT definiscono il modo in cui i dispositivi IoT trasferiscono i dati.
Sono basati sugli eventi e interconnessi utilizzando il modello Pub/Sub.
Il mittente (Publisher) e il destinatario (Subscriber) comunicano tramite argomenti (Topics).
Un dispositivo pubblica un messaggio su un argomento specifico, e tutti i dispositivi iscritti a quell'argomento ricevono il messaggio.

In questa sezione, verrà realizzato un sistema di chiamata utilizzando Pico W, HiveMQ (un servizio broker MQTT pubblico e gratuito) e quattro pulsanti.
I quattro pulsanti rappresentano quattro tavoli in un ristorante, e potrai vedere quale tavolo necessita di assistenza su HiveMQ quando il cliente preme il pulsante.

**1. Componenti necessari**

In questo progetto, abbiamo bisogno dei seguenti componenti. 

È sicuramente conveniente acquistare un kit completo, ecco il link:

.. list-table::
    :widths: 20 20 20
    :header-rows: 1

    *   - Nome	
        - ELEMENTI IN QUESTO KIT
        - LINK
    *   - Kit Kepler	
        - 450+
        - |link_kepler_kit|

Puoi anche acquistarli separatamente dai link qui sotto.

.. list-table::
    :widths: 5 20 5 20
    :header-rows: 1

    *   - SN
        - COMPONENTE	
        - QUANTITÀ
        - LINK

    *   - 1
        - :ref:`cpn_pico_w`
        - 1
        - |link_picow_buy|
    *   - 2
        - Cavo Micro USB
        - 1
        - 
    *   - 3
        - :ref:`cpn_breadboard`
        - 1
        - |link_breadboard_buy|
    *   - 4
        - :ref:`cpn_wire`
        - Diverse
        - |link_wires_buy|
    *   - 5
        - :ref:`cpn_resistor`
        - 4(10KΩ)
        - |link_resistor_buy|
    *   - 6
        - :ref:`cpn_button`
        - 4
        - |link_button_buy|
    *   - 7
        - :ref:`cpn_lipo_charger`
        - 1
        -  
    *   - 8
        - 18650 Battery
        - 1
        -  
    *   - 9
        - Battery Holder
        - 1
        -  

**2. Costruisci il circuito**

    .. warning:: 
        
        Assicurati che il modulo caricabatterie Li-po sia collegato come mostrato nello schema. Altrimenti, un cortocircuito potrebbe danneggiare la batteria e il circuito.

.. image:: img/wiring/5.mqtt_pub.png
    :width: 800

**3. Visita HiveMQ**

HiveMQ è una piattaforma di messaggistica basata su broker MQTT e client che consente un trasferimento di dati veloce, efficiente e affidabile ai dispositivi IoT.

1. Apri |link_hivemq| nel tuo browser.

2. Collega il client al proxy pubblico predefinito.

   .. image:: img/mqtt-1.png

3. Clicca su **Add New Topic Subscription**.

   .. image:: img/mqtt-2.png

4. Inserisci gli argomenti che vuoi seguire e clicca su **Subscribe**. Gli argomenti impostati qui dovrebbero essere più personali per evitare di ricevere messaggi da altri utenti; fai attenzione anche alla distinzione tra maiuscole e minuscole.

   .. image:: img/mqtt-3.png


**4. Installa il modulo MQTT**

Prima di iniziare il progetto, dobbiamo installare il modulo MQTT per Pico W.

1. Connettiti alla rete eseguendo ``do_connect()`` nella Shell, che abbiamo scritto in precedenza.

    .. note::
        * Digita i seguenti comandi nella Shell e premi ``Enter`` per eseguirli.
        * Se non hai gli script ``do_connect.py`` e ``secrets.py`` nel tuo Pico W, fai riferimento a :ref:`iot_access` per crearli.

    .. code-block:: python

        from do_connect import *
        do_connect()

2. Dopo una connessione di rete riuscita, importa il modulo ``mip`` nella shell e utilizza ``mip`` per installare il modulo ``umqtt.simple``, che è un client MQTT semplificato per MicroPython.

    .. code-block:: python

        import mip
        mip.install('umqtt.simple')

3. Vedrai che il modulo ``umqtt`` è installato sotto il percorso ``/lib/`` di Pico W al termine dell'installazione.

    .. image:: img/5_calling_system1.png

**5. Esegui lo script**

#. Apri il file ``5_mqtt_publish.py`` nel percorso ``kepler-kit-main/iot``.

#. Clicca sul pulsante **Esegui script corrente** o premi F5 per eseguirlo.

    .. image:: img/5_calling_system2.png

#. Torna su |link_hivemq| e quando premi uno dei pulsanti sulla breadboard, potrai vedere il messaggio su HiveMQ.

    .. image:: img/mqtt-4.png
  

#. Se desideri che questo script si avvii automaticamente, puoi salvarlo nel Raspberry Pi Pico W come ``main.py``.

**Come funziona?**

Il Raspberry Pi Pico W deve essere connesso a Internet, come descritto in :ref:`iot_access`. Per questo progetto, utilizza questa funzione.

.. code-block:: python

    from do_connect import *
    do_connect()

Inizializza 4 pin per i pulsanti.

.. code-block:: python

    sensor1 = Pin(16, Pin.IN)
    sensor2 = Pin(17, Pin.IN)
    sensor3 = Pin(18, Pin.IN)
    sensor4 = Pin(19, Pin.IN)

Crea due variabili per memorizzare l'``URL`` e l'``client ID`` del broker MQTT che utilizzeremo per connetterci.
Poiché stiamo utilizzando un broker pubblico, il nostro ``client ID`` non verrà utilizzato, anche se richiesto.

.. code-block:: python

    mqtt_server = 'broker.hivemq.com'
    client_id = 'Jimmy'

Connettiti all'agente MQTT e mantieni la connessione per un'ora. In caso di errore, resetta il Pico W.

.. code-block:: python

    try:
        client = MQTTClient(client_id, mqtt_server, keepalive=3600)
        client.connect()
        print('Connected to %s MQTT Broker'%(mqtt_server))
    except OSError as e:
        print('Failed to connect to the MQTT Broker. Reconnecting...')
        time.sleep(5)
        machine.reset()

Crea una variabile ``topic``, che è l'argomento che il sottoscrittore deve seguire. Dovrebbe essere lo stesso argomento inserito nel **passo 4** di **2. Visita HiveMQ** sopra.
Tra l'altro, ``b`` qui converte la stringa in byte, poiché MQTT è un protocollo basato su byte binari e non su stringhe di testo.

.. code-block:: python

    topic = b'SunFounder MQTT Test'

Imposta le interruzioni per ogni pulsante. Quando un pulsante viene premuto, viene pubblicato un messaggio sotto ``topic``.

.. code-block:: python

    def press1(pin):
        message = b'button 1 is pressed'
        client.publish(topic, message)
        print(message)

    sensor1.irq(trigger=machine.Pin.IRQ_RISING, handler=press1)


* `UMQTT Client API  <https://pypi.org/project/micropython-umqtt.simple/>`_



.. https://www.tomshardware.com/how-to/send-and-receive-data-raspberry-pi-pico-w-mqtt