Это клиент Python для облака Arduino IoT, который работает как на CPython, так и на MicroPython. Клиент поддерживает базовые и расширенные методы аутентификации, синхронный и асинхронный режимы и предоставляет удобный API, который позволяет пользователям подключаться к облаку, создавать и связывать локальные объекты с облачными объектами с помощью всего лишь нескольких строк кода.
В следующем базовом примере показано, как подключиться к облаку Arduino IoT, используя базовую аутентификацию по имени пользователя и паролю, а также управлять светодиодом с помощью виджета переключателя на информационной панели.
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 ()
Ваш файл secrets.py
должен выглядеть следующим образом:
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.
Обратите внимание, что по умолчанию клиент работает в асинхронном режиме. В этом режиме клиент запускает асинхронный цикл, который обновляет задачи и записи, опрашивает сетевые события и т. д. Клиент также поддерживает синхронный режим, который требует периодического опроса клиента. Чтобы запустить клиент в синхронном режиме, передайте sync_mode=True
при создании объекта клиента и периодически вызывайте client.update()
после подключения. Например:
# 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 )
Более подробные примеры и расширенные функции API см. в примерах.
Клиент поддерживает базовую аутентификацию с использованием имени пользователя и пароля, а также более сложную пару ключ/сертификат, хранящуюся в файловой системе или на криптографическом устройстве. Чтобы протестировать эту функциональность, можно использовать следующие шаги для эмуляции криптоустройства (если оно недоступно) с помощью SoftHSM в Linux.
Использование первого доступного слота, в данном случае 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 "
Это должно распечатать ключ и сертификат.
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
После завершения работы с токеном его можно удалить с помощью следующей команды:
softhsm2-util --delete-token --token " arduino "
KEY_PATH
, CERT_PATH
и DEVICE_ID
в examples/example.py
.ca-root.pem
или установите для CA_PATH
значение None
, если он не используется.pin
по умолчанию и при необходимости укажите ENGINE_PATH
и MODULE_PATH
в ssl_params
.python examples/example.py
MicroPython поддерживает оба режима аутентификации: базовый режим с использованием имени пользователя и пароля и mTLS с ключом и сертификатом, хранящимися в файловой системе или в защищенном элементе (для подготовленных плат). Чтобы использовать файлы ключей и сертификатов, хранящиеся в файловой системе, их необходимо сначала преобразовать в формат DER. Для преобразования PEM в DER можно использовать следующие команды:
openssl ec -in key.pem -out key.der -outform DER
openssl x509 -in cert.pem -out cert.der -outform DER
В этом случае KEY_PATH
, CERT_PATH
могут быть установлены для путей DER ключа и сертификата соответственно:
KEY_PATH = "path/to/key.der"
CERT_PATH = "path/to/cert.der"
Альтернативно, если ключ и сертификат хранятся в SE, их URI можно указать в следующем формате:
KEY_PATH = "se05x:token=0x00000064"
CERT_PATH = "se05x:token=0x00000065"
Если установлены ключ и сертификат, пример можно запустить с помощью следующей команды examples/micropython_advanced.py