Jump to content

    

Ethernet И FreeRTOS

Добрый день!!! Используем в качестве основы веб-сервер от FreeRTOS (контроллер AT91SAM7x256).

В ходе работы возникли следующие вопросы:

1) Как открыть второй порт ethernet?

2) КАк его открыть не на чтение а на запись?

3) Как через этот порт можно отправить уведомление (к примеру) по email'у?

4) Почему-то длина запросов веб-серверу (типа "?\123.txt") ограничивается 18 символами, как можно увеличить длину строки.

 

P.S. Хотя бы подскажите, плз, в каких файлах рыть :unsure:

Share this post


Link to post
Share on other sites

:crying: и неужели никто не может помочь?? ну хыть намекните на решение проблемы, пожалуйстааа

Share this post


Link to post
Share on other sites

А чем собственно второй порт отличается от всех остальных для lwIP?

 

Вот кусок кода с простеньким эзернет клиентом и сервером, когда-то давным давно делали тестовое приложение, которое гоняло данные по кольцу эзернет сервер - радио клиент to радио сервер эзернет клиент на двух устройствах. Модули были в офисной сети.

 

порты правда были

/* The client and the server ports. */

#define TCP_SERVER_PORT (1200)

#define TCP_CLIENT_PORT (1201)

Но я думаю через остальные тоже запахало бы. По крайней мере через HTTP порт(80) прокатывало.

 

К слову это не единственный способ работа с lwIP. Можно через Беркли сокеты, можно помойму ещё как-то. Почитайте их сайт, там маловато, но в принципе достаточно инфы, чтобы начать ковырять исходники.

 

#ifdef ETHERNET_SERVER
/******************************************************************************* 
  Process an incoming connection on port TCP_SERVER_PORT.

  This simply checks to see if the incoming data contains a data, and
  copy data to radio buffer. The connection is then
  closed. A more complete implementation could create a task for each 
  connection. 
  
  Pararmeter:
    pxNetCon - pointer to server netconn structure
********************************************************************************/
static void ethProcessConnection(struct netconn *pxNetCon)
{
  struct netbuf *pxRxBuffer;
  portCHAR *pcRxString;
  unsigned portSHORT usLength;

  /* We expect to immediately get data. */
  pxRxBuffer = netconn_recv(pxNetCon);

  BSP_OnLed(LED_RED);
  if(NULL != pxRxBuffer)
  {
    /* Where is the data? */
    netbuf_data(pxRxBuffer, (void *)&pcRxString, &usLength);       
    
    if (APP_BUFF_SIZE == usLength)
    {
      /* copy data to ethernet buffer */
      memcpy(appBuffers.eth.data, pcRxString, APP_BUFF_SIZE);
      appBuffers.eth.ready = true;
      netbuf_delete(pxRxBuffer);
      BSP_OffLed(LED_RED);
    }
  }
  else
  {
    dbgu_print_ascii("There isn't data in clients request \n\r");    
  }
  //netconn_close(pxNetCon);
}

/******************************************************************************* 
  Task of ethernet server
  Parameter:
     pvParameters - FreeRTOS task parameter
********************************************************************************/
void ethServer(void *pvParameters)
{
    /* waitning connection structure */
    struct netconn *pxWaitConnection;
    /* Getting connection structure */
    struct netconn *pxNewConnection = NULL;
    /* IP addresses */
    struct ip_addr xIpAddr, xNetMast, xGateway;
    extern err_t ethernetif_init( struct netif *netif );
    /* pre-allocated netif structure */ 
    static struct netif EMAC_if;

    /* Parameters are not used - suppress compiler error. */
    (void)pvParameters;

    /* Create and configure the EMAC interface. */
    /* Set IP address of device */
    IP4_ADDR(&xIpAddr,emacIPADDR0,emacIPADDR1,emacIPADDR2,emacIPADDR3);
    /* Set IP address of subnet */
    IP4_ADDR(&xNetMast,emacNET_MASK0,emacNET_MASK1,emacNET_MASK2,emacNET_MASK3);
    /* Set IP address of gateway */
    IP4_ADDR(&xGateway,emacGATEWAY_ADDR0,emacGATEWAY_ADDR1,emacGATEWAY_ADDR2,emacGATEWAY_A
DDR3);
    /**
     * Add a network interface to the list of lwIP netifs.
     *
     * @param netif a pre-allocated netif structure
     * @param ipaddr IP address for the new netif
     * @param netmask network mask for the new netif
     * @param gw default gateway IP address for the new netif
     * @param state opaque data passed to the new netif
     * @param init callback function that initializes the interface
     * @param input callback function that is called to pass
     * ingress packets up in the protocol layer stack.
     *
     * @return netif, or NULL if failed.
     */
    netif_add(&EMAC_if, &xIpAddr, &xNetMast, &xGateway, NULL, ethernetif_init, tcpip_input);

    /* make it the default interface */
    netif_set_default(&EMAC_if);

    /* bring it up */
    netif_set_up(&EMAC_if);
    
    /* Create a new tcp connection handle */
    pxWaitConnection = netconn_new(NETCONN_TCP);
    netconn_bind(pxWaitConnection, NULL, TCP_SERVER_PORT);
    netconn_listen(pxWaitConnection);

    /* Wait for connection. */
    for (;;)
    {
      pxNewConnection = netconn_accept(pxWaitConnection);
      if (NULL != pxNewConnection)
        break;
    }
    
    /* Loop forever */
    for(;; )
    {
         /* Service connection. */
        ethProcessConnection(pxNewConnection);
    }
}

#else

/******************************************************************************* 
  Task of ethernet client
  Parameter:
     pvParameters - FreeRTOS task parameter
********************************************************************************/
void ethClient(void *pvParameters)
{
    /* waitning connection structure */
    struct netconn *pxWaitConnection = NULL;
    /* IP addresses */
    struct ip_addr xIpAddr, xNetMast, xGateway;
    /* server IP address */
    struct ip_addr xIpServer;
    /* pre-allocated netif structure */ 
    static struct netif EMAC_if;
    
    /* initialization netif structure and EMAC automat */
    extern err_t ethernetif_init(struct netif *netif);
    
    /* evry step statiion */
    //uint8_t sendError = CONNECTION_ERROR;    

    /* Parameters are not used - suppress compiler error. */
    (void)pvParameters;

    /* Create and configure the EMAC interface. */
    /* Set IP address of device */
    IP4_ADDR(&xIpAddr,emacIPADDR0,emacIPADDR1,emacIPADDR2,emacIPADDR3);
    /* Set IP address of subnet */
    IP4_ADDR(&xNetMast,emacNET_MASK0,emacNET_MASK1,emacNET_MASK2,emacNET_MASK3);
    /* Set IP address of gateway */
    IP4_ADDR(&xGateway,emacGATEWAY_ADDR0,emacGATEWAY_ADDR1,emacGATEWAY_ADDR2,emacGATEWAY_A
DDR3);
    /* Set IP address of server */
    IP4_ADDR(&xIpServer,emacServer_ADDR0,emacServer_ADDR1,emacServer_ADDR2,emacServer_ADDR
3);
    /**
     * Add a network interface to the list of lwIP netifs.
     *
     * @param netif a pre-allocated netif structure
     * @param ipaddr IP address for the new netif
     * @param netmask network mask for the new netif
     * @param gw default gateway IP address for the new netif
     * @param state opaque data passed to the new netif
     * @param init callback function that initializes the interface
     * @param input callback function that is called to pass
     * ingress packets up in the protocol layer stack.
     *
     * @return netif, or NULL if failed.
     */
    netif_add(&EMAC_if, &xIpAddr, &xNetMast, &xGateway, NULL, ethernetif_init, tcpip_input);

    /* make it the default interface */
  netif_set_default(&EMAC_if);

    /* bring it up */
  netif_set_up(&EMAC_if);
    
newTcpConnection:
  pxWaitConnection = netconn_new(NETCONN_TCP);
  if (NULL == pxWaitConnection)
  {
    dbgu_print_ascii("Connection structure doesn't create \n\r");
    for (;;)
      vTaskDelay(SHORT_DELAY);
  }
  
  // Data is ready. Try to establish a connection with server.
  while (1)
  {
    if (true == appBuffers.rf.ready)
    {
      if (ERR_OK == netconn_connect(pxWaitConnection, &xIpServer, TCP_SERVER_PORT))
        break;
      else
        dbgu_print_ascii("TCP connection doesn't set \n\r");
    }
    else
    {
      vTaskDelay(SHORT_DELAY);
    }
  }
  
  for (;;)
  {
    if (true == appBuffers.rf.ready)  // there is data from radio
    {
      BSP_OnLed(LED_RED);
      memcpy(appBuffers.eth.data, appBuffers.rf.data, APP_BUFF_SIZE);
      if (ERR_OK != netconn_write(pxWaitConnection, appBuffers.eth.data, APP_BUFF_SIZE, 0))
      {
        dbgu_print_ascii("Ethernet client data doesn't send \n\r");
        pxWaitConnection = NULL;
        while (ERR_OK != netconn_delete(pxWaitConnection))
        {
          vTaskDelay(SHORT_DELAY);
        }
        goto newTcpConnection;
      }
      // transmission is completed.                       
      appBuffers.rf.ready = false;      
      BSP_OffLed(LED_RED);  
    }
    else
    {
      vTaskDelay(SHORT_DELAY);
    }
  }
}
#endif

 

Приложение как можно видеть было сделано на основе фриртосного апликейшена.

Share this post


Link to post
Share on other sites
А чем собственно второй порт отличается от всех остальных для lwIP?

 

Приложение как можно видеть было сделано на основе фриртосного апликейшена.

 

Благодарю, спасибо)) Будем разбираться, правда, у нас не lwip, a uip.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this