Demonstração de download de coreHTTP básica do S3 - Gratuito RTOS

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Demonstração de download de coreHTTP básica do S3

Importante

Essa demonstração está hospedada no repositório Amazon-FreeRTOS, que está preterido. Recomendamos começar aqui ao criar um novo projeto. Se você já tem um projeto FreeRTOS existente baseado no repositório Amazon-FreeRTOS que está preterido, consulte o Guia de migração do RTOS repositório Github gratuito da Amazon.

Introdução

Esta demonstração mostra como usar solicitações de intervalo para fazer download de arquivos do servidor HTTP do Amazon S3. As solicitações de intervalo têm suporte nativo na API do coreHTTP quando você usa HTTPClient_AddRangeHeader para criar a solicitação HTTP. As solicitações de intervalo são altamente recomendadas para um ambiente de microcontrolador. Ao baixar um arquivo grande em intervalos separados e não em uma única solicitação, cada seção do arquivo pode ser processada sem bloquear o soquete da rede. As solicitações de intervalo diminuem o risco de perda de pacotes, que exigem retransmissões na conexão TCP e, portanto, melhoram o consumo de energia do dispositivo.

Este exemplo usa uma interface de transporte de rede que usa mbedTLS para estabelecer uma conexão mutuamente autenticada entre um cliente de dispositivo de IoT executando coreHTTP e o servidor HTTP do Amazon S3.

nota

Para configurar e executar as demonstrações do FreeRTOS, siga as etapas em Comece com o Free RTOS.

Thread único versus thread múltiplo

Existem dois modelos de uso da coreHTTP, com thread único e com threads múltiplos (multitarefas). Embora a demonstração nesta seção execute a biblioteca HTTP em um thread, ela realmente demonstra como usar a coreHTTP em um ambiente com thread único (somente uma tarefa usa a API HTTP na demonstração). Embora as aplicações com thread único devam chamar repetidamente a biblioteca HTTP, as aplicações com threads múltiplos podem enviar solicitações HTTP em segundo plano em uma tarefa de agente (ou daemon).

Organização de código-fonte

O projeto de demonstração tem um nome http_demo_s3_download.c e pode ser encontrado no freertos/demos/coreHTTP/ diretório e no GitHubsite.

Configuração de conexão do servidor HTTP do Amazon S3

Esta demonstração usa uma URL pré-assinada para se conectar ao servidor HTTP do Amazon S3 e autorizar o acesso ao objeto para download. A conexão TLS do servidor HTTP do Amazon S3 usa somente a autenticação do servidor. No nível da aplicação, o acesso ao objeto é autenticado com os parâmetros na consulta de URL pré-assinada. Siga as etapas abaixo para configurar sua conexão com a AWS.

  1. Configure uma AWS conta:

    1. Se ainda não o fez, crie e ative uma AWS conta.

    2. As contas e permissões são definidas usando AWS Identity and Access Management (IAM). O IAM permite gerenciar as permissões para cada usuário em sua conta. Por padrão, um usuário não tem permissões até que sejam concedidas pelo proprietário raiz.

      1. Para adicionar um usuário à sua AWS conta, consulte o Guia do usuário do IAM.

      2. Conceda permissão à sua AWS conta para acessar os FreeRTOS adicionando estas AWS IoT políticas:

        • Amazon S3 FullAccess

  2. Criar um bucket no S3 seguindo as etapas em Como criar um bucket do S3? no console Guia do usuário do Amazon Simple Storage Service.

  3. Faça upload de um arquivo no S3 seguindo as etapas em Como fazer upload de arquivos e pastas em um bucket do S3?.

  4. Gere um URL pré-assinado usando o script localizado em FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/Common/presigned_url_generator/presigned_urls_gen.py. Para obter instruções de uso, consulte FreeRTOS-Plus/Demo/coreHTTP_Windows_Simulator/Common/presigned_url_generator/README.md.

Funcionalidade

A demonstração recupera primeiro o tamanho do arquivo. Depois, solicita cada intervalo de bytes sequencialmente, em um loop, com tamanhos de intervalo de democonfigRANGE_REQUEST_LENGTH.

O código-fonte da demonstração pode ser encontrado no GitHubsite.

Conexão ao servidor HTTP do Amazon S3

A função connectToServerWithBackoffRetries () tenta fazer uma conexão TCP com o servidor HTTP. Se a conexão falhar, ela tentará novamente após um tempo limite. O valor do tempo limite aumentará exponencialmente até que o número máximo de tentativas ou o valor do tempo limite seja atingido. connectToServerWithBackoffRetries() retornará um status de falha se a conexão TCP com o servidor não puder ser estabelecida após o número configurado de tentativas.

A função prvConnectToServer() demonstra como estabelecer uma conexão com o servidor HTTP do Amazon S3 usando somente a autenticação do servidor. Ela usa a interface de transporte baseada em mbedTLS que é implementada no arquivo FreeRTOS-Plus/Source/Application-Protocols/network_transport/freertos_plus_tcp/using_mbedtls/using_mbedtls.c.

O código-fonte de prvConnectToServer() pode ser encontrado em GitHub.

Criação de solicitação de intervalo

A função HTTPClient_AddRangeHeader() da API oferece suporte a serialização de um intervalo de bytes nos cabeçalhos da solicitação HTTP para formar uma solicitação de intervalo. As solicitações de intervalo são usadas nesta demonstração para recuperar o tamanho do arquivo e solicitar cada seção do arquivo.

A função prvGetS3ObjectFileSize() recupera o tamanho do arquivo no bucket do S3. O cabeçalho Connection: keep-alive é adicionado nessa primeira solicitação ao Amazon S3 para manter a conexão aberta após o envio da resposta. Atualmente, o servidor HTTP do S3 não oferece suporte às solicitações HEAD usando uma URL pré-assinada, portanto, o 0 (zero) byte é solicitado. O campo de cabeçalho da resposta Content-Range contém o tamanho do arquivo. Uma resposta 206 Partial Content do servidor é esperada; qualquer outro código de status de resposta recebido é um erro.

O código-fonte de prvGetS3ObjectFileSize() pode ser encontrado em GitHub.

Depois de recuperar o tamanho do arquivo, essa demonstração cria uma nova solicitação de intervalo para cada intervalo de bytes do arquivo a ser baixado. Ela usa HTTPClient_AddRangeHeader() para cada seção do arquivo.

Envio de solicitações e recebimento de respostas

A função prvDownloadS3ObjectFile() envia as solicitações de intervalo em um loop até que o arquivo inteiro seja baixado. A função HTTPClient_Send() da API envia uma solicitação e recebe a resposta de forma síncrona. Quando a função retorna, a resposta é recebida em um xResponse. Em seguida, o código de status é verificado como 206 Partial Content e o número de bytes baixados até o momento é incrementado pelo valor do cabeçalho Content-Length.

O código-fonte de prvDownloadS3ObjectFile() pode ser encontrado em GitHub.