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 repositório Github do Amazon FreeRTOS.
Introdução
Esta demonstração mostra como usar solicitações de intervaloHTTPClient_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
nota
Para configurar e executar as demonstrações do FreeRTOS, siga as etapas em Conceitos básicos do FreeRTOS.
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 é chamado http_demo_s3_download.c e pode ser encontrado no diretório e no site do GitHubfreertos/demos/coreHTTP/
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.
-
Configure uma conta da AWS:
-
Caso ainda não tenha feito isso, crie e ative uma conta da AWS
. -
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.
-
Para adicionar um usuário à conta da AWS, consulte o Guia do usuário do IAM.
-
Conceda permissão à conta da AWS para acessar o FreeRTOS e ao AWS IoTadicionando estas políticas:
-
AmazonS3FullAccess
-
-
-
-
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.
-
Faça upload de um arquivo no S3 seguindo as etapas em Como fazer upload de arquivos e pastas em um bucket do S3?.
-
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, consulteFreeRTOS-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 site do GitHub
Conexão ao servidor HTTP do Amazon S3
A função connectToServerWithBackoffRetries()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 para prvConnectToServer() pode ser encontrado no 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 para prvGetS3ObjectFileSize() pode ser encontrado no 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 para prvDownloadS3ObjectFile() pode ser encontrado no GitHub