Table of Contents

Ethernet

Conhecimento prévio: [HW] Módulo de Controlo

A parte da biblioteca que se segue contém as funções ethernet do HomeLab.

Constantes

  • static uint8_t mymac[6] = {0x54,0x55,0x58,0x10,0x00,0x24} - controlador do MAC address (pode ser escolhida um MAC address aleatório, mas é importante que seja único na rede).
  • static uint8_t myip[4] = {192,168,1,100} - endereço IP address na LAN, o último dígito tem de ser diferente se já existe na rede.
  • static uint8_t buf[BUFFER_SIZE+1] - tamanho do buffer de dados (tipicamente 600+1 B).

Funções

  • void ethernet_standby(void)

Põe o controlador Ethernet em modo sleep (baixo consumo energético).

  • void ethernet_init(uint8_t *mac, uint8_t *ip)

Configuração inicial do controlador Ethernet com endereços IP e MAC.

  Parâmetros:
  * //*mac// - array de endereço MAC.
  * //*ip// - array de endereço de IP.
  • uint16_t ethernet_get_packet (uint16_t maxlen, uint8_t* packet)

Pesquisa a rede até receber um pacote a ele endereçado e com dados.

  Parâmetros:
  * //maxlen// - tamanho máximo permitido do buffer de dados.
  * //*buffer// - array para gravação dos dados recebidos para operações posteriores.
  * Se um pacote chegou, devolve o tamanho do mesmo em bytes, caso contrário devolve 0.
  • uint16_t ethernet_analyse_packet(uint8_t *buf,uint16_t plen)

Verifica se o pacote recebido contém informação sobre o URL. Responde a ping se for necessário.

  Parâmetros:
  * //*buf// - array de dados a verificar.
  * //plen// - comprimento do pacote recebido em bytes.
  * Devolve o endereço do primeiro caracter no URL. Se o URL for vazio, devolve 0
  • uint16_t ethernet_load_data (uint8_t *buf,uint16_t pos, const prog_char *progmem_s)

Carrega código HTML de uma página web da memória do controlador para o buffer de envio do TCP.

  Parâmetros:
  * //*buf// - array de dados para envio usando TCP.
  * //pos// - endereço do fim dos dados no buffer que tem de ser mantido caso os dados sejam carregados numa queue. O primeiro endereço é 0.
  * //*progmem_s// - nome de string que é gravado na memória do programa e de onde os dados são carregados para o buffer de envio.
  * Devolve o endereço do fim do array de dados que pode ser usado como parâmetro de entrada para carregar o próximo código HTML.
  • void ethernet_print_webpage (uint8_t *buf,uint16_t dlen)

Mostra uma página web de acordo com o código HTML pré-carregado.

  Parâmetros:
  * //*buf// - Array de dados onde o HTML foi carregado.
  * //dplen// - Endereço do fim dos dados no buffer a ser mostrado como código HTML.

 

Exemplo

#include <string.h>
#include <homelab/module/ethernet.h>
#include <homelab/pin.h>
 
//	Function for compiling webpage
uint16_t ethernet_load_webpage(uint8_t on_off);
 
// MAC and IP must be unique in network,
// same addresses in two devices are not allowed.
// Random MAC address (usually no need to change it)
static uint8_t mymac[6] = {0x54,0x55,0x58,0x10,0x00,0x24};
 
// IP according to LAN (you need to choose the last number)
static uint8_t myip[4] = {192,168,1,100};
 
//length of data array
static uint16_t gPlen; 
 
//Data buffer size
#define BUFFER_SIZE 600
static uint8_t buf[BUFFER_SIZE+1];
 
//LED PB7 variable
pin debug_led = PIN(B, 7);
 
 
int main(void)
{
 
	uint16_t pktlen;
	char *str;  
 
	// LED PB7 is output
	pin_setup_output(debug_led);
 
	// Etherneti initialization with given addresses
	ethernet_init(mymac, myip);			
 
        while(1)
	{
	// Receive packets until it receives addressed to him with data
    	pktlen=ethernet_get_packet(BUFFER_SIZE, buf);
 
        // Performs packet preconditioning and answer to "ping" packet. 
        // Returns packet URL.
        gPlen=ethernet_analyse_packet(buf,pktlen);
 
	// If URL contains info, start analyzing it
        if (gPlen!=0)
	{               
            // Load URL address part into "str". 
            // The first 4 digits are IP address numbers.
            str = (char *)&(buf[gPlen+4]);
 
			// Find string "/1" from URL              
			if (strncmp("/1",str,2)==0)
			{
	                        // Load webpage
				gPlen = ethernet_load_webpage(0);
 
				// LED on
				pin_clear(debug_led);		
 
	                 }
			// At next, find string "/0" from URL
			else if (strncmp("/0",str,2)==0)
			{
	                        // Load webpage
				gPlen = ethernet_load_webpage(1);
 
				// LED on
				pin_set(debug_led);
 
	                 }
			// In other cases load webpage according to LED condition
	                else 
			{	           
	                   gPlen=ethernet_load_webpage(pin_get_value(debug_led));
	                }                                    
 
			// Display preloaded webpage                
                        ethernet_print_webpage (buf,gPlen);    			            
		}
    }
    return (0);
}
 
 
// Webpage will be loaded by writing data into TCP send buffer
uint16_t ethernet_load_webpage(uint8_t on_off)
{
    uint16_t plen=0; 
 
	// Load HTML-code into buffer to send it
	// Those large strings are saved into program memory using PSTR macro,
	// to save SRAM
 
	// Load webpage header
 
	plen=ethernet_load_data(buf,0,PSTR
	("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nPragma: no-cache\r\n\r\n"));
 
	plen=ethernet_load_data(buf,plen,PSTR("<center><p>Homelab PB7 LED: "));
 
    // if LED is off, display it
    if (on_off)
    {
      plen=ethernet_load_data(buf,plen,PSTR("<font color=\"#00FF00\"> OFF</font>"));
    }
    // if LED is on
    else
    {
      plen=ethernet_load_data(buf,plen,PSTR("<font color=\"#FF0000\"> ON</font>"));
    }
    // Lae "Refresh" nupp
    plen=ethernet_load_data(buf,plen,PSTR
    (" <small><a href=\".\">[refresh status]</a></small></p>\n<p><a href=\"."));
 
    // Load the button for LED condition change.
    if (on_off)
    {
        plen=ethernet_load_data(buf,plen,PSTR("/1\">Switch on</a><p>"));
 
    }
    else
    {
         plen=ethernet_load_data(buf,plen,PSTR("/0\">Switch off</a><p>"));
 
    } 
 
    // Return the end address of data in buffer
    return(plen);
}
pt/software/homelab/library/module/ethernet.txt · Last modified: 2020/07/20 09:00 by 127.0.0.1
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0