Desenvolvimento de um servidor TELNET baseado em W5500 e ATMEGA8

Recentemente, o complexo de software e hardware do Arduino se tornou muito popular, projetado para desenvolver vários projetos eletrônicos interessantes. Os projetos são feitos ao conectar o rodapé do Arduino com os módulos adicionais necessários. No rodapé do Arduino, há um microcontrolador, firmware para o qual está escrito em um ambiente de desenvolvimento especial para o Arduino, usando, como regra, bibliotecas prontas para um ou outro módulo.

Um dos módulos - W5500 - destina-se à fabricação de estruturas eletrônicas que serão conectadas à Internet. Nesse caso, na maioria das vezes, implica controle remoto de sua estrutura. Por exemplo, pode ser uma “casa inteligente”, um robô e similares. O projeto mais trivial (exceto o Hello world) é a inclusão remota de LEDs através de um navegador da Web (Fig. 1). Se, em vez de LEDs, comutadores de transistor e relés estiverem conectados, cargas mais poderosas poderão ser comutadas. Portanto, em essência, o programa (firmware) desse design é um servidor da web que processa solicitações HTTP de um usuário remoto.

Fig. 1. Gerenciamento de LEDs através de um navegador.

O módulo W5500 é baseado no próprio chip W5500 com seu kit de corpo, além de um conector BLS para MK via SPI, um conector RJ-45 para conexão a uma rede de computadores e um regulador de tensão linear para 3,3 V (Fig. 2).



Fig. 2. O módulo W5500.

O chip W5500 é um controlador completo com processamento integrado de toda uma pilha de protocolos de rede, da Ethernet ao TCP (Fig. 3). Ao implementar um design baseado nesse chip, o programador não precisa escrever o código de processamento do protocolo TCP / IP, basta implementar apenas o protocolo da camada de aplicação, que será incorporado ao TCP. No exemplo acima (no Arduino), http é usado como protocolo de aplicação.

Fig. 3. A estrutura do chip W5500.

Sem fazer o Arduino, decidi estudar a documentação do chip W5500 em detalhes e implementar de forma independente o programa baseado no microcontrolador Atmega8. Este programa não incluirá um manipulador http. É necessário implementar a troca de dados mais simples (RAW) via protocolo TCP usando um terminal remoto. Não é inteiramente exato falar sobre o protocolo Telnet, como diz o título deste artigo. Possui características próprias, baseadas na troca de informações adicionais sobre os parâmetros dos terminais. No entanto, a maioria dos clientes de telnet suporta RAW e não requer o acima. Portanto, o programa Atmega8 MK não incluirá um manipulador de protocolo no nível do aplicativo. Ela lidará apenas com a inicialização do W5500, gerenciamento de soquete, recepção e transmissão de dados.

A principal aplicação desse design é o gerenciamento de dispositivos através de um terminal remoto. Nesse caso, o design é conectado ao dispositivo gerenciado pela interface UART (três fios GND, TxD, RxD). A gestão através do terminal é uma abordagem profissional clássica em uma área específica na ausência de uma interface gráfica. Por exemplo, uma linha de comando do Windows ou Linux ou uma maneira de configurar um roteador através de um terminal usando o protocolo Telnet. O último exemplo é realmente equivalente à idéia discutida neste artigo.

Ao desenvolver este ou aquele dispositivo, se necessário, pretendo controlá-lo com comandos de texto através de um terminal conectado via interface UART. Pode ser uma conexão com um PC comum na porta COM RS-232 via chip adaptador MAX232 ou no USB (porta COM virtual) através do chip PL2303. Você pode usar o programa HyperTerminal padrão como um terminal. Com a expansão dos smartphones Android, tornou-se conveniente conectar-se via Bluetooth: um módulo Bluetooth (por exemplo, HC-06) é conectado à interface UART do dispositivo e um smartphone é conectado ao módulo sem fio. Existem muitos aplicativos na Internet que implementam o terminal via Bluetooth. Assim, você pode controlar o dispositivo através do terminal a partir de um telefone celular via Bluetooth em um curto alcance. O design discutido neste artigo permite implementar o controle através do terminal usando a Internet. O terminal pode ser o HyperTerminal padrão, fornecido com o Windows XP, ou você pode executar o utilitário telnet na linha de comando do Windows e trabalhar nele. Se estamos falando de um smartphone, você pode escolher um dos aplicativos no Android (também há um grande número deles) (Fig. 4).



Fig. 4. Aplicativos para "terminal TCP" no Google Play.

O chip W5500 possui 8 soquetes independentes, cada um com uma memória para receber e transmitir informações com mais de 2 KB. Total, a memória total é de 16 KB para recebimento e 16 KB para transmissão de informações. Esses parâmetros são usados ​​por padrão, mas, se necessário, no estágio de inicialização do chip, a memória pode ser realocada pelos soquetes. O aplicativo descrito aqui utilizará as configurações de memória padrão e todos os 8 soquetes estão envolvidos. Cada soquete no estágio de sua inicialização recebe muitos parâmetros, sendo os principais o modo de operação e a porta TCP. O modo de operação de todos os oito soquetes que precisamos é o modo de servidor TCP. Você deve atribuir portas diferentes para cada soquete. Tomei oito portas consecutivas, começando, por exemplo, a partir de 4000. No estágio de inicialização do módulo W5500, são atribuídos parâmetros de rede conectados ao programa Atmega8 MK: endereço IP, máscara de sub-rede, endereço IP do gateway e até o endereço MAC físico. As configurações de rede do W5500 devem corresponder às configurações da rede doméstica à qual ele se conecta. Ao conectar remotamente ao dispositivo descrito, as configurações do terminal indicam o endereço do host (endereço IP ou nome de domínio) e porta. O endereço do host refere-se ao dispositivo W5500 e a porta refere-se ao soquete no dispositivo. Um soquete pode funcionar com apenas uma conexão. Portanto, é possível fazer oito conexões simultâneas independentes. A Figura 5 mostra os parâmetros de conexão no programa HyperTerminal padrão para o W5500 com o endereço IP 192.168.0.111 no soquete 0 (porta 4000). Para se conectar à Internet global (de fora), você precisa configurar corretamente o seu roteador doméstico.

Fig. 5. Conexão via TCP / IP no HyperTerminal.

Eu tentei muitas aplicações de terminal TCP diferentes, cada uma com suas próprias vantagens e desvantagens. Primeiro de tudo, pelo método de empacotar um pacote TCP, dois casos podem ser distinguidos. No primeiro caso, um pacote TCP é gerado e enviado ao servidor imediatamente quando um caractere é inserido no terminal. Assim, o campo de dados de cada pacote leva 1 byte e contém o caractere inserido pelo usuário. O programa HyperTerminal funciona exatamente nesse modo. No segundo caso, o conjunto de caracteres (comando) é inserido em um campo de texto separado e, quando você clica no botão "Enviar", apenas um pacote com um campo de dados é formado, cujo conteúdo é um conjunto de caracteres inserido pelo usuário. O tamanho do campo de dados desse pacote em bytes coincide com o número de caracteres digitados. O segundo caso é o mais preferível e conveniente, além de econômico no trânsito. Nosso design funciona com os dois casos, transferindo para a saída (TxD) do UART MK Atmega8 todos os caracteres inseridos pelo usuário remoto a partir de qualquer soquete.

Quanto à organização da transferência de informações do servidor para o cliente, aqui também têm suas próprias características. É possível fazer com que o programa MK gere um pacote TCP de um byte também diretamente, após o recebimento de um byte (caractere) na perna do RxD UART MK. Você pode criar um pacote TCP a partir de um conjunto de bytes de entrada para o MK pela presença de um sinal adicional especial, presente apenas durante a transmissão da sequência do dispositivo conectado (sinal de embalagem). A propósito, esse sinal é usado para alternar o MAX485 para transmissão no caso de converter a interface RS-232 em interface RS-485 half-duplex. No entanto, como eu estava convencido, é mais conveniente usar um timer, ou seja, um pequeno atraso durante o qual a recepção de caracteres e a formação do pacote TCP será realizada. Este é o método que eu implementei na construção descrita. Funciona da seguinte maneira. O temporizador (o tempo é definido aproximadamente 0,3 seg.) Inicia quando o primeiro caractere chega e é redefinido quando cada próximo caractere chega no UART MK. Se nenhum caractere chegar dentro de um tempo especificado, um pacote com os caracteres recebidos será formado e enviado ao cliente e o cronômetro será interrompido. No meu caso particular, há uma correspondência em massa em todos os soquetes aos quais os clientes estão conectados.

Agora será sobre privacidade. O terminal remoto descrito não está protegido contra escutas usando analisadores de tráfego. Até o próprio protocolo Telnet não fornece autenticação e criptografia de senha. Para isso, existem outros protocolos de terminal remoto modernos. E, no caso do Telnet, bem como no caso do RAW (sem um protocolo de aplicativo), você pode implementar um método indireto de autenticação de senha, que só será ineficaz com a intervenção intencional intencional. No entanto, esse método de autorização protegerá contra tráfego "esquerdo" não controlado. Pode ser proveniente de spyware, que, classificando o intervalo de endereços IP de provedores conhecidos e o intervalo de portas, pode se conectar repentinamente ao nosso dispositivo (se "escutar" as conexões da Internet). No meu firmware, implementei uma página de boas-vindas do cliente, se conectada ao servidor, ou seja, para o design baseado no módulo W5500.

A página de boas-vindas contém informações sobre o endereço IP do cliente, número do soquete (para monitoramento) e uma solicitação para inserir uma senha (Fig. 6).

Fig. 6. Página de boas-vindas do servidor W5500.

Após conectar-se dentro do programa MK, um timer inicia (por aproximadamente 18 segundos), durante o qual o usuário deve ter tempo para inserir uma senha específica (a mesma em todos os soquetes). Se a senha for digitada incorretamente, após o tempo definido, o usuário informa a mensagem correspondente e o servidor desconecta (Fig. 7).

Fig. 7. Relatar uma senha incorreta.

No caso de uma senha digitada corretamente, o usuário também recebe a mensagem correspondente (Fig. 8). Depois disso, uma ponte "transparente" é estabelecida entre o terminal remoto e a interface UART do MK, à qual o módulo W5500 está conectado via SPI. A operação dessa ponte foi testada apenas no nível das equipes de usuários. Uma troca de dados de alta velocidade de pleno direito pode não ser garantida se, em alguns casos, o aplicativo cliente não for um terminal de usuário, mas algum outro programa. E ainda mais, o design descrito não garante (mais precisamente, não é fornecido) a troca de dados full-duplex.

Fig. 8. Mensagem sobre a senha correta.

Quando uma senha é digitada, o usuário não retorna os caracteres digitados no terminal e também “Backspace” não funciona (retrocesso com um caractere digitado incorretamente). O tamanho da senha é de 8 caracteres. O programa MK verifica os 8 primeiros caracteres recebidos do cliente, independentemente de sua distribuição nos pacotes TCP. Mas qualquer pacote não deve exceder 10 bytes. A propósito, a função "Enviar arquivo de texto" no HyperTerminal funciona de maneira bastante interessante. Como foi verificado usando um analisador de tráfego, quando essa função é executada, dois pacotes TCP são formados: o primeiro pacote com dados de 1 byte contém o primeiro caractere do arquivo de texto transmitido e o segundo pacote contém o restante do conteúdo.

O servidor fornece duas senhas diferentes. Uma senha é usada para estabelecer a ponte TCP-UART (uso normal), conforme descrito acima, e a segunda senha é usada para controlar o módulo W5500 ou outros parâmetros de design. Se essa senha for digitada, o usuário verá outra página de boas-vindas e ele entrará no modo de controle. Eu intencionalmente desde que esse modo fosse possível apenas em um dos soquetes livres. Se um soquete com esse modo estiver ocupado e for feita uma tentativa de efetuar logon nesse modo em outro soquete, a conexão será desconectada imediatamente pelo servidor. Antes do intervalo, será exibida uma mensagem sobre o número do soquete que já está funcionando (ocupado) no modo de controle (Fig. 9).

O modo de controle fornece os comandos que defini, cuja lista pode ser vista digitando o comando help. O comando deve terminar com um caractere de nova linha (tecla Enter). Além disso, se o modo de controle estiver ativo, o servidor W5500 envia mensagens de serviço ao terminal, por exemplo, sobre como conectar clientes a outros soquetes com seus endereços IP ou sobre um soquete livre. A Figura 10 demonstra o acima. A lista de equipes ainda não está completa, será reabastecida ao longo do tempo.



Fig. 9. Uma mensagem sobre um soquete ocupado ao inserir a senha do modo de controle.

Fig. 10. modo de controle W5500.

O comando echo desativa ou ativa o retorno do caractere impresso ao terminal (auto-monitoramento). Os dois comandos a seguir são para leitura e gravação do registro de endereço do chip W5500. Os valores dos registradores para os endereços estão indicados na documentação do chip W5500. Eu introduzi esses comandos universais, principalmente para depuração. O comando rl reinicia imediatamente o número do soquete indicado depois. Da mesma forma, o comando sr lê o status do soquete, fornecendo seu valor como um número HEX. O comando "ens" fornece uma tabela de estados para cada soquete: estado "0" - o soquete está livre, aguardando o cliente, estado "1" - o soquete em uso normal, estado "2" - o soquete no modo de controle. Você pode inserir um número muito maior de comandos. Será útil alterar os parâmetros que se encaixam no chip no estágio de inicialização quando o dispositivo é ligado (por exemplo, parâmetros de rede), armazenando-os na memória não volátil do MK. Também pode ser útil inserir comandos especiais que controlam pinos MK adicionais gratuitos. Por exemplo, "PC0 = 1", "PC2 = 0" etc. Certifique-se de precisar do comando de configuração UART interface MK.

Considere os detalhes mais sutis do trabalho do programa MK. Além dos temporizadores mencionados acima, um temporizador é ativado, graças ao qual, a cada meio minuto, os chamados Pacotes de controle TCP "keep-alive". Isso é necessário para verificar a conexão na ausência de troca de dados do usuário. Se, por qualquer motivo, não houver confirmação do cliente dentro de um determinado período definido dentro do W5500, o chamado timeout e o soquete será reiniciado. A conexão pode ser repentinamente perdida, por exemplo, devido a uma interrupção no link de dados ou na camada física: eles puxaram um cabo Ethernet, desconectaram a Internet ou perderam uma conexão Wi-Fi, etc.

Com base na documentação do chip W5500 (folha de dados), as seguintes funções são implementadas no código do programa. Primeiramente, as funções básicas de escrever e ler o W5500 são registradas nos endereços. Funções de nível superior - redefinição de hardware, inicialização de chip, inicialização de soquete, abertura de um soquete, soquete de escuta, desconexão e fechamento do soquete, envio do comando “keep_alive”, reinicialização do soquete. A última função é uma composição das funções acima: fechar, abrir, ouvir. A maioria das funções retorna um valor de status do soquete após serem executadas. Finalmente, as funções mais básicas são processar as informações recebidas (ler no buffer RX) e processar as informações enviadas (gravar no buffer TX). Fiz recomendações sobre a implementação dessas funções no site oficial do fabricante do chip W5500 ( link ). A função de recebimento substitui os dados recebidos do buffer RX em seu próprio buffer não anel de 128 bytes. Esse tamanho é suficiente para aplicações simples e você não pode obter muito do microcontrolador Atmega8. O buffer TX do W5500 também transfere dados do buffer intermediário, que também é pequeno em tamanho. E, por sua vez, os dados do buffer de anel UART entram nele. O último é implementado automaticamente no ambiente de desenvolvimento do CVAVR usando o utilitário CodeWizardAVR no estágio de criação do projeto.

O W5500 está conectado à interface MKI SPI (MOSI, MISO, SCK, SCLK). Além disso, o pino RST (reset de hardware) é conectado a uma saída MK específica e o pino INT correspondente é conectado à entrada de interrupção externa INT0. Este último é usado para a finalidade a que se destina: Quando um evento ocorre no módulo W5500, ele gera um pulso no pino INT, que é processado pelo controlador no corpo da interrupção externa. O MK aprende em quais soquetes o evento ocorreu e, em seguida, reescreve os códigos de eventos para cada soquete em uma matriz específica. O processamento adicional da interrupção ocorre dentro do loop principal do programa. No total, cinco eventos foram documentados: o cliente conectado, o cliente desconectado (mais precisamente, registrou uma solicitação de desconexão), os dados foram recebidos do cliente, o tempo limite funcionou e os dados foram enviados com sucesso. No loop principal, todos os eventos, exceto o último, são processados. A instrução switch-case é colocada nesse processamento. A maior parte do código C é encontrada na seção de processamento do terceiro evento (recepção de dados). Nele, após a função de processar as informações recebidas, o operador de caixa de comutação também é colocado, mas neste caso, essa “chave” é associada a uma variável responsável pelo estado do soquete mencionado acima (valores 0, 1, 2). A primeira seção é responsável pelo procedimento de reconhecimento de senha. Os caracteres recebidos são substituídos em um buffer de senha separado. Sob certas condições, as funções de comparar a cadeia recebida com cadeias constantes contendo senhas funcionam.No caso de uma coincidência, o estado correspondente é atribuído. A segunda seção é a mais simples - o conteúdo de seu próprio buffer de informações recebidas é redirecionado para o UART do microcontrolador. Este é um modo de uso normal. A terceira seção (a maior) é responsável pelo processamento de comandos - modo de controle do dispositivo.

Além de continuar o manipulador de interrupções, o loop principal do programa contém manipuladores de timer virtual - um tempo limite para desconectar a conexão quando a senha não é bem-sucedida, enviando "keep-alive" periodicamente e enviando um pacote formado pelo timer TCP para o cliente. A função de leitura do UART também é colocada no corpo do loop principal, dentro do qual os caracteres recebidos pelo controlador são transferidos para seu próprio buffer de transmissão (intermediário) e o timer é redefinido, responsável pela formação do pacote TCP.

Todos os procedimentos do soquete são colocados em um ciclo de 0 a 7, cujo iterador é vinculado ao número do soquete. Assim, ocorre o processamento seqüencial de todos os soquetes. Inicialmente, quis dizer que, se você atribuir o mesmo número de porta a cada um dos oito soquetes, poderá conectar até oito usuários na mesma porta. No entanto, essa configuração não funcionou e esse problema foi adiado para o futuro.

Ao projetar o design da placa de circuito, forneci um relógio em tempo real (RTC) no chip DS1307. O Atmega8 MK, quartzo para a frequência 11.0592 MHz (frequência selecionada para precisão UART), um conector para o módulo W5500, conectores de porta MK (incluindo SPI para firmware, UART), RTC com seu próprio quartzo e compartimento de bateria CR2032 estão localizados em uma placa de circuito impresso de dois lados , Regulador linear de 5 V (7805), conector de alimentação e muito mais. O esboço da placa de circuito impresso no programa Sprint Layout é mostrado na Figura 11. O único elemento mostrado em vermelho é soldado na parte traseira, mas eu o soltei na parte frontal.

Fig. 11. Esboço da placa de circuito.

As fotos da construção finalizada são apresentadas na Figura 12. Um relógio nesta construção será usado para marcar o tempo durante vários eventos dos soquetes do W5500, e esse tempo será atribuído ao usuário no terminal próximo à mensagem, se o usuário estiver conectado no modo de controle. Além disso, o relógio será útil no futuro para experimentos com o protocolo de hora NTP ou para qualquer outro propósito.

Fig. 12. Fotos da estrutura acabada.

Concluindo, vale a pena notar que o design interno justifica, em grande parte, dispositivos similares de nível industrial. A principal vantagem é o preço. Acabou sendo muito mais barato fabricar do que o preço de um dispositivo similar acabado. E uma desvantagem como funcionalidade limitada é inevitável. Nesse caso, foi utilizado um controlador Atmega8 simplificado, uma vez que o objetivo simplificado correspondente foi definido.

Fig. 13. Conversor industrial TCP / IP - RS-232.

A Figura 13 mostra um exemplo de um conversor industrial de TCP / IP para RS-232 baseado no chip W5100, muito semelhante ao W5500. Além de sua interface de gerenciamento flexível, possui mais uma vantagem. Além de trabalhar com um terminal TCP / IP, é possível usar um driver especial que acompanha o dispositivo para instalar uma porta COM virtual no lado do cliente. Através dele, você pode conectar usando um terminal comum que não possui o modo de conexão TCP / IP. Além disso, o dispositivo pode oferecer suporte à troca de dados completa do RS-232 se houver algum programa conectado ao invés do terminal através de uma porta COM virtual. Ou seja, o dispositivo representado na Figura 13 é uma ponte RS-232 completa através da infraestrutura de rede.

Source: https://habr.com/ru/post/pt414211/


All Articles