Come faccio a pubblicare messaggi MQTT su AWS IoT Core dal mio dispositivo quando uso Python?

8 minuti di lettura
0

Non riesco a inviare o ricevere messaggi MQTT (MQ Telemetry Transport) tra AWS IoT Core e il mio dispositivo o client MQTT. Come faccio a pubblicare messaggi MQTT su AWS IoT Core?

Breve descrizione

Verifica che il tuo oggetto AWS IoT sia configurato correttamente e che i relativi certificati siano collegati correttamente. Per testare la configurazione, puoi utilizzare il client AWS IoT MQTT e il codice Python di esempio fornito in questo articolo.

Risoluzione

Configura una directory per testare la pubblicazione MQTT

1.    Crea una directory di lavoro nel tuo ambiente di sviluppo. Ad esempio: iot-test-publish.

2.    Crea una sottodirectory per i certificati nella tua nuova directory di lavoro. Ad esempio: certificati.

3.    Dalla linea di comando, cambia la directory nella tua nuova directory di lavoro.

Installa pip e l'SDK AWS IoT per Python

1.    Se non l'hai già fatto, installa pip for Python 3 packaging. Per ulteriori informazioni, vedi Installation sul sito web Python Packaging Authority (PyPA).

2.    Installa l'SDK AWS IoT per Python v2 eseguendo quanto segue dalla linea di comando:

pip install awsiotsdk

-oppure-

Installa l'AWS IoT Device SDK for Python (la versione precedente dell'SDK) eseguendo il seguente comando:

pip install AWSIoTPythonSDK

Per ulteriori informazioni, consulta AWS IoT SDK for Python v2 o AWS IoT Device SDK for Python su GitHub.

Nota: questi SDK sono consigliati per la connessione ad AWS IoT Core, ma non sono obbligatori. Puoi anche connetterti utilizzando qualsiasi client MQTT di terze parti conforme.

Crea una policy AWS IoT Core

1.    Apri la console AWS IoT Core.

2.    Nel riquadro di navigazione a sinistra, scegli Sicuro.

3.    In Sicuro, scegli Policy.

4.    Se disponi di policy AWS IoT Core esistenti, scegli Crea per creare una nuova policy.
-oppure-
Se non disponi di alcuna policy esistente, nella pagina Non hai ancora policy, scegli Crea una policy.

5.    Nella pagina Crea una policy, inserisci un nome per la tua policy. Ad esempio: admin.

6.    In Aggiungi istruzioni, procedi come segue:
In Azione, inserisci iot:*.
Importante: consentire tutte le azioni AWS IoT (iot:*) è utile per i test. Tuttavia, in una configurazione di produzione è consigliabile aumentare la sicurezza. Per esempi di policy più sicuri, consulta Example AWS IoT policies.
In Risorsa ARN, immetti *.
IN Effetto, seleziona la casella di controllo Consenti.

7.    Scegli Crea.

Per ulteriori informazioni, consulta Create an AWS IoT Core policy e AWS IoT Core policies.

Crea un oggetto AWS IoT

Nota: non è necessario creare nulla per connettersi ad AWS IoT. Tuttavia, gli oggetti consentono di utilizzare controlli di sicurezza aggiuntivi e altre funzionalità di AWS IoT, come Indicizzazione del parco istanze, Processi o Device Shadow.

1.    Nella console AWS IoT Core, nel riquadro di navigazione a sinistra, scegli Gestisci.

2.    Se hai oggetti esistenti, scegli Crea per crearne uno nuovo
-oppure-
Se non disponi di elementi esistenti, nella pagina Non hai ancora oggetti, scegli Registrazione di un oggetto.

3.    Nella pagina Creazione oggetti AWS IoT, scegli Crea un oggetto singolo.

4.    Nella pagina Aggiungi il tuo dispositivo al registro degli oggetti, procedi come segue:
Inserisci un Nome per il tuo oggetto. Ad esempio: Oggetto di prova.
(Facoltativo) In Aggiunta di un tipo a questo oggetto, scegli o crea un tipo di oggetto.
(Facoltativo) In Aggiunta dell’oggetto a un gruppo, scegli o crea un gruppo. Per ulteriori informazioni sui gruppi, vedi Static thing groups e Dynamic thing groups.
(Facoltativo) In Impostazione degli attributi oggetto ricercabili (facoltativo), aggiungi gli attributi come coppie chiave-valore.
Scegli Successivo.

5.    Nella pagina Aggiungi un certificato per il tuo oggetto, scegli Crea certificato. Vengono visualizzate delle notifiche che confermano la creazione dell'oggetto e di un relativo certificato.

6.    Nella pagina Certificato creato, procedi come segue:
In Per connettere un dispositivo, devi scaricare quanto segue, scegli Scarica per il certificato, la chiave pubblica e la chiave privata.
Salva ciascuno dei file scaricati nella sottodirectory dei certificati creata in precedenza.
In Devi anche scaricare una CA root per AWS IoT, scegli Scarica. La pagina Autenticazione server si apre ai certificati CA per l'autenticazione del server.

7.    In Amazon Trust Services Endpoints (preferito), scegli Amazon Root CA 1. Il certificato viene aperto nel browser.

8.    Copia il certificato (tutto da**-----BEGIN CERTIFICATE-----** a -----END CERTIFICATE-----) e incollalo in un editor di testo.

9.    Salva il certificato come file .pem denominato root.pem nella sottodirectory dei certificati.

10.    Nella pagina Certificato creato nella console AWS IoT Core, scegli Attiva. Il pulsante diventa Disattiva.

11.    Scegli Collega una policy.

12.    Nella pagina Aggiungi una policy per il tuo oggetto, procedi come segue:
Seleziona la policy AWS IoT Core che hai creato in precedenza. Ad esempio: admin.
Scegli Registra l’oggetto.

Per ulteriori informazioni, vedi Create a thing object.

Copia l'URL dell'endpoint AWS IoT Core

1.    Nella console AWS IoT Core, nel riquadro di navigazione a sinistra, scegli Impostazioni.

2.    Nella pagina Impostazioni, in Endpoint personalizzato, copia l'endpoint. Questo URL endpoint personalizzato di AWS IoT Core è personale per il tuo account e la tua regione AWS.

Crea un file di programma Python

Salva uno dei seguenti esempi di codice Python come file di programma Python denominato publish.py.

Se in precedenza avevi installato l'SDK AWS IoT per Python v2, utilizza il seguente codice di esempio:

Importante: sostituisci customEndpointUrl con il tuo URL endpoint personalizzato AWS IoT Core. Sostituisci i certificati con il nome della sottodirectory dei certificati. Sostituisci a1b23cd45e-certificate.pem.crt con il nome del tuo client .crt. Sostituisci a1b23cd45e-private.pem.key con il nome della tua chiave privata.

# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: MIT-0

from awscrt import io, mqtt, auth, http
from awsiot import mqtt_connection_builder
import time as t
import json

# Define ENDPOINT, CLIENT_ID, PATH_TO_CERTIFICATE, PATH_TO_PRIVATE_KEY, PATH_TO_AMAZON_ROOT_CA_1, MESSAGE, TOPIC, and RANGE
ENDPOINT = "customEndpointUrl"
CLIENT_ID = "testDevice"
PATH_TO_CERTIFICATE = "certificates/a1b23cd45e-certificate.pem.crt"
PATH_TO_PRIVATE_KEY = "certificates/a1b23cd45e-private.pem.key"
PATH_TO_AMAZON_ROOT_CA_1 = "certificates/root.pem"
MESSAGE = "Hello World"
TOPIC = "test/testing"
RANGE = 20

# Spin up resources
event_loop_group = io.EventLoopGroup(1)
host_resolver = io.DefaultHostResolver(event_loop_group)
client_bootstrap = io.ClientBootstrap(event_loop_group, host_resolver)
mqtt_connection = mqtt_connection_builder.mtls_from_path(
            endpoint=ENDPOINT,
            cert_filepath=PATH_TO_CERTIFICATE,
            pri_key_filepath=PATH_TO_PRIVATE_KEY,
            client_bootstrap=client_bootstrap,
            ca_filepath=PATH_TO_AMAZON_ROOT_CA_1,
            client_id=CLIENT_ID,
            clean_session=False,
            keep_alive_secs=6
            )
print("Connecting to {} with client ID '{}'...".format(
        ENDPOINT, CLIENT_ID))
# Make the connect() call
connect_future = mqtt_connection.connect()
# Future.result() waits until a result is available
connect_future.result()
print("Connected!")
# Publish message to server desired number of times.
print('Begin Publish')
for i in range (RANGE):
    data = "{} [{}]".format(MESSAGE, i+1)
    message = {"message" : data}
    mqtt_connection.publish(topic=TOPIC, payload=json.dumps(message), qos=mqtt.QoS.AT_LEAST_ONCE)
    print("Published: '" + json.dumps(message) + "' to the topic: " + "'test/testing'")
    t.sleep(0.1)
print('Publish End')
disconnect_future = mqtt_connection.disconnect()
disconnect_future.result()

-oppure-

Se hai installato AWS IoT Device SDK for Python (la versione precedente dell'SDK), utilizza il seguente codice di esempio:

Importante: sostituisci customEndpointUrl con il tuo URL endpoint personalizzato AWS IoT Core. Sostituisci i certificati con il nome della sottodirectory dei certificati. Sostituisci a1b23cd45e-certificate.pem.crt con il nome del tuo client .crt. Sostituisci a1b23cd45e-private.pem.key con il nome della tua chiave privata.

# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: MIT-0

import time as t
import json
import AWSIoTPythonSDK.MQTTLib as AWSIoTPyMQTT

# Define ENDPOINT, CLIENT_ID, PATH_TO_CERTIFICATE, PATH_TO_PRIVATE_KEY, PATH_TO_AMAZON_ROOT_CA_1, MESSAGE, TOPIC, and RANGE
ENDPOINT = "customEndpointUrl"
CLIENT_ID = "testDevice"
PATH_TO_CERTIFICATE = "certificates/a1b23cd45e-certificate.pem.crt"
PATH_TO_PRIVATE_KEY = "certificates/a1b23cd45e-private.pem.key"
PATH_TO_AMAZON_ROOT_CA_1 = "certificates/root.pem"
MESSAGE = "Hello World"
TOPIC = "test/testing"
RANGE = 20

myAWSIoTMQTTClient = AWSIoTPyMQTT.AWSIoTMQTTClient(CLIENT_ID)
myAWSIoTMQTTClient.configureEndpoint(ENDPOINT, 8883)
myAWSIoTMQTTClient.configureCredentials(PATH_TO_AMAZON_ROOT_CA_1, PATH_TO_PRIVATE_KEY, PATH_TO_CERTIFICATE)

myAWSIoTMQTTClient.connect()
print('Begin Publish')
for i in range (RANGE):
    data = "{} [{}]".format(MESSAGE, i+1)
    message = {"message" : data}
    myAWSIoTMQTTClient.publish(TOPIC, json.dumps(message), 1)
    print("Published: '" + json.dumps(message) + "' to the topic: " + "'test/testing'")
    t.sleep(0.1)
print('Publish End')
myAWSIoTMQTTClient.disconnect()

Prova la configurazione

1.    Nella console AWS IoT Core, nel riquadro di navigazione a sinistra, scegli Test.

2.    Nella pagina client MQTT, in Argomento sottoscrizione, inserisci test/testing.

3.    Scegli Sottoscrizione all'argomento. Un argomento di test denominato test/testing è pronto per la pubblicazione del messaggio di test. Per ulteriori informazioni, consulta View device MQTT messages with the AWS IoT MQTT client.

4.    Esegui quanto segue dalla linea di comando:

python3 publish.py

Il programma Python pubblica 20 messaggi di test sull'argomento test/testing creato nella console AWS IoT Core. Visualizza l'argomento nella console per visualizzare i messaggi pubblicati.

Suggerimento: puoi anche testare altre funzionalità degli SDK, come la sottoscrizione e la connessione tramite WebSockets, utilizzando gli esempi pubsub inclusi. Per ulteriori informazioni, consulta pubsub (AWS IoT SDK for Python v2) o BasicPubSub (AWS IoT Device SDK for Python) su GitHub.

(Facoltativo) Attiva la registrazione di AWS IoT su Amazon CloudWatch

Puoi monitorare i log degli eventi per i messaggi MQTT pubblicati su AWS IoT Core. Per istruzioni di configurazione, consulta Configure AWS IoT logging e Monitor AWS IoT using CloudWatch Logs.


Informazioni correlate

Getting started with AWS IoT Core

Device provisioning

Frequently asked questions (sito Web del protocollo di messaggistica MQTT)

AWS UFFICIALE
AWS UFFICIALEAggiornata 2 anni fa