Tutorial: esegui aggiornamenti OTA su Espressif ESP32 utilizzando FreeRTOS Bluetooth Low Energy - Gratuito RTOS

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à.

Tutorial: esegui aggiornamenti OTA su Espressif ESP32 utilizzando FreeRTOS Bluetooth Low Energy

Importante

Questa integrazione di riferimento è ospitata nel repository Amazon-FreeRTOS che è obsoleto. Consigliamo di iniziare da qui quando crei un nuovo progetto. Se disponi già di un progetto FreeRTOS esistente basato sull'ormai obsoleto repository Amazon-FreeRTOS, consulta ilGuida alla migrazione del RTOS repository Github gratuito da Amazon.

Questo tutorial mostra come aggiornare un microcontrollore Espressif ESP32 collegato a un proxy MQTT Bluetooth Low Energy su un dispositivo Android. Aggiorna il dispositivo utilizzando i processi di aggiornamentoAWS IoT Over-the-air (OTA). Il dispositivo si connetteAWS IoT utilizzando le credenziali Amazon Cognito inserite nell'app demo Android. Un operatore autorizzato avvia l'aggiornamento OTA dal cloud. Quando il dispositivo si connette tramite l'app demo Android, viene avviato l'aggiornamento OTA e il firmware viene aggiornato sul dispositivo.

Le versioni FreeRTOS 2019.06.00 Major e successive includono il supporto proxy Bluetooth Low Energy MQTT che può essere utilizzato per il provisioning Wi-Fi e le connessioni sicure aiAWS IoT servizi. Utilizzando la funzione Bluetooth Low Energy, puoi creare dispositivi a basso consumo che possono essere accoppiati a un dispositivo mobile per la connettività senza richiedere il Wi-Fi. I dispositivi possono comunicare utilizzando MQTT connettendosi tramite SDK Bluetooth Low Energy Android o iOS che utilizzano profili di accesso generici (GAP) e attributi generici (GATT).

Ecco i passaggi che seguiremo per consentire gli aggiornamenti OTA tramite Bluetooth Low Energy:

  1. Configurazione dello storage: crea un bucket e delle politiche Amazon S3 e configura un utente in grado di eseguire gli aggiornamenti.

  2. Crea un certificato di firma del codice: crea un certificato di firma e consenti all'utente di firmare gli aggiornamenti del firmware.

  3. Configura l'autenticazione Amazon Cognito: crea un provider di credenziali, un pool di utenti e l'accesso dell'applicazione al pool di utenti.

  4. Configura FreeRTOS: configura Bluetooth Low Energy, le credenziali del client e il certificato pubblico di firma del codice.

  5. Configura un'app Android: configura il provider di credenziali, il pool di utenti e distribuisci l'applicazione su un dispositivo Android.

  6. Esegui lo script di aggiornamento OTA: per avviare un aggiornamento OTA, usa lo script di aggiornamento OTA.

Per ulteriori informazioni sul funzionamento degli aggiornamenti, consultareRTOS Over-the-AirAggiornamenti gratuiti. Per ulteriori informazioni su come configurare la funzionalità proxy Bluetooth Low Energy MQTT, consulta il post Utilizzo di Bluetooth Low Energy con FreeRTOS su Espressif ESP32 di Richard Kang.

Prerequisiti

Per eseguire queste fasi in questo tutorial, hai bisogno di:

  • Una scheda di sviluppo ESP32.

  • Un cavo da microUSB a USB A.

  • UnAWS account (il piano gratuito è sufficiente).

  • Un telefono Android con Android v 6.0 o successivo e Bluetooth versione 4.2 o successiva.

Sul tuo computer di sviluppo hai bisogno di:

I passaggi di questo tutorial presuppongono che la toolchain Xtensa, ESP-IDF e il codice FreeRTOS siano installati nella/esp directory della home directory. È necessario aggiungere~/esp/xtensa-esp32-elf/bin alla$PATH variabile.

Fase 1: configurare l'archiviazione

  1. Crea un bucket Amazon S3 per archiviare l'aggiornamentocon il controllo delle versioni abilitato per contenere le immagini del firmware.

  2. Crea un ruolo del servizio di OTA aggiornamentoe aggiungere le policy gestite seguenti al ruolo:

    • AWSIotLogging

    • AWSIotRuleActions

    • AWSIotThingsRegistration

    • AWSFreeRTOSOTAUpdate

  3. Crea un utente in grado di eseguire aggiornamenti OTA. Questo utente può firmare e distribuire gli aggiornamenti del firmware per i dispositivi IoT nell'account e ha accesso agli aggiornamenti OTA su tutti i dispositivi. L'accesso deve essere limitato a entità attendibili.

  4. Segui i passaggi perCrea una politica per gli OTA utenti collegarlo al tuo utente.

Fase 2: Creazione del certificato di firma del codice

  1. Crea un bucket Amazon S3 con il controllo delle versioni abilitato per contenere le immagini del firmware.

  2. Crea un certificato di firma del codice che può essere utilizzato per firmare il firmware. Nota il certificato Amazon Resource Name (ARN) al momento dell'importazione.

    aws acm import-certificate --profile=ota-update-user --certificate file://ecdsasigner.crt --private-key file://ecdsasigner.key

    Output di esempio:

    { "CertificateArn": "arn:aws:acm:us-east-1:<account>:certificate/<certid>" }

    Utilizzerai l'ARN in seguito per creare un profilo di firma. Se lo desideri, puoi creare il profilo ora con il seguente comando:

    aws signer put-signing-profile --profile=ota-update-user --profile-name esp32Profile --signing-material certificateArn=arn:aws:acm:us-east-1:account:certificate/certid --platform AmazonFreeRTOS-Default --signing-parameters certname=/cert.pem

    Output di esempio:

    { "arn": "arn:aws:signer::<account>:/signing-profiles/esp32Profile" }

Fase 3: configurazione dell'autenticazione Amazon Cognito

Creazione di una policy AWS IoT
  1. Accedi alla console AWS IoT.

  2. Nell'angolo superiore destro della console, scegliere Il mio account. In Impostazioni dell'account, annota l'ID account di 12 cifre.

  3. Nel riquadro di navigazione a sinistra scegliere Impostazioni. Nell'endpoint dei dati del dispositivo, prendi nota del valore dell'endpoint. L'endpoint dovrebbe essere similexxxxxxxxxxxxxx.iot.us-west-2.amazonaws.com. In questo esempio, laAWS regione è «us-west-2".

  4. Nel riquadro di navigazione a sinistra, scegli Sicuro, scegli Criteri e quindi scegli Crea. Se non hai alcuna politica nel tuo account, vedrai il messaggio «Non hai ancora alcuna politica» e puoi scegliere Crea una politica.

  5. Inserisci un nome per la tua politica, ad esempio «esp32_mqtt_proxy_iot_policy».

  6. Nella sezione Add statements (Aggiungi istruzioni), scegliere Advanced mode (Modalità avanzata). Copiare e incollare il seguente JSON nella finestra dell'editor policy. Sostituisciloaws-account-id con l'ID del tuo account eaws-region con la tua regione (ad esempio, «us-west-2").

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iot:Connect", "Resource": "arn:aws:iot:aws-region:aws-account-id:*" }, { "Effect": "Allow", "Action": "iot:Publish", "Resource": "arn:aws:iot:aws-region:aws-account-id:*" }, { "Effect": "Allow", "Action": "iot:Subscribe", "Resource": "arn:aws:iot:aws-region:aws-account-id:*" }, { "Effect": "Allow", "Action": "iot:Receive", "Resource": "arn:aws:iot:aws-region:aws-account-id:*" } ] }
  7. Seleziona Create (Crea).

Crea qualsiasiAWS IoT cosa
  1. Accedi alla console AWS IoT.

  2. Nel riquadro di navigazione a sinistra nel pannello di controllo scegliere Manage (Gestisci), quindi Things (Oggetti).

  3. Nell'angolo in alto a destra, scegli Crea. Se non hai nessun elemento registrato nel tuo account, viene visualizzato il messaggio «Non hai ancora nulla» e puoi scegliere Registra un oggetto.

  4. Nella pagina Creazione oggetti AWS IoT, scegliere Crea un oggetto singolo.

  5. Nella pagina Aggiungi il tuo dispositivo al registro degli oggetti, inserisci un nome per il tuo oggetto (ad esempio, «esp32-ble»). Sono consentiti solo A-Z, «_» (trattino basso) e «-» (trattino). Seleziona Successivo.

  6. Nella pagina Aggiungi un certificato per il tuo oggetto, in Ignora certificato e crea oggetto, scegli Crea oggetto senza certificato. Poiché utilizziamo l'app mobile proxy BLE che utilizza una credenziale Amazon Cognito per l'autenticazione e l'autorizzazione, non è richiesto alcun certificato del dispositivo.

Crea un client Amazon Cognito App
  1. Accedi alla console Amazon Cognito.

  2. Nel banner di navigazione in alto a destra, scegli Crea un pool di utenti.

  3. Immettete il nome del pool (ad esempio, «esp32_mqtt_proxy_user_pool»).

  4. Scegli Review defaults (Esamina impostazioni predefinite).

  5. In App Client, scegli Aggiungi app client, quindi scegli Aggiungi un client per app.

  6. Inserisci il nome del client dell'app (ad esempio «mqtt_app_client»).

  7. Assicurati che sia selezionata l'opzione Genera segreto del cliente.

  8. Scegli Create app client (Crea client dell'app).

  9. Scegli Return to pool details (Torna ai dettagli del pool).

  10. Nella pagina Revisione del pool di utenti, scegli Crea pool. Dovresti visualizzare un messaggio che dice «Il pool di utenti è stato creato correttamente» (trattino basso). Prendi nota dell'ID del pool.

  11. Nel riquadro di navigazione, scegliere Client per app.

  12. Scegli Mostra dettagli. Prendi nota dell'ID del client dell'app e del segreto del client dell'app.

Creazione di un pool di identità in Amazon Cognito
  1. Accedi alla console Amazon Cognito.

  2. Scegli Create new identity pool (Crea un nuovo pool di identità).

  3. Immettete un nome per il pool di identità (ad esempio, «mqtt_proxy_identity_pool»).

  4. Espandi i provider di autenticazione.

  5. Scegli la scheda Cognito.

  6. Inserisci l'ID del pool di utenti e l'ID del client dell'app che hai annotato nei passaggi precedenti.

  7. Seleziona Create Pool (Crea pool).

  8. Nella pagina successiva, per creare nuovi ruoli per identità autenticate e non autenticate, scegli Consenti.

  9. Prendi nota dell'ID del pool di identità, che è nel formatous-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.

Collegamento di una policy IAM all'identità autenticata
  1. Apri la console Amazon Cognito.

  2. Seleziona il pool di identità che hai appena creato (ad esempio, «mqtt_proxy_identity_pool»).

  3. Scegli Modifica pool di identità.

  4. Prendi nota del ruolo IAM assegnato al ruolo autenticato (ad esempio, «COGNITO_MQTT_PROXY_IDENTITY_POOLAUTH_ROLE»).

  5. Aprire la console IAM.

  6. Nel pannello di navigazione, selezionare Ruoli.

  7. Cerca il ruolo assegnato (ad esempio, «COGNITO_MQTT_PROXY_IDENTITY_POOLAUTH_ROLE»), quindi selezionalo.

  8. Scegli Aggiungi policy in linea, quindi scegli JSON.

  9. Immettere la seguente policy:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:AttachPolicy", "iot:AttachPrincipalPolicy", "iot:Connect", "iot:Publish", "iot:Subscribe" ], "Resource": "*" }] }
  10. Scegliere Review policy (Esamina policy).

  11. Immettere un nome di policy (ad esempio, "-mqttProxyCognito trattino basso).

  12. Scegli Create Policy (Crea policy).

Fase 4: configurare Amazon FreeRTOS

  1. Scarica la versione più recente del codice Amazon FreeRTOS dal GitHub repository FreeRTOS.

  2. Per abilitare la demo di aggiornamento OTA, segui i passaggi indicatiGuida introduttiva all'Espressif ESP32 - DevKit C e al ESP-WROVER-KIT.

  3. Apporta queste modifiche aggiuntive nei seguenti file:

    1. Aprivendors/espressif/boards/esp32/aws_demos/config_files/aws_demo_config.h e definisciCONFIG_OTA_UPDATE_DEMO_ENABLED.

    2. Aprivendors/espressif/boards/esp32/aws_demos/common/config_files/aws_demo_config.h e cambiademoconfigNETWORK_TYPES inAWSIOT_NETWORK_TYPE_BLE.

    3. Apridemos/include/aws_clientcredential.h e inserisci l'URL dell'endpoint perclientcredentialMQTT_BROKER_ENDPOINT.

      Inserisci il nome dell'oggetto perclientcredentialIOT_THING_NAME (ad esempio, «esp32-ble»). Non è necessario aggiungere certificati quando si utilizzano le credenziali Amazon Cognito.

    4. Aprivendors/espressif/boards/esp32/aws_demos/config_files/aws_iot_network_config.h e modificaconfigSUPPORTED_NETWORKS e soloconfigENABLED_NETWORKS da includereAWSIOT_NETWORK_TYPE_BLE.

    5. Apri ilvendors/vendor/boards/board/aws_demos/config_files/ota_demo_config.h file e inserisci il tuo certificato.

      #define otapalconfigCODE_SIGNING_CERTIFICATE [] = "your-certificate-key";

    L'applicazione dovrebbe avviarsi e stampare la versione demo:

    11 13498 [iot_thread] [INFO ][DEMO][134980] Successfully initialized the demo. Network type for the demo: 2 12 13498 [iot_thread] [INFO ][MQTT][134980] MQTT library successfully initialized. 13 13498 [iot_thread] OTA demo version 0.9.20 14 13498 [iot_thread] Creating MQTT Client...

Fase 5: configurare un'app per Android

  1. Scarica l'SDK Android Bluetooth Low Energy e un'app di esempio dal GitHub repository amazon-freertos-ble-android-sdk.

  2. Apri il fileapp/src/main/res/raw/awsconfiguration.json e inserisci l'ID del pool AppClientId, la regione e AppClientSecret utilizzando le istruzioni nel seguente esempio JSON.

    { "UserAgent": "MobileHub/1.0", "Version": "1.0", "CredentialsProvider": { "CognitoIdentity": { "Default": { "PoolId": "Cognito->Manage Identity Pools->Federated Identities->mqtt_proxy_identity_pool->Edit Identity Pool->Identity Pool ID", "Region": "Your region (for example us-east-1)" } } }, "IdentityManager": { "Default": {} }, "CognitoUserPool": { "Default": { "PoolId": "Cognito-> Manage User Pools -> esp32_mqtt_proxy_user_pool -> General Settings -> PoolId", "AppClientId": "Cognito-> Manage User Pools -> esp32_mqtt_proxy_user_pool -> General Settings -> App clients ->Show Details", "AppClientSecret": "Cognito-> Manage User Pools -> esp32_mqtt_proxy_user_pool -> General Settings -> App clients ->Show Details", "Region": "Your region (for example us-east-1)" } } }
  3. Apriapp/src/main/java/software/amazon/freertos/DemoConstants.java e inserisci il nome della policy che hai creato in precedenza (ad esempio, esp32_mqtt_proxy_iot_policy) e anche la regione (ad esempio, us-east-1).

  4. Crea e installa l'app demo.

    1. In Android Studio, scegli Build, quindi l'app Make Module.

    2. Scegli Esegui, quindi Esegui app. Puoi accedere al riquadro della finestra logcat in Android Studio per monitorare i messaggi di registro.

    3. Sul dispositivo Android, crea un account dalla schermata di accesso.

    4. Creare un utente. Se esiste già un utente, inserisci le credenziali.

    5. Consenti alla demo Amazon FreeRTOS di accedere alla posizione del dispositivo.

    6. Cerca dispositivi Bluetooth Low Energy.

    7. Sposta il cursore del dispositivo trovato su Attivato.

    8. Premere y sulla console di debug della porta seriale per l'ESP32.

    9. Scegli Pair & Connect.

  5. Quanto più... il collegamento diventa attivo dopo aver stabilito la connessione. Lo stato della connessione dovrebbe cambiare in «BLE_CONNECTED» nel logcat del dispositivo Android quando la connessione è completa:

    2019-06-06 20:11:32.160 23484-23497/software.amazon.freertos.demo I/FRD: BLE connection state changed: 0; new state: BLE_CONNECTED
  6. Prima che i messaggi possano essere trasmessi, il dispositivo Amazon FreeRTOS e il dispositivo Android negoziano l'MTU. Dovresti vedere il seguente output in logcat:

    2019-06-06 20:11:46.720 23484-23497/software.amazon.freertos.demo I/FRD: onMTUChanged : 512 status: Success
  7. Il dispositivo si connette all'app e inizia a inviare messaggi MQTT utilizzando il proxy MQTT. Per confermare che il dispositivo è in grado di comunicare, assicurati che il valore dei dati caratteristici MQTT_CONTROL cambi a 01:

    2019-06-06 20:12:28.752 23484-23496/software.amazon.freertos.demo D/FRD: <-<-<- Writing to characteristic: MQTT_CONTROL with data: 01 2019-06-06 20:12:28.839 23484-23496/software.amazon.freertos.demo D/FRD: onCharacteristicWrite for: MQTT_CONTROL; status: Success; value: 01
  8. Quando i dispositivi sono associati, verrà visualizzato un messaggio sulla console ESP32. Per abilitare BLE, premere y. La demo non funzionerà finché non esegui questo passaggio.

    E (135538) BT_GATT: GATT_INSUF_AUTHENTICATION: MITM Required W (135638) BT_L2CAP: l2cble_start_conn_update, the last connection update command still pending. E (135908) BT_SMP: Value for numeric comparison = 391840 15 13588 [InputTask] Numeric comparison:391840 16 13589 [InputTask] Press 'y' to confirm 17 14078 [InputTask] Key accepted W (146348) BT_SMP: FOR LE SC LTK IS USED INSTEAD OF STK 18 16298 [iot_thread] Connecting to broker... 19 16298 [iot_thread] [INFO ][MQTT][162980] Establishing new MQTT connection. 20 16298 [iot_thread] [INFO ][MQTT][162980] (MQTT connection 0x3ffd5754, CONNECT operation 0x3ffd586c) Waiting for operation completion. 21 16446 [iot_thread] [INFO ][MQTT][164450] (MQTT connection 0x3ffd5754, CONNECT operation 0x3ffd586c) Wait complete with result SUCCESS. 22 16446 [iot_thread] [INFO ][MQTT][164460] New MQTT connection 0x3ffc0ccc established. 23 16446 [iot_thread] Connected to broker.

Fase 6: eseguire lo script di aggiornamento OTA

  1. Per installare i prerequisiti, esegui questi comandi:

    pip3 install boto3
    pip3 install pathlib
  2. Incrementa la versione dell'applicazione FreeRTOS indemos/include/aws_application_version.h.

  3. Crea un nuovo file.bin.

  4. Scarica lo script python start_ota.py. Per visualizzare il contenuto della guida per lo script, esegui il comando seguente in una finestra del terminale:

    python3 start_ota.py -h

    Viene visualizzato quanto segue:

    usage: start_ota.py [-h] --profile PROFILE [--region REGION] [--account ACCOUNT] [--devicetype DEVICETYPE] --name NAME --role ROLE --s3bucket S3BUCKET --otasigningprofile OTASIGNINGPROFILE --signingcertificateid SIGNINGCERTIFICATEID [--codelocation CODELOCATION] Script to start OTA update optional arguments: -h, --help show this help message and exit --profile PROFILE Profile name created using aws configure --region REGION Region --account ACCOUNT Account ID --devicetype DEVICETYPE thing|group --name NAME Name of thing/group --role ROLE Role for OTA updates --s3bucket S3BUCKET S3 bucket to store firmware updates --otasigningprofile OTASIGNINGPROFILE Signing profile to be created or used --signingcertificateid SIGNINGCERTIFICATEID certificate id (not arn) to be used --codelocation CODELOCATION base folder location (can be relative)
  5. Se hai utilizzato ilAWS CloudFormation modello fornito per creare risorse, esegui il comando seguente:

    python3 start_ota_stream.py --profile otausercf --name esp32-ble --role ota_ble_iot_role-sample --s3bucket afr-ble-ota-update-bucket-sample --otasigningprofile abcd --signingcertificateid certificateid

    Dovresti vedere l'avvio dell'aggiornamento nella console di debug ESP32:

    38 2462 [OTA Task] [prvParseJobDoc] Job was accepted. Attempting to start transfer. --- 49 2867 [OTA Task] [prvIngestDataBlock] Received file block 1, size 1024 50 2867 [OTA Task] [prvIngestDataBlock] Remaining: 1290 51 2894 [OTA Task] [prvIngestDataBlock] Received file block 2, size 1024 52 2894 [OTA Task] [prvIngestDataBlock] Remaining: 1289 53 2921 [OTA Task] [prvIngestDataBlock] Received file block 3, size 1024 54 2921 [OTA Task] [prvIngestDataBlock] Remaining: 1288 55 2952 [OTA Task] [prvIngestDataBlock] Received file block 4, size 1024 56 2953 [OTA Task] [prvIngestDataBlock] Remaining: 1287 57 2959 [iot_thread] State: Active Received: 5 Queued: 5 Processed: 5 Dropped: 0
  6. Quando l'aggiornamento OTA è completo, il dispositivo si riavvia come richiesto dal processo di aggiornamento OTA. Quindi tenta di connettersi utilizzando il firmware aggiornato. Se l'aggiornamento è riuscito, il firmware aggiornato viene contrassegnato come attivo e dovresti vedere la versione aggiornata nella console:

    13 13498 [iot_thread] OTA demo version 0.9.21