Agende e execute a atualização do firmware usando uma definição de tarefa - AWS IoT Wireless

Agende e execute a atualização do firmware usando uma definição de tarefa

Você pode usar uma definição de tarefa para incluir detalhes sobre a atualização do firmware e definir a atualização. AWS IoT Core for LoRaWAN oferece uma atualização de firmware com base nas informações dos três campos a seguir associados ao gateway.

  • Estação

    A versão e o tempo de compilação do software Basics Station. Para identificar essas informações, você também pode gerá-las usando o software Basics Station que está sendo executado pelo gateway (por exemplo, 2.0.5(rpi/std) 2021-03-09 03:45:09).

  • PackageVersion

    A versão do firmware, especificada pelo arquivo version.txt no gateway. Embora essas informações possam não estar presentes no gateway, recomendamos que elas sejam uma forma de definir a versão do firmware (por exemplo, 1.0.0).

  • Modelo

    A plataforma ou o modelo que está sendo usado pelo gateway (por exemplo, Linux).

Esse procedimento leva 20 minutos para ser concluído.

Obtenha a versão atual em execução no gateway

Para determinar a elegibilidade do gateway para uma atualização de firmware, o servidor CUPS verifica todos os três campos, Station, PackageVersion e Model, em busca de uma correspondência quando o gateway os apresenta durante uma solicitação do CUPS. Quando você usa uma definição de tarefa, esses campos são armazenados como parte do campo CurrentVersion.

Você pode usar a API AWS IoT Core for LoRaWAN ou a AWS CLI para obter CurrentVersion para o gateway. Os comandos a seguir mostram como obter essas informações usando a CLI.

  1. Se você já tiver provisionado um gateway, poderá obter informações sobre ele usando o comando get-wireless-gateway.

    aws iotwireless get-wireless-gateway \ --identifier 5a11b0a85a11b0a8 \ --identifier-type GatewayEui

    Confira a seguir um exemplo de saída para o comando.

    { "Name": "Raspberry pi", "Id": "1352172b-0602-4b40-896f-54da9ed16b57", "Description": "Raspberry pi", "LoRaWAN": { "GatewayEui": "5a11b0a85a11b0a8", "RfRegion": "US915" }, "Arn": "arn:aws:iotwireless:us-east-1:231894231068:WirelessGateway/1352172b-0602-4b40-896f-54da9ed16b57" }
  2. Usando o ID do gateway sem fio informado pelo comando get-wireless-gateway, você pode usar o comando get-wireless-gateway-firmware-information para obter CurrentVersion.

    aws iotwireless get-wireless-gateway-firmware-information \ --id "3039b406-5cc9-4307-925b-9948c63da25b"

    A seguir, confira um exemplo de saída para o comando, com informações de todos os três campos exibidos pela CurrentVersion.

    { "LoRaWAN": { "CurrentVersion": { "PackageVersion": "1.0.0", "Model": "rpi", "Station": "2.0.5(rpi/std) 2021-03-09 03:45:09" } } }

Criar uma definição de tarefa de gateway sem fio

Ao criar a definição da tarefa, é recomendável especificar a criação automática de tarefas utilizando o parâmetro AutoCreateTasks. O AutoCreateTasks aplica-se a qualquer gateway que corresponda aos três parâmetros mencionados anteriormente. Se esse parâmetro estiver desativado, os parâmetros deverão ser atribuídos manualmente ao gateway.

Você pode criar a definição da tarefa do gateway sem fio usando a API AWS IoT Core for LoRaWAN ou a AWS CLI. Os comandos a seguir mostram como criar a definição da tarefa usando a CLI.

  1. Crie um arquivo, input.json, que conterá as informações a serem passadas para a API CreateWirelessGatewayTaskDefinition. No arquivo input.json, dê as seguintes informações que você obteve anteriormente:

    • UpdateDataSource

      Forneça o link para seu objeto contendo o arquivo de atualização do firmware que você carregou no bucket do S3 (por exemplo, s3://iotwirelessfwupdate/fwstation).

    • UpdateDataRole

      Forneça o link para o ARN do perfil do IAM criado, que dá permissões para ler o bucket do S3 (por exemplo, arn:aws:iam::123456789012:role/IoTWirelessFwUpdateRole).

    • SigKeyCRC e UpdateSignature

      Essas informações podem ser fornecidas pelo fabricante do gateway, mas se seguiu o procedimento descrito em Gere o arquivo e a assinatura de atualização de firmware, você as encontrará ao gerar a assinatura.

    • CurrentVersion

      Apresente a saída CurrentVersion que você obteve anteriormente executando o comando get-wireless-gateway-firmware-information .

      cat input.json

      O exemplo a seguir mostra o conteúdo do arquivo input.json.

      { "AutoCreateTasks": true, "Name": "FirmwareUpdate", "Update": { "UpdateDataSource" : "s3://iotwirelessfwupdate/fwstation", "UpdateDataRole" : "arn:aws:iam::123456789012:role/IoTWirelessFwUpdateRole", "LoRaWAN" : { "SigKeyCrc": 3434210794, "UpdateSignature": "MEQCIDPY/p2ssgXIPNCOgZr+NzeTLpX+WfBo5tYWbh5pQWN3AiBROen+XlIdMScvAsfVfU/ZScJCalkVNZh4esyS8mNIgA==", "CurrentVersion" : { "PackageVersion": "1.0.0", "Model": "rpi", "Station": "2.0.5(rpi/std) 2021-03-09 03:45:09" } } } }
  2. Passe o arquivo input.json para o comando create-wireless-gateway-task-definition para criar a definição da tarefa.

    aws iotwireless create-wireless-gateway-task-definition \ --cli-input-json file://input.json

    Confira a seguir a saída do comando.

    { "Id": "4ac46ff4-efc5-44fd-9def-e8517077bb12", "Arn": "arn:aws:iotwireless:us-east-1:231894231068:WirelessGatewayTaskDefinition/4ac46ff4-efc5-44fd-9def-e8517077bb12" }

Execute a tarefa de atualização do firmware e acompanhe o progresso

O gateway está pronto para receber a atualização do firmware e, uma vez ligado, ele se conecta ao servidor CUPS. Quando o servidor CUPS encontra uma correspondência na versão do gateway, ele agenda uma atualização de firmware.

Uma tarefa é uma definição de tarefa em andamento. Como você especificou a criação automática de tarefas definindo AutoCreateTasks como True, a tarefa de atualização do firmware começará assim que um gateway correspondente for encontrado.

É possível acompanhar o andamento da tarefa usando a API GetWirelessGatewayTask. Quando você executa o comando get-wireless-gateway-task pela primeira vez, ele mostra o status da tarefa como IN_PROGRESS.

aws iotwireless get-wireless-gateway-task \ --id 1352172b-0602-4b40-896f-54da9ed16b57

Confira a seguir a saída do comando.

{ "WirelessGatewayId": "1352172b-0602-4b40-896f-54da9ed16b57", "WirelessGatewayTaskDefinitionId": "ec11f9e7-b037-4fcc-aa60-a43b839f5de3", "LastUplinkReceivedAt": "2021-03-12T09:56:12.047Z", "TaskCreatedAt": "2021-03-12T09:56:12.047Z", "Status": "IN_PROGRESS" }

Quando você executar o comando da próxima vez, se a atualização do firmware entrar em vigor, ela mostrará os campos atualizados, Package, Version e Model e o status da tarefa será alterado para COMPLETED.

aws iotwireless get-wireless-gateway-task \ --id 1352172b-0602-4b40-896f-54da9ed16b57

Confira a seguir a saída do comando.

{ "WirelessGatewayId": "1352172b-0602-4b40-896f-54da9ed16b57", "WirelessGatewayTaskDefinitionId": "ec11f9e7-b037-4fcc-aa60-a43b839f5de3", "LastUplinkReceivedAt": "2021-03-12T09:56:12.047Z", "TaskCreatedAt": "2021-03-12T09:56:12.047Z", "Status": "COMPLETED" }

Neste exemplo, mostramos a atualização do firmware usando o RAKWireless Gateway baseado em Raspberry Pi. O script de atualização do firmware interrompe a execução do BasicStation para armazenar os campos Package, Version e Model atualizados, portanto, BasicStation precisará ser reiniciado.

2021-03-12 09:56:13.108 [CUP:INFO] CUPS provided update.bin 2021-03-12 09:56:13.108 [CUP:INFO] CUPS provided signature len=70 keycrc=37316C36 2021-03-12 09:56:13.148 [CUP:INFO] ECDSA key#0 -> VERIFIED 2021-03-12 09:56:13.148 [CUP:INFO] Running update.bin as background process 2021-03-12 09:56:13.149 [SYS:VERB] /tmp/update.bin: Forked, waiting... 2021-03-12 09:56:13.151 [SYS:INFO] Process /tmp/update.bin (pid=6873) completed 2021-03-12 09:56:13.152 [CUP:INFO] Interaction with CUPS done - next regular check in 10s

Se a atualização do firmware falhar, você verá um status de FIRST_RETRY do servidor CUPS e o gateway enviará a mesma solicitação. Se o servidor CUPS não conseguir se conectar ao gateway após um SECOND_RETRY, ele mostrará um status de FAILED.

Depois que a tarefa anterior for COMPLETED ou FAILED, exclua a tarefa antiga usando o comando delete-wireless-gateway-task antes de iniciar uma nova.

aws iotwireless delete-wireless-gateway-task \ --id 1352172b-0602-4b40-896f-54da9ed16b57