ESP32

Pilha TCP/IP no FreeRTOS Plus TCP

Eu não escrevo notícias, mas não pude deixar passar essa.

Passeando pelo linkedin me deparei com uma postagem do Sérgio Prado, onde ele fala de duas novas APIs do FreeRTOS. Em relação ao TCP/IP, ele só comentou, mas foi o suficiente para eu ir atrás da documentação ver o que era essa novidade. E vocês não vão acreditar; a equipe do FreeRTOS implementou uma pilha TCP/IP lindíssima! Chega de usar o lwip? Sim? Bem, não ainda. Resta que esses recursos sejam implementados no ESP-IDF para utilizarmos também no ESP32.

Nada nos impede de contamplar os recursos, hum? Primeiro, gostaria de deixar o link da implementação dolorosa de um socket TCP utilizando o lwip, que fiz nesse artigo. Por favor, se puder, dê uma olhada no código desse artigo que citei antes de seguir a leitura, garanto que ficará muito mais empolgante.


Características

A implementação contempla uma série importante de recursos.

  • API para Berkeley sockets.
  • Thread safe e reentrância
  • ARP, DHCP, DNS, LLMNR, NBNS
  • manifestação de ARPs gratuitos
  • Endereçamento estático, DHCP e auto-IP
  • sockets TCP e UDP (client e server)
  • Interface opcional de callback

Esses são os recursos que me sinto livre para errar, porque se eu disser alguma besteira, será minima. Mas vamos lá, porque não consigo me conter.

Berkley sockets

Eu não entendo como isso pode ter sido implementado, é simplesmente fantástico!

O Berkley sockets é utilizado para fazer IPC em sistemas usando UNIX domain sockets. Escrevi a respeito nesse artigo, com um exemplo em Python. Essa é uma forma simples de fazer callback e facilitará muitas tarefas, se implementado no FreeRTOS do ESP32 (atualmente usando a versão Vanilla).

Thread safe e reentrância

Thread safe, caso não saiba, é dito de uma porção de código que maniple apenas estruturas de dados compartilhadas, garantindo a execução de threads simultâneas. Não sei se vou conseguir exemplificar adequadamente, mas é como dizer que você cria pequenos indivíduos que cumpre individualmente uma mesma tarefa, com parâmetros diferentes. Em suma, podemos abrir sockets distintos.

A reentrância é a possiblidade de execução concorrente de forma isolada. Podemos chamar várias vezes uma instância mesmo com a rotina alvo em execução, limitado apenas ao uso de dados globais, que não poderão fazer parte dessa rotina.

Protocolos

Não vou explicar cada um deles, trabalhei com isso durante muitos anos e estou enjoado dos conceitos. Só pra não deixar sem nada, o ARP é uma manifestação usada em uma camada baixa do modelo OSI (enlace) para anunciar um endereçamento físico na rede. É utilizado para mapeamento entre um endereço IP e o endereço ethernet e nem sei dizer um caso em que não seja utilizado, já fiz muito diagnóstico baseado em ARP enquanto administrador de redes.

O DHCP é o protocolo utilizado para atribuição de endereço baseado em um servidor de endereçamentos da rede e é o mais comumente utilizado em redes domésticas e redes de interação humana (que não sejam servidores, quero dizer).

O LLMNR é um protocolo de resolução de nomes utilizado em redes locais. É impressionante aos meus olhos tal recurso!

O NBNS é, bem, o conhecido WINS! Também para resolução de nomes, reconhecendo dispositivos da rede local.

Socket TCP e UDP

Agora, se você leu o artigo supracitado, tenho certeza que ficará no mínimo sorridente. Olhe que facilidade implementar um socket com a nova API do FreeRTOS+TCP.

Os parâmetros são:

xDomain – Que deve ser configurado para FREERTOS_AF_INET.

xType – Pode ser TCP ou UDP, passando a definição FREERTOS_SOCK_STREAM ou FREERTOS_SOCK_DGRAM, respectivamente.

xProtocol – Para criar um socket TCP, deve ser FREERTOS_IPPROTO_TCP. Para um socket UDP, deve ser FREERTOS_IPPROTO_UDP.

O retorno da função quando inválida, é FREERTOS_INVALID_SOCKET. Com isso, já podemos testar se a conexão foi criada adequadamente. Agora, recline a cabeça sobre a cadeira para não desmaiar de emoção, porque a implementação é simples demais!

As funções relacionadas:

Na documentação oficial tem exemplos de uso bem claras. Vou dispor aqui o código de uma comunicação TCP client e um exemplo de TCP server. É impressionante a simplicidade:

E agora, o TCP server:

Se tirar os comentários vai ficar mais parecido com uma anotação do que um código funcional!

Recomendo a visita ao site do FreeRTOS pra dar uma observada e torçamos para que esteja nativamente implementado no ESP_IDF o mais rápido possível. Serão vários artigos, torçamos!

Siga-nos no Do bit Ao Byte no Facebook.

Prefere twitter? @DobitAoByte.

Inscreva-se no nosso canal Do bit Ao Byte Brasil no YouTube.

Nossos grupos:

Arduino BR – https://www.facebook.com/groups/microcontroladorarduinobr/
Raspberry Pi BR – https://www.facebook.com/groups/raspberrybr/
Orange Pi BR – https://www.facebook.com/groups/OrangePiBR/
Odroid BR – https://www.facebook.com/groups/odroidBR/
Sistemas Embarcados BR – https://www.facebook.com/groups/SistemasEmbarcadosBR/

Sistemas Eletrônicos – https://www.facebook.com/groups/544679592355388/
MIPS BR – https://www.facebook.com/groups/MIPSBR/
Do Bit ao Byte – https://www.facebook.com/groups/dobitaobyte/

Próximo post a caminho!