Este é um cliente Python para o Arduino IoT Cloud, que roda em CPython e MicroPython. O cliente oferece suporte a métodos de autenticação básicos e avançados, modos síncronos e assíncronos e fornece uma API amigável que permite aos usuários se conectar à nuvem e criar e vincular objetos locais a objetos da nuvem com apenas algumas linhas de código.
O exemplo básico a seguir mostra como se conectar à nuvem Arduino IoT usando autenticação básica de nome de usuário e senha e controlar um LED a partir de um widget de comutação do painel.
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 ()
Seu arquivo secrets.py
deve ficar assim:
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.
Observe que, por padrão, o cliente é executado em modo assíncrono. Nesse modo, o cliente executa um loop assíncrono que atualiza tarefas e registros, pesquisa eventos de rede, etc. O cliente também oferece suporte a um modo síncrono, que requer sondagens periódicas do cliente. Para executar o cliente no modo síncrono, passe sync_mode=True
ao criar um objeto cliente e chame client.update()
periodicamente após a conexão. Por exemplo:
# 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 exemplos mais detalhados e recursos avançados de API, consulte os exemplos.
O cliente suporta autenticação básica usando nome de usuário e senha, e o par chave/certificado mais avançado armazenado no sistema de arquivos ou em um dispositivo criptográfico. Para testar essa funcionalidade, as etapas a seguir podem ser usadas para emular um dispositivo criptográfico (se não houver um disponível) usando SoftHSM no Linux.
Usando o primeiro slot disponível, neste 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 "
Isso deve imprimir a chave e o 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
Quando terminar o token, ele pode ser excluído com o seguinte comando:
softhsm2-util --delete-token --token " arduino "
KEY_PATH
, CERT_PATH
e DEVICE_ID
em examples/example.py
.ca-root.pem
ou defina CA_PATH
como None
se não for usado.pin
padrão e forneça ENGINE_PATH
e MODULE_PATH
em ssl_params
, se necessário.python examples/example.py
MicroPython suporta ambos os modos de autenticação: modo básico, usando nome de usuário e senha, e mTLS com a chave e o certificado armazenados no sistema de arquivos ou em um elemento seguro (para placas provisionadas). Para usar arquivos de chaves e certificados armazenados no sistema de arquivos, eles devem primeiro ser convertidos para o formato DER. Os seguintes comandos podem ser usados para converter de PEM para DER:
openssl ec -in key.pem -out key.der -outform DER
openssl x509 -in cert.pem -out cert.der -outform DER
Neste caso, KEY_PATH
, CERT_PATH
, podem ser configurados para os caminhos DER da chave e do certificado, respectivamente:
KEY_PATH = "path/to/key.der"
CERT_PATH = "path/to/cert.der"
Alternativamente, se a chave e o certificado estiverem armazenados no SE, seus URIs poderão ser especificados no seguinte formato:
KEY_PATH = "se05x:token=0x00000064"
CERT_PATH = "se05x:token=0x00000065"
Com a chave e o certificado definidos, o exemplo pode ser executado com o seguinte comando examples/micropython_advanced.py