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 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 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
diretório e no 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 AWS conta:
-
Se ainda não o fez, crie e ative uma AWS conta
. -
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 à sua AWS conta, consulte o Guia do usuário do IAM.
-
Conceda permissão à sua AWS conta para acessar os FreeRTOS adicionando estas AWS IoT políticas:
-
Amazon S3 FullAccess
-
-
-
-
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 GitHub
Conexão ao servidor HTTP do Amazon S3
A função connectToServerWithBackoffRetries () tentaconnectToServerWithBackoffRetries()
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