Este es un cliente Python para Arduino IoT Cloud, que se ejecuta tanto en CPython como en MicroPython. El cliente admite métodos de autenticación básicos y avanzados, modos sincrónicos y asincrónicos y proporciona una API fácil de usar que permite a los usuarios conectarse a la nube y crear y vincular objetos locales a objetos de la nube con solo unas pocas líneas de código.
El siguiente ejemplo básico muestra cómo conectarse a la nube de Arduino IoT mediante autenticación básica de nombre de usuario y contraseña, y controlar un LED desde el widget de interruptor de un tablero.
from secrets import DEVICE_ID
from secrets import SECRET_KEY
# Switch callback, toggles the LED.
def on_switch_changed ( client , value ):
# Note the client object passed to this function can be used to access
# and modify any registered cloud object. The following line updates
# the LED value.
client [ "led" ] = value
# 1. Create a client object, which is used to connect to the IoT cloud and link local
# objects to cloud objects. Note a username and password can be used for basic authentication
# on both CPython and MicroPython. For more advanced authentication methods, please see the examples.
client = ArduinoCloudClient ( device_id = DEVICE_ID , username = DEVICE_ID , password = SECRET_KEY )
# 2. Register cloud objects.
# Note: The following objects must be created first in the dashboard and linked to the device.
# When the switch is toggled from the dashboard, the on_switch_changed function is called with
# the client object and new value args.
client . register ( "sw1" , value = None , on_write = on_switch_changed )
# The LED object is updated in the switch's on_write callback.
client . register ( "led" , value = None )
# 3. Start the Arduino cloud client.
client . start ()
Su archivo secrets.py
debería verse así:
WIFI_SSID = "" # WiFi network SSID (for MicroPython)
WIFI_PASS = "" # WiFi network key (for MicroPython)
DEVICE_ID = "" # Provided by Arduino cloud when creating a device.
SECRET_KEY = "" # Provided by Arduino cloud when creating a device.
Tenga en cuenta que, de forma predeterminada, el cliente se ejecuta en modo asíncrono. En este modo, el cliente ejecuta un bucle asíncrono que actualiza tareas y registros, sondea eventos de red, etc. El cliente también admite un modo sincrónico, que requiere un sondeo periódico del cliente. Para ejecutar el cliente en modo síncrono, pase sync_mode=True
al crear un objeto de cliente y llame client.update()
periódicamente después de conectarse. Por ejemplo:
# Run the client in synchronous mode.
client = ArduinoCloudClient ( device_id = DEVICE_ID , ..., sync_mode = True )
....
client . register ( "led" , value = None )
....
# In synchronous mode, this function returns immediately after connecting to the cloud.
client . start ()
# Update the client periodically.
while True :
client . update ()
time . sleep ( 0.100 )
Para obtener ejemplos más detallados y funciones API avanzadas, consulte los ejemplos.
El cliente admite la autenticación básica mediante un nombre de usuario y una contraseña, y el par clave/certificado más avanzado almacenado en un sistema de archivos o en un dispositivo criptográfico. Para probar esta funcionalidad, se pueden seguir los siguientes pasos para emular un dispositivo criptográfico (si no hay uno disponible) usando SoftHSM en Linux.
Usando la primera ranura disponible, en este caso 0
softhsm2-util --init-token --slot 0 --label " arduino " --pin 1234 --so-pin 1234
p11tool --provider=/usr/lib/softhsm/libsofthsm2.so --login --set-pin=1234 --write " pkcs11:token=arduino " --load-privkey key.pem --label " Mykey "
p11tool --provider=/usr/lib/softhsm/libsofthsm2.so --login --set-pin=1234 --write " pkcs11:token=arduino " --load-certificate cert.pem --label " Mykey "
Esto debería imprimir la clave y el certificado.
p11tool --provider=/usr/lib/softhsm/libsofthsm2.so --login --set-pin=1234 --list-all pkcs11:token=arduino
Object 0:
URL: pkcs11:model=SoftHSM%20v2 ; manufacturer=SoftHSM%20project ; serial=841b431f98150134 ; token=arduino ; id=%67%A2%AD%13%53%B1%CE%4F%0E%CB%74%34%B8%C6%1C%F3%33%EA%67%31 ; object=mykey ; type=private
Type: Private key (EC/ECDSA)
Label: mykey
Flags: CKA_WRAP/UNWRAP ; CKA_PRIVATE ; CKA_SENSITIVE ;
ID: 67:a2:ad:13:53:b1:ce:4f:0e:cb:74:34:b8:c6:1c:f3:33:ea:67:31
Object 1:
URL: pkcs11:model=SoftHSM%20v2 ; manufacturer=SoftHSM%20project ; serial=841b431f98150134 ; token=arduino ; id=%67%A2%AD%13%53%B1%CE%4F%0E%CB%74%34%B8%C6%1C%F3%33%EA%67%31 ; object=Mykey ; type=cert
Type: X.509 Certificate (EC/ECDSA-SECP256R1)
Expires: Sat May 31 12:00:00 2053
Label: Mykey
ID: 67:a2:ad:13:53:b1:ce:4f:0e:cb:74:34:b8:c6:1c:f3:33:ea:67:31
Cuando termine con el token, se puede eliminar con el siguiente comando:
softhsm2-util --delete-token --token " arduino "
KEY_PATH
, CERT_PATH
y DEVICE_ID
en examples/example.py
.ca-root.pem
o establezca CA_PATH
en None
si no se utiliza.pin
predeterminado y proporcione ENGINE_PATH
y MODULE_PATH
en ssl_params
si es necesario.python examples/example.py
MicroPython admite ambos modos de autenticación: modo básico, utilizando un nombre de usuario y contraseña, y mTLS con la clave y el certificado almacenados en el sistema de archivos o en un elemento seguro (para placas aprovisionadas). Para utilizar archivos de claves y certificados almacenados en el sistema de archivos, primero deben convertirse al formato DER. Los siguientes comandos se pueden utilizar para convertir de PEM a DER:
openssl ec -in key.pem -out key.der -outform DER
openssl x509 -in cert.pem -out cert.der -outform DER
En este caso, KEY_PATH
y CERT_PATH
se pueden configurar en las rutas DER de clave y certificado, respectivamente:
KEY_PATH = "path/to/key.der"
CERT_PATH = "path/to/cert.der"
Alternativamente, si la clave y el certificado se almacenan en el SE, sus URI se pueden especificar en el siguiente formato:
KEY_PATH = "se05x:token=0x00000064"
CERT_PATH = "se05x:token=0x00000065"
Con la clave y el certificado configurados, el ejemplo se puede ejecutar con el siguiente comando examples/micropython_advanced.py