

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Demo di autenticazione reciproca CoreMQTT
<a name="mqtt-demo-ma"></a>

**Importante**  <a name="deprecation-message-demo"></a>
Questa demo è ospitata nel Amazon-FreeRTOS repository che è obsoleto. Ti consigliamo di [iniziare da qui](freertos-getting-started-modular.md) quando crei un nuovo progetto. Se hai già un progetto FreerTOS esistente basato sul repository ora obsoleto, Amazon-FreeRTOS consulta il. [Amazon-FreeRTOS Guida alla migrazione del repository Github](github-repo-migration.md)

## Introduzione
<a name="mqtt-demo-ma-introduction"></a>

Il progetto dimostrativo di autenticazione reciproca CoreMQTT mostra come stabilire una connessione a un broker MQTT utilizzando TLS con autenticazione reciproca tra il client e il server. [Questa demo utilizza un'implementazione dell'interfaccia di TLS-based trasporto mbed per stabilire una connessione TLS autenticata dal server e dal client e dimostra il flusso di lavoro di sottoscrizione e pubblicazione di MQTT a livello di QoS 1.](http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/errata01/os/mqtt-v3.1.1-errata01-os-complete.html#_Toc442180914) Si iscrive a un filtro per argomenti, quindi pubblica gli argomenti che corrispondono al filtro e attende la ricezione di tali messaggi dal server a livello QoS 1. Questo ciclo di pubblicazione sul broker e ricezione dello stesso messaggio dal broker si ripete all'infinito. I messaggi in questa demo vengono inviati con QoS 1, che garantisce almeno una consegna secondo le specifiche MQTT.

**Nota**  
Per configurare ed eseguire le demo di FreerTOS, segui i passaggi indicati. [Inizia con FreerTOS](freertos-getting-started.md)

## Codice sorgente
<a name="mqtt-demo-ma-source-code"></a>

Il file sorgente della demo è denominato `mqtt_demo_mutual_auth.c` e può essere trovato nella `{{freertos}}/demos/coreMQTT/` directory e nel sito Web. [ GitHub](https://github.com/aws/amazon-freertos/blob/main/demos/coreMQTT/mqtt_demo_mutual_auth.c)

## Funzionalità
<a name="mqtt-demo-ma-functionality"></a>

La demo crea una singola attività applicativa che ripercorre una serie di esempi che dimostrano come connettersi al broker, iscriversi a un argomento sul broker, pubblicare un argomento sul broker e infine disconnettersi dal broker. L'applicazione demo sottoscrive e pubblica lo stesso argomento. Ogni volta che la demo pubblica un messaggio al broker MQTT, il broker invia lo stesso messaggio all'applicazione demo.

Un completamento con successo della demo genererà un output simile all'immagine seguente.

![Uscita del terminale dimostrativo MQTT in caso di completamento con successo](http://docs.aws.amazon.com/it_it/freertos/latest/userguide/images/coremqtt-mad-output.png)


La AWS IoT console genererà un output simile all'immagine seguente.

![Output della console demo MQTT in caso di completamento con successo](http://docs.aws.amazon.com/it_it/freertos/latest/userguide/images/coremqtt-mad-console.png)


## Riprova la logica con backoff e jitter esponenziali
<a name="mqtt-demo-ma-retry-logic"></a>

La BackoffForRetry funzione [prv](https://github.com/aws/amazon-freertos/blob/main/demos/coreMQTT/mqtt_demo_mutual_auth.c#L671-L717) mostra come le operazioni di rete non riuscite con il server, ad esempio connessioni TLS o richieste di sottoscrizione MQTT, possono essere ritentate con backoff e jitter esponenziali. La funzione calcola il periodo di backoff per il prossimo tentativo ed esegue il ritardo del backoff se i tentativi non sono stati esauriti. Poiché il calcolo del periodo di backoff richiede la generazione di un numero casuale, la funzione utilizza il modulo PKCS11 per generare il numero casuale. L'uso del modulo PKCS11 consente l'accesso a un True Random Number Generator (TRNG) se la piattaforma del fornitore lo supporta. Si consiglia di assegnare al generatore di numeri casuali una fonte di entropia specifica del dispositivo in modo da ridurre la probabilità di collisioni tra i dispositivi durante i tentativi di connessione.

## Connessione al broker MQTT
<a name="mqtt-demo-ma-connecting"></a>

La ConnectToServerWithBackoffRetries funzione [prv](https://github.com/aws/amazon-freertos/blob/main/demos/coreMQTT/mqtt_demo_mutual_auth.c#L721-L782) tenta di stabilire una connessione TLS con autenticazione reciproca al broker MQTT. Se la connessione fallisce, riprova dopo un periodo di backoff. Il periodo di backoff aumenterà esponenzialmente fino al raggiungimento del numero massimo di tentativi o al raggiungimento del periodo massimo di backoff. La `BackoffAlgorithm_GetNextBackoff` funzione fornisce un valore di backoff che aumenta esponenzialmente e ritorna `RetryUtilsRetriesExhausted` quando è stato raggiunto il numero massimo di tentativi. La `prvConnectToServerWithBackoffRetries` funzione restituisce uno stato di errore se la connessione TLS al broker non può essere stabilita dopo il numero di tentativi configurato.

La CreateMQTTConnectionWithBroker funzione [prv](https://github.com/aws/amazon-freertos/blob/main/demos/coreMQTT/mqtt_demo_mutual_auth.c#L785-L848) dimostra come stabilire una connessione MQTT a un broker MQTT con una sessione pulita. Utilizza l'interfaccia di trasporto TLS, implementata nel file. `FreeRTOS-Plus/Source/Application-Protocols/platform/freertos/transport/src/tls_freertos.c` Tieni presente che stiamo impostando i secondi di mantenimento in vita per il broker. `xConnectInfo`

La funzione successiva mostra come l'interfaccia di trasporto TLS e la funzione time sono impostate in un contesto MQTT utilizzando la funzione. `MQTT_Init` Mostra anche come viene impostata una funzione di callback di eventi pointer ()`prvEventCallback`. Questo callback viene utilizzato per segnalare i messaggi in arrivo.

## Iscrizione a un argomento MQTT
<a name="mqtt-demo-ma-subscribing"></a>

La MQTTSubscribeWithBackoffRetries funzione [prv](https://github.com/aws/amazon-freertos/blob/main/demos/coreMQTT/mqtt_demo_mutual_auth.c#L871-L969) dimostra come sottoscrivere un filtro per argomenti sul broker MQTT. L'esempio dimostra come sottoscrivere un filtro di argomento, ma è possibile passare un elenco di filtri di argomento nella stessa chiamata API di sottoscrizione per sottoscrivere più di un filtro di argomento. Inoltre, nel caso in cui il broker MQTT rifiuti la richiesta di abbonamento, l'abbonamento riproverà, con un backoff esponenziale, per. `RETRY_MAX_ATTEMPTS`

## Pubblicazione in un argomento
<a name="mqtt-demo-ma-publishing"></a>

La MQTTPublishToTopic funzione [prv](https://github.com/aws/amazon-freertos/blob/main/demos/coreMQTT/mqtt_demo_mutual_auth.c#L972-L1004) dimostra come pubblicare su un argomento sul broker MQTT. 

## Ricezione di messaggi in arrivo
<a name="mqtt-demo-ma-receiving"></a>

L'applicazione registra una funzione di callback degli eventi prima di connettersi al broker, come descritto in precedenza. La `prvMQTTDemoTask` funzione chiama la `MQTT_ProcessLoop` funzione per ricevere i messaggi in arrivo. Quando viene ricevuto un messaggio MQTT in arrivo, richiama la funzione di callback degli eventi registrata dall'applicazione. La funzione [prv](https://github.com/aws/amazon-freertos/blob/main/demos/coreMQTT/mqtt_demo_mutual_auth.c#L1139-L1154) è un esempio di tale EventCallback funzione di callback degli eventi. `prvEventCallback`esamina il tipo di pacchetto in entrata e chiama il gestore appropriato. Nell'esempio seguente, la funzione richiede la gestione dei messaggi `prvMQTTProcessIncomingPublish()` di pubblicazione in entrata o la gestione dei riconoscimenti (`prvMQTTProcessResponse()`ACK).

## Elaborazione dei pacchetti di pubblicazione MQTT in entrata
<a name="mqtt-demo-ma-processing"></a>

La MQTTProcessIncomingPublish funzione [prv](https://github.com/aws/amazon-freertos/blob/main/demos/coreMQTT/mqtt_demo_mutual_auth.c#L1108-L1135) dimostra come elaborare un pacchetto di pubblicazione dal broker MQTT. 

## Annullamento dell'iscrizione a un argomento
<a name="mqtt-demo-ma-unsubscribing"></a>

L'ultimo passaggio del flusso di lavoro consiste nell'annullare l'iscrizione all'argomento in modo che il broker non invii alcun messaggio pubblicato da. `mqttexampleTOPIC` Ecco la definizione della funzione [MQTTUnsubscribeFromTopicprv](https://github.com/aws/amazon-freertos/blob/main/demos/coreMQTT/mqtt_demo_mutual_auth.c#L1007-L1043).

## Modifica della CA principale utilizzata nella demo
<a name="mqtt-demo-ma-root-ca"></a>

Per impostazione predefinita, le demo FreerTOS utilizzano il certificato Amazon Root CA 1 (chiave RSA 2048 bit) per l'autenticazione con il server. AWS IoT Core È possibile utilizzare altri [certificati CA per l'autenticazione del server](https://docs.aws.amazon.com/iot/latest/developerguide/server-authentication.html#server-authentication-certs), incluso il certificato Amazon Root CA 3 (chiave ECC a 256 bit). Per modificare la CA principale per la demo di autenticazione reciproca CoreMQTT: 

1. In un editor di testo, aprire il file `{{freertos}}/vendors/{{vendor}}/boards/{{board}}/aws_demos/config_files/mqtt_demo_mutual_auth_config.h`.

1. Nel file, individuate la riga seguente.

   ```
    * #define democonfigROOT_CA_PEM    "...insert here..." 
   ```

   Decommenta questa riga e, se necessario, spostala oltre la fine ` */` del blocco dei commenti.

1. Copia il certificato CA che desideri utilizzare e incollalo nel `"...insert here..."` testo. Il risultato sarà simile al seguente esempio:

   ```
   #define democonfigROOT_CA_PEM   "-----BEGIN CERTIFICATE-----\n"\
   "MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5\n"\
   "MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g\n"\
   "Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG\n"\
   "A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg\n"\
   "Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl\n"\
   "ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j\n"\
   "QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr\n"\
   "ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr\n"\
   "BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM\n"\
   "YyRIHN8wfdVoOw==\n"\
   "-----END CERTIFICATE-----\n"
   ```

1. (Facoltativo) È possibile modificare la CA principale per altre demo. Ripetere i passaggi da 1 a 3 per ogni `{{freertos}}/vendors/{{vendor}}/boards/{{board}}/aws_demos/config_files/{{demo-name}}_config.h` file.