搜索
bottom↓
回复: 77

贡献我的远程网络监控系统

  [复制链接]

出0入0汤圆

发表于 2014-6-19 10:00:43 | 显示全部楼层 |阅读模式
  本次使用宝马LPC1768作为实验平台,在“裸机+lwip WEB服务器”例程的基础上进行添加修改,将宝马LPC1768作为WEB服务器,电脑通过IE浏览器访问LPC1768开发板,LPC11C14定时采集滑动变阻器值和DS18B20温度,通过CAN总线传送给1768开发板,如下图是远程网络监控结构图

  电脑网页显示界面如下,设置LPC11C14 CAN节点ID分别为0x0001 0x0002,将LPC1768与LPC11C14设置为CAN滤波方式,采集到温度值与电压值,通过按键控制LPC11C14节点的LED灯状态亮灭,传送格式为

      网页文件采用html语言编写,然后使用makefsdata.exe将网页文件转换成数组,为了较少数据量,我们这里只取网页部分,即下面选中的部分,如果我们对Ascll码比较熟悉,可以看到我们选中部分就是网页文件的Ascll码数组,makefsdata.exe使用方法:将网页文件存放在fs文件夹下面,点击makefsdata.exe即可生成fsdata.c文件,即下面截图文件

打开IE浏览器输入IP地址显示如下网页,点击网页上面的按键对LPC11C14上面的LED灯进行控制




设置路由器通过外网监控开发板,其设置可以参考下面链接
UCOS II/Rtthread/裸机+lwip WEB服务器搭建
http://www.amobbs.com/thread-5584125-1-1.html
(出处: amoBBS 阿莫电子论坛)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2014-6-19 11:46:35 | 显示全部楼层
虽然目前用不上,但是还是给楼主赞一个

出0入0汤圆

发表于 2014-6-19 13:40:01 | 显示全部楼层
很实用的例子!

出0入0汤圆

发表于 2014-6-19 18:01:32 | 显示全部楼层
赞一个,楼主大神

出0入0汤圆

发表于 2014-6-19 18:05:08 | 显示全部楼层
发错版面了                  

出0入0汤圆

发表于 2014-6-19 20:15:05 | 显示全部楼层

出0入0汤圆

发表于 2014-6-19 22:38:42 | 显示全部楼层
                     

出0入0汤圆

发表于 2014-6-20 08:31:18 | 显示全部楼层
很实用的例子!

出0入0汤圆

发表于 2014-6-20 08:46:40 | 显示全部楼层
mark

出0入0汤圆

发表于 2014-6-20 09:06:42 | 显示全部楼层
看走眼了,以为是远程视频监控。。。
这么做,是不是得有一端的IP地址是固定的?或者有动态域名?

出350入8汤圆

发表于 2014-6-20 09:07:32 | 显示全部楼层
好东西,收藏先!

出0入4汤圆

发表于 2014-6-20 09:09:38 | 显示全部楼层
顶一个      

出0入57汤圆

发表于 2014-6-20 09:12:34 | 显示全部楼层
我还想汽车上面怎么扯网线,原来宝马是开发板的名字……

出0入0汤圆

 楼主| 发表于 2014-6-20 09:25:08 | 显示全部楼层
zzfei 发表于 2014-6-20 09:06
看走眼了,以为是远程视频监控。。。
这么做,是不是得有一端的IP地址是固定的?或者有动态域名? ...

是的,视屏监控数据量太大,用这个速度跟不上

出0入0汤圆

发表于 2014-6-20 16:15:39 | 显示全部楼层
好东西,谢谢分享,鼓励一下

出0入0汤圆

发表于 2014-6-20 16:22:54 | 显示全部楼层
这个非常有借鉴意义!非常实用。

出0入0汤圆

发表于 2014-6-20 17:29:14 | 显示全部楼层
很好的实例,多谢

出0入0汤圆

 楼主| 发表于 2014-6-24 09:50:55 | 显示全部楼层
lzchuo 发表于 2014-6-20 17:29
很好的实例,多谢

有需要也可以看看这个,比较常用的
简单的串口转网络双向传输
http://www.amobbs.com/thread-5584300-1-1.html
(出处: amoBBS 阿莫电子论坛)

出0入0汤圆

发表于 2014-6-24 09:59:26 | 显示全部楼层
jeansonm 发表于 2014-6-24 09:50
有需要也可以看看这个,比较常用的
简单的串口转网络双向传输
http://www.amobbs.com/thread-5584300-1-1 ...

楼主你好,我看了下你的这个例子,我的代码跟你的框架也差不多,TCP客户端的时候收发数据都正常,
但是碰到个BUG,如果服务器不打开,客户端每隔几秒钟重新连接一次,这样几分钟后就死机了,
voidtcp_fasttmr(void)函数里出现pcb = pcb->next的情况,想请教下楼主这个问题。

出0入0汤圆

 楼主| 发表于 2014-6-24 18:02:23 | 显示全部楼层
gerbansh520 发表于 2014-6-24 09:59
楼主你好,我看了下你的这个例子,我的代码跟你的框架也差不多,TCP客户端的时候收发数据都正常,
但是碰 ...

你是说做客户端的时候,当主机服务器没有打开时,尝试连接几次后就死机了吗?是进入硬件中断了还是ping不通了?

出0入0汤圆

发表于 2014-6-25 08:45:04 | 显示全部楼层
jeansonm 发表于 2014-6-24 18:02
你是说做客户端的时候,当主机服务器没有打开时,尝试连接几次后就死机了吗?是进入硬件中断了还是ping不 ...

死机的时候可以ping通,也能进入硬件中断,但是如果在中断里设断电的话就死在中断循环里了,
void ENET_IRQHandler (void)
{
        uint32_t status;
        while ((status = (LPC_EMAC->IntStatus & LPC_EMAC->IntEnable)) != 0)        
        {
                LPC_EMAC->IntClear = status;       
                if ((status & EMAC_INT_RX_DONE))               
                {
                        LwIP_Pkt_Handle();
                }
        }
}
不设断电的话 程序死在另外一个地方
void tcp_fasttmr(void)
{
  struct tcp_pcb *pcb;

  for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
。。。pcb 与pcb->next相等就死了

出0入0汤圆

发表于 2014-6-25 08:46:43 | 显示全部楼层
jeansonm 发表于 2014-6-24 18:02
你是说做客户端的时候,当主机服务器没有打开时,尝试连接几次后就死机了吗?是进入硬件中断了还是ping不 ...

是的,服务器不开启,客户端一直尝试连接,大概尝试了几十次就死机了

出0入0汤圆

 楼主| 发表于 2014-6-25 09:29:41 | 显示全部楼层
gerbansh520 发表于 2014-6-25 08:46
是的,服务器不开启,客户端一直尝试连接,大概尝试了几十次就死机了

我昨天测试尝试客户端每隔4S重连一次,过了二十分钟左右没有出现死机的情况,把你的客户端程序发上来看看

出0入0汤圆

发表于 2014-6-25 09:56:10 | 显示全部楼层
本帖最后由 gerbansh520 于 2014-6-25 10:02 编辑
jeansonm 发表于 2014-6-25 09:29
我昨天测试尝试客户端每隔4S重连一次,过了二十分钟左右没有出现死机的情况,把你的客户端程序发上来看看 ...


上传不了附件,不知道为什么 多谢。。
/***********************************************************************
函数名称:client_data_process(void)
功    能:客户端数据处理函数
***********************************************************************/
//System_Periodic_Handle函数中调用 client_data_process,系统每隔250ms扫描一次
void client_data_process(void)
{
        const char content[] = "Hello, PC!\r\n";

//client_err==0 未初始化成功; client_err == 1 连接错误; client_err==2 初始化成功;
  if(client_err < 2)
  {
                use_err++;
    if(use_err > 12)//客户端如果不能正常初始化,每隔250ms*12=3秒重新初始化
    {
        use_err=0;
      tcp_client_init();
        led_on(1);
      //UART0_SendByte(0xc1);UART0_SendByte(0xc2);
        UART0_SendString("Retry connect every 3s\r\n",sizeof("Retry connect every 3s\r\n"));
    }        
  }
  else if(client_err == 2)//客户端正常连接,每隔250ms*4=1s向PC服务器发送数据
  {
                Send_Time++;
    /*if((client_pcb->state == ESTABLISHED) && (Send_Time>=4))
    {
                        switch(client_pcb->state)
                  {
                                 case CLOSED:      UART0_SendStr("0  CLOSED\r\n");     break;
                           case LISTEN:      UART0_SendStr("1  LISTEN\r\n");     break;
                           case SYN_SENT:    UART0_SendStr("2  SYN_SENT\r\n");   break;
                           case SYN_RCVD:    UART0_SendStr("3  SYN_RCVD\r\n");   break;
                           case ESTABLISHED: UART0_SendStr("4  ESTABLISHED\r\n");break;
                           case FIN_WAIT_1:  UART0_SendStr("5  FIN_WAIT_1\r\n"); break;
                           case FIN_WAIT_2:  UART0_SendStr("6  FIN_WAIT_2\r\n"); break;
                           case CLOSE_WAIT:  UART0_SendStr("7  CLOSE_WAIT\r\n"); break;
                           case CLOSING:     UART0_SendStr("8  CLOSING\r\n");    break;
                           case LAST_ACK:    UART0_SendStr("9  LAST_ACK\r\n");   break;
                           case TIME_WAIT:   UART0_SendStr("10 TIME_WAIT\r\n");  break;
                  }
                        tcp_write(client_pcb, content, sizeof(content), TCP_WRITE_FLAG_COPY);
                        //UART0_SendByte(0xc3);UART0_SendByte(0xc4);
                        UART0_SendString("Hello, PC!\r\n",sizeof("Hello, PC!\r\n"));
                        //led_on(2);
      Send_Time = 0;
    }*/
    if(Send_Time>=4)//1秒钟打印一次状态
    {                   
                  switch(client_pcb->state)
                  {
                                 case CLOSED:      UART0_SendStr("0  CLOSED\r\n");     break;
                           case LISTEN:      UART0_SendStr("1  LISTEN\r\n");     break;
                           case SYN_SENT:    UART0_SendStr("2  SYN_SENT\r\n");   break;
                           case SYN_RCVD:    UART0_SendStr("3  SYN_RCVD\r\n");   break;
                           case ESTABLISHED: UART0_SendStr("4  ESTABLISHED\r\n");break;
                           case FIN_WAIT_1:  UART0_SendStr("5  FIN_WAIT_1\r\n"); break;
                           case FIN_WAIT_2:  UART0_SendStr("6  FIN_WAIT_2\r\n"); break;
                           case CLOSE_WAIT:  UART0_SendStr("7  CLOSE_WAIT\r\n"); break;
                           case CLOSING:     UART0_SendStr("8  CLOSING\r\n");    break;
                           case LAST_ACK:    UART0_SendStr("9  LAST_ACK\r\n");   break;
                           case TIME_WAIT:   UART0_SendStr("10 TIME_WAIT\r\n");  break;
                  }
                        tcp_write(client_pcb, content, sizeof(content), TCP_WRITE_FLAG_COPY);
                        UART0_SendString("Hello, PC!\r\n",sizeof("Hello, PC!\r\n"));
                        //led_on(2);
      Send_Time = 0;
    }
        }
}
/***********************************************************************
函数名称:static void tcp_client_err(void *arg, err_t err)
功    能:连接错误时处理的回调函数
***********************************************************************/
static void tcp_client_err(void *arg, err_t err)
{
  switch(err)
  {
    case ERR_OK:    UART0_SendStr("0   ERR_OK\r\n");  break;      
    case ERR_MEM:   UART0_SendStr("-1  ERR_MEM\r\n"); break;
    case ERR_BUF:   UART0_SendStr("-2  ERR_BUF\r\n"); break;
    case ERR_TIMEOUT: UART0_SendStr("-3  ERR_TIMEOUT\r\n"); tcp_close(client_pcb); client_err=1;break;
    case ERR_RTE:   UART0_SendStr("-4  ERR_RTE\r\n"); break;
    case ERR_ABRT:  UART0_SendStr("-5  ERR_ABRT\r\n");      tcp_close(client_pcb); client_err=1; break;
    case ERR_RST:   UART0_SendStr("-6  ERR_RST\r\n");       tcp_close(client_pcb); client_err=1; break;
    case ERR_CLSD:  UART0_SendStr("-7  ERR_CLSD\r\n");      tcp_close(client_pcb); client_err=0; break;
    case ERR_CONN:  UART0_SendStr("-8  ERR_CONN\r\n");      tcp_close(client_pcb); client_err=0; break;
    case ERR_VAL:   UART0_SendStr("-9  ERR_VAL\r\n");    break;
    case ERR_ARG:   UART0_SendStr("-10 ERR_ARG\r\n");    break;
    case ERR_USE:   UART0_SendStr("-11 ERR_USE\r\n");    break;
    case ERR_IF:    UART0_SendStr("-12 ERR_IF\r\n");     break;
    case ERR_ISCONN: UART0_SendStr("-13 ERR_ISCONN\r\n");break;
    case ERR_INPROGRESS: UART0_SendStr("-14 ERR_INPROGRESS\r\n");break;
  }
  switch(client_pcb->state)
  {
    case CLOSED:      UART0_SendStr("0  CLOSED\r\n");     tcp_close(client_pcb); client_err=0;  break;
    case LISTEN:      UART0_SendStr("1  LISTEN\r\n");     break;
    case SYN_SENT:    UART0_SendStr("2  SYN_SENT\r\n");   break;
    case SYN_RCVD:    UART0_SendStr("3  SYN_RCVD\r\n");   break;
    case ESTABLISHED: UART0_SendStr("4  ESTABLISHED\r\n");break;
    case FIN_WAIT_1:  UART0_SendStr("5  FIN_WAIT_1\r\n"); break;
    case FIN_WAIT_2:  UART0_SendStr("6  FIN_WAIT_2\r\n"); break;
    case CLOSE_WAIT:  UART0_SendStr("7  CLOSE_WAIT\r\n"); break;
    case CLOSING:     UART0_SendStr("8  CLOSING\r\n");    break;
    case LAST_ACK:    UART0_SendStr("9  LAST_ACK\r\n");   break;
    case TIME_WAIT:   UART0_SendStr("10 TIME_WAIT\r\n");  break;
  }        
}
/**
  * @brief  Connects to the TCP echo server
  * @param  None
  * @retval None
  */
volatile uint8_t pcb_flag=0;
void tcp_client_init(void)
{
  struct ip_addr DestIPaddr;
        client_err = 0;//只要进入初始化重新清零
  /* create new tcp pcb */
        //if(pcb_flag == 0)
        //{
                client_pcb = tcp_new();   
        //}               
  if (client_pcb != NULL)
  {
                //pcb_flag=1;
    IP4_ADDR( &DestIPaddr, 10, 16, 4, 26 );//写远程服务器IP
    tcp_bind(client_pcb, IP_ADDR_ANY, 4080);//绑定开发板IP和端口号 客户端的端口号随机
    //UART0_SendStr("state2\r\n");
    /* connect to destination address/port */
        //配置要连接的远程服务器IP地址和端口号,端口号:8080
    //tcp_connect(client_pcb,&DestIPaddr,8080,tcp_client_connected);
        if(tcp_connect(client_pcb,&DestIPaddr,8080,tcp_client_connected) == ERR_OK)
    {
        //client_pcb->so_options |= SOF_KEEPALIVE;
        //UART0_SendByte(0x91);
      //client_err = 2;//初始化成功
        if(client_err == 2)
        {
                UART0_SendStr("client_err = 2\r\n");
                UART0_SendString("The tcp_client_init OK\r\n",sizeof("The tcp_client_init OK\r\n"));
        }
    }        
    else        
    {
      //UART0_SendByte(0x92);
      client_err = 0;//未初始化成功
        //UART0_SendStr("state4\r\n");
        UART0_SendString("The tcp_client_init not OK\r\n",sizeof("The tcp_client_init not OK\r\n"));
    }
    tcp_err(client_pcb, tcp_client_err);
  }
}

/**
  * @brief Function called when TCP connection established
  * @param tpcb: pointer on the connection contol block
  * @param err: when connection correctly established err should be ERR_OK
  * @retval err_t: returned error
  */
static err_t tcp_client_connected(void *arg, struct tcp_pcb *tpcb, err_t err)
{
  struct client *es = NULL;
  const char content[] = "This is Tcp_Client\r\n";
        //UART0_SendByte(0xA0);
  if (err == ERR_OK)   
  {
        client_err = 2;//初始化成功进入回调函数
        //UART0_SendByte(0xA1);
    /* allocate structure es to maintain tcp connection informations */
    es = (struct client *)mem_malloc(sizeof(struct client));
  
    if (es != NULL)
    {
      es->state = ES_CONNECTED;
      es->pcb = tpcb;
      
      //sprintf((char*)data, "sending tcp client message %d", message_count);
//UART0_SendByte(0x11);  
      /* allocate pbuf */
      es->p_tx = pbuf_alloc(PBUF_TRANSPORT, strlen((char*)data) , PBUF_POOL);
         
      if (es->p_tx)
      {      

        pbuf_take(es->p_tx, (char*)data, strlen((char*)data));
        tcp_arg(tpcb, es);
        tcp_recv(tpcb, tcp_client_recv);
        //tcp_sent(tpcb, tcp_client_sent);
        tcp_poll(tpcb, tcp_client_poll, 1);
        //tcp_client_send(tpcb,es);
        UART0_SendString("This is Tcp_Client\r\n",sizeof("This is Tcp_Client\r\n"));
        tcp_write(tpcb, content, sizeof(content), TCP_WRITE_FLAG_COPY);
        tcp_err(tpcb, tcp_client_err);
//UART0_SendByte(0x22);                               
        return ERR_OK;
      }
    }
    else
    {
      /* close connection */
      tcp_client_connection_close(tpcb, es);
        client_err=1;
UART0_SendByte(0xa2);                               
      /* return memory allocation error */
      return ERR_MEM;  
    }
  }
  else
  {
    /* close connection */
    tcp_client_connection_close(tpcb, es);
        client_err=1;
UART0_SendByte(0xa3);       
  }
UART0_SendByte(0xa4);
  return err;
}
   
/**
  * @brief tcp_receiv callback
  * @param arg: argument to be passed to receive callback
  * @param tpcb: tcp connection control block
  * @param err: receive error code
  * @retval err_t: retuned error  
  */
static err_t tcp_client_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)
{
  struct client *es;
  err_t ret_err;
  

  LWIP_ASSERT("arg != NULL",arg != NULL);
  
  es = (struct client *)arg;
  
  /* if we receive an empty tcp frame from server => close connection */
  if (p == NULL)
  {
    /* remote host closed connection */
    es->state = ES_CLOSING;
    if(es->p_tx == NULL)
    {
       // we're done sending, close connection
       tcp_client_connection_close(tpcb, es);
                        //UART0_SendByte(0xa3);       
                        client_err=1;
                        UART0_SendString("tcp_client__close\r\n",sizeof("tcp_client_connection_close\r\n"));
    }
    /*else
    {   
      // send remaining data               
        tcp_sent(tpcb, tcp_client_sent);
      tcp_client_send(tpcb, es);
        UART0_SendByte(0x33);
    }*/
    ret_err = ERR_OK;
  }   
  /* else : a non empty frame was received from echo server but for some reason err != ERR_OK */
  else if(err != ERR_OK)
  {
    /* free received pbuf*/
    if (p != NULL)
    {
      pbuf_free(p);
    }
    ret_err = err;
  }
  else if(es->state == ES_CONNECTED)
  {
    //tcp_sent(tpcb, tcp_client_sent);
    //tcp_client_send(tpcb, es);
        //client_pcb = tpcb;
//if(tcp_sndbuf(tpcb) > p->tot_len)
        //tcp_write(tpcb, p->payload, p->tot_len, TCP_WRITE_FLAG_COPY);               
       
    /* Acknowledge data reception */
    tcp_recved(tpcb, p->tot_len);   

        tcp_recv_flag = 1;
        //UART0_SendString(can1_buf,can1_len);
        //CAN1_Send_Data(CAN1_SEND_ID,can1_buf,can1_len);                 // payload为TCP数据块的起始位置               
    pbuf_free(p);
   
    ret_err = ERR_OK;
  }

  /* data received when connection already closed */
  else
  {
    /* Acknowledge data reception */
    tcp_recved(tpcb, p->tot_len);
    /* free pbuf and do nothing */
    pbuf_free(p);
    ret_err = ERR_OK;
  }
  return ret_err;
}

/**
  * @brief function used to send data
  * @param  tpcb: tcp control block
  * @param  es: pointer on structure of type client containing info on data
  *             to be sent
  * @retval None
  */
static void tcp_client_send(struct tcp_pcb *tpcb, struct client * es)
{
  struct pbuf *ptr;
  err_t wr_err = ERR_OK;

  while ((wr_err == ERR_OK) &&
         (es->p_tx != NULL) &&
         (es->p_tx->len <= tcp_sndbuf(tpcb)))
  {
   
    /* get pointer on pbuf from es structure */
    ptr = es->p_tx;

    /* enqueue data for transmission */
    wr_err = tcp_write(tpcb, ptr->payload, ptr->len, 1);
   
    if (wr_err == ERR_OK)
    {
      /* continue with next pbuf in chain (if any) */
      es->p_tx = ptr->next;
      
      if(es->p_tx != NULL)
      {
        /* increment reference count for es->p */
        pbuf_ref(es->p_tx);
      }
      
      /* free pbuf: will free pbufs up to es->p (because es->p has a reference count > 0) */
      pbuf_free(ptr);
   }
   else if(wr_err == ERR_MEM)
   {
      /* we are low on memory, try later, defer to poll */
     es->p_tx = ptr;
   }
   else
   {
     /* other problem ?? */
   }
  }
}

/**
  * @brief  This function implements the tcp_poll callback function
  * @param  arg: pointer on argument passed to callback
  * @param  tpcb: tcp connection control block
  * @retval err_t: error code
  */
static err_t tcp_client_poll(void *arg, struct tcp_pcb *tpcb)
{
  err_t ret_err;
  struct client *es;

  es = (struct client*)arg;
  if (es != NULL)
  {
    if (es->p_tx != NULL)
    {
      /* there is a remaining pbuf (chain) , try to send data */
      tcp_client_send(tpcb, es);
    }
    else
    {
      /* no remaining pbuf (chain)  */
      if(es->state == ES_CLOSING)
      {
        /* close tcp connection */
        tcp_client_connection_close(tpcb, es);
                                client_err=1;
                                //UART0_SendByte(0xa4);       
      }
    }
    ret_err = ERR_OK;
  }
  else
  {
    /* nothing to be done */
    tcp_abort(tpcb);
    ret_err = ERR_ABRT;
  }
  return ret_err;
}

/**
  * @brief  This function implements the tcp_sent LwIP callback (called when ACK
  *         is received from remote host for sent data)
  * @param  arg: pointer on argument passed to callback
  * @param  tcp_pcb: tcp connection control block
  * @param  len: length of data sent
  * @retval err_t: returned error code
  */
static err_t tcp_client_sent(void *arg, struct tcp_pcb *tpcb, u16_t len)
{
  struct client *es;

  LWIP_UNUSED_ARG(len);

  es = (struct client *)arg;
  
  if(es->p_tx != NULL)
  {
    tcp_client_send(tpcb, es);
  }

  return ERR_OK;
}

/**
  * @brief This function is used to close the tcp connection with server
  * @param tpcb: tcp connection control block
  * @param es: pointer on client structure
  * @retval None
  */
static void tcp_client_connection_close(struct tcp_pcb *tpcb, struct client * es )
{
  /* remove callbacks */
  tcp_recv(tpcb, NULL);
  tcp_sent(tpcb, NULL);
  tcp_poll(tpcb, NULL,0);

  if (es != NULL)
  {
    mem_free(es);
  }

  /* close tcp connection */
  tcp_close(tpcb);
  
}

#endif /* LWIP_TCP */

/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/

出0入0汤圆

发表于 2014-6-25 10:07:06 | 显示全部楼层
动确实不错,赞一个!!!

出0入0汤圆

 楼主| 发表于 2014-6-25 10:08:46 | 显示全部楼层
gerbansh520 发表于 2014-6-25 09:56
上传不了附件,不知道为什么 多谢。。
/************************************************************* ...

你的client_data_process是循环调用的吗?看你的程序是每次连接都是创建TCP连接,绑定本地IP端口,然后尝试连接。你可以试试客户端创建好之后,循环连接

出0入0汤圆

发表于 2014-6-25 10:25:59 | 显示全部楼层
jeansonm 发表于 2014-6-25 10:08
你的client_data_process是循环调用的吗?看你的程序是每次连接都是创建TCP连接,绑定本地IP端口,然后尝 ...

是的,每隔250ms循环一次,但是如果没连接成功,标志位client_err =0 然后会执行tcp_close,会释放内存的
然后又重新初始化,创建pcb连接了

出0入0汤圆

发表于 2014-6-25 10:34:40 | 显示全部楼层
jeansonm 发表于 2014-6-25 10:08
你的client_data_process是循环调用的吗?看你的程序是每次连接都是创建TCP连接,绑定本地IP端口,然后尝 ...

volatile uint8_t pcb_flag=0;
void tcp_canclient_init(void)
{
  struct ip_addr DestIPaddr;
  client_err = 0;
  if(pcb_flag == 0)
  {
        canclient_pcb = tcp_new();
        pcb_flag=1;
  }       
if(pcb_flag==1)       
{
  if (canclient_pcb != NULL)
  {               
    IP4_ADDR( &DestIPaddr, 10, 16, 4, 26 );
    tcp_bind(canclient_pcb, IP_ADDR_ANY, 4080);       
    if(tcp_connect(canclient_pcb,&DestIPaddr,8080,tcp_canclient_connected) == ERR_OK)
    {
        //canclient_pcb->so_options |= SOF_KEEPALIVE;                       
        if(client_err == 2)
        {
                UART0_SendStr("client_err = 2\r\n");
                UART0_SendString("The tcp_client_init OK\r\n",sizeof("The tcp_client_init OK\r\n"));
        }
    }        
    else        
    {      
      client_err = 0;//δ³õʼ»¯³É¹¦                       
      UART0_SendString("The tcp_client_init not OK\r\n",sizeof("The tcp_client_init not OK\r\n"));
    }
    tcp_err(canclient_pcb, tcp_client_err);
  }
}
}
改成这样后 只创建一次tcp连接,循环连接,断开服务器后再开启服务器,就连接不上了,但是跑了几分钟 没有死机

出0入0汤圆

发表于 2014-6-25 10:41:42 | 显示全部楼层
本帖最后由 gerbansh520 于 2014-6-25 10:58 编辑

如果一开始打开服务器,连接上了,然后再关闭服务器,看串口打印信息 tcp_client_recv函数会执行tcp_close的,这样就释放了这个创建的连接 后面的不重新建立连接 然后会再连不上的,
当然如果一直关闭服务器,首次打开的时候是可以连的,就是中途断开服务器连不了

出0入0汤圆

 楼主| 发表于 2014-6-25 11:06:58 | 显示全部楼层
gerbansh520 发表于 2014-6-25 10:41
如果一开始打开服务器,连接上了,然后再关闭服务器,看串口打印信息 tcp_client_recv函数会执行tcp_close ...

刚刚按照你的那种方法,连接失败后全部删除然后重新连接,是可以连接上的,在Rtthread环境下面测试的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2014-6-25 11:18:47 | 显示全部楼层
gerbansh520 发表于 2014-6-25 10:41
如果一开始打开服务器,连接上了,然后再关闭服务器,看串口打印信息 tcp_client_recv函数会执行tcp_close ...

刚刚附件不能上传

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-6-25 12:48:01 | 显示全部楼层
jeansonm 发表于 2014-6-25 11:18
刚刚附件不能上传

我也打算换RTT系统了,虽然不熟悉 但是稳定性应该比我自己裸奔做TCP客户端高,之前裸奔做服务器都没碰到什么问题的。
请问楼主,我现在客户端和PC分别接的网线到公司交换机,如果下载你传的附件程序,是不是要把客户端和PC端网线对连?
我下载了 串口0打印信息一直是Connect fail! 连不上

出0入0汤圆

发表于 2014-6-25 12:48:50 | 显示全部楼层
很实用的例子!

出0入0汤圆

 楼主| 发表于 2014-6-25 13:43:56 | 显示全部楼层
gerbansh520 发表于 2014-6-25 12:48
我也打算换RTT系统了,虽然不熟悉 但是稳定性应该比我自己裸奔做TCP客户端高,之前裸奔做服务器都没碰到 ...

是的  直接连上就行了,IP对应上

出0入0汤圆

发表于 2014-6-25 14:54:20 | 显示全部楼层
这个RTT的连接是一直等待,
/* 连接到服务端 */
while (connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1)
如果我的程序也这么做,也不会死机的,一直等到可以连接服务器,
但是这样死等待的话,如果服务器断开了 然后又开启了就连不了,因为断开后就tcp close了 释放了内存,
再重新练的话还是要再次创建的,楼主的这个程序服务器关了再开是不能再次连上的,只能连一次。
如果跟我一样的 把服务器关闭再开再关闭再开 循环,让客户端去连 估计一样会出现我的死机问题了

出0入8汤圆

发表于 2014-6-25 15:10:32 | 显示全部楼层
不错,收藏了!   

出0入0汤圆

 楼主| 发表于 2014-6-26 08:51:32 | 显示全部楼层
gerbansh520 发表于 2014-6-25 14:54
这个RTT的连接是一直等待,
/* 连接到服务端 */
while (connect(sock, (struct sockaddr *)&server_addr, s ...

没问题的  把循环改成下面的就行了
while(tcpclient("192.168.1.203",8080 ))
{
        rt_thread_delay(RT_TICK_PER_SECOND * 4);
}

测试现象

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-6-26 09:45:25 | 显示全部楼层
你上传的不是这个版本的吧 串口号是3 我下载那个附件 服务器关了后 再打开 就连不上了 串口是0

出0入0汤圆

发表于 2014-6-26 09:57:31 | 显示全部楼层
先收藏着,感谢分享,

出0入0汤圆

 楼主| 发表于 2014-6-26 13:44:57 | 显示全部楼层
gerbansh520 发表于 2014-6-26 09:45
你上传的不是这个版本的吧 串口号是3 我下载那个附件 服务器关了后 再打开 就连不上了 串口是0 ...

串口3是电脑的串口3和1768的串口0连接,早上传上去的程序是连接上后输入q断开连接,然后关闭电脑服务器。如果你想不发送q断开关闭服务器,可以添加定时发送一个TCP心跳包,如果TCP心跳包发送失败,就断开连接后重新尝试连接,今天附件上传容量达到上限了,明天传上来

出0入0汤圆

 楼主| 发表于 2014-6-27 09:14:58 | 显示全部楼层
gerbansh520 发表于 2014-6-26 09:45
你上传的不是这个版本的吧 串口号是3 我下载那个附件 服务器关了后 再打开 就连不上了 串口是0 ...



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-6-27 09:23:11 | 显示全部楼层

多谢楼主的帮助,那个问题我已经解决了,用错了tcp_abort和tcp_close 跟踪了好久
我把服务器断开 然后客户端一直重连,根本就不会收到对方的RST信号,
然后一直重新创建pcb 然后close 内存就出问题了,改成连上后断开就用close、没连上重连就abort
测试了40个小时 没有死机了 一直都可以随时连上服务器 算是稳定了吧 不过如果楼主有空也可以帮忙看看
我的工程文件吧 反正你对这个很熟悉 或许还可以帮忙看看有没其他的问题 这个只是个客户端基本的框架
后续的应用程序还没开始加载进去
百度云盘下载 链接: http://pan.baidu.com/s/1dD1mUDN 密码: d354

出0入0汤圆

 楼主| 发表于 2014-6-27 14:33:50 | 显示全部楼层
gerbansh520 发表于 2014-6-27 09:23
多谢楼主的帮助,那个问题我已经解决了,用错了tcp_abort和tcp_close 跟踪了好久
我把服务器断开 然后客 ...

好的  你的也是LPC1768的平台吗?

出0入0汤圆

发表于 2014-7-1 16:56:07 | 显示全部楼层
jeansonm 发表于 2014-6-27 14:33
好的  你的也是LPC1768的平台吗?

公司另外一个工程师手里有块1768的产品,刚好上面有网口,就直接在这个板上弄了。
我下了个git 把lwip更新到最新的了 貌似很多人都上传了BUG 修改了很多。
http://git.savannah.gnu.org/cgit/lwip.git/

出0入0汤圆

发表于 2014-7-2 08:15:59 | 显示全部楼层
很好的东西呀,感谢分享

出0入0汤圆

发表于 2014-7-2 12:45:25 | 显示全部楼层
这东西可以推广到很多应用,基本框架就是这样,不错!

出0入0汤圆

发表于 2014-7-3 22:07:24 | 显示全部楼层
顶起 菊花公司公司

出0入0汤圆

发表于 2014-7-4 18:16:40 | 显示全部楼层
jeansonm 发表于 2014-6-20 09:25
是的,视屏监控数据量太大,用这个速度跟不上

我之前用路由器、视频编码模块和500线摄像头做了一个实时监控,发现根本不同步,手机接收端延迟太严重了

出0入0汤圆

发表于 2014-7-18 13:41:47 | 显示全部楼层
收藏!

出0入0汤圆

发表于 2014-9-30 00:11:03 | 显示全部楼层
请问楼主makefsdata.exe生成fsdata.c文件中的数据很大时(比如10k byte),该如何分包发送数据呢

出0入0汤圆

发表于 2014-11-20 13:30:35 | 显示全部楼层
虽然简单,但是很基础很实用

出0入0汤圆

发表于 2014-11-20 13:36:00 | 显示全部楼层
顶                        

出0入0汤圆

发表于 2014-11-20 15:39:52 | 显示全部楼层
很实用的例子! MARK

出0入0汤圆

发表于 2014-11-20 15:43:32 | 显示全部楼层
很好的东西,那天我也练习练习!

出0入0汤圆

发表于 2014-11-20 15:46:24 | 显示全部楼层
mark.............

出0入0汤圆

发表于 2014-11-20 16:00:00 | 显示全部楼层
gerbansh520 发表于 2014-7-1 16:56
公司另外一个工程师手里有块1768的产品,刚好上面有网口,就直接在这个板上弄了。
我下了个git 把lwip更 ...

楼主相当热心啊!赞一个

出0入270汤圆

发表于 2014-11-20 16:11:17 | 显示全部楼层
好东西顶一下

出0入0汤圆

发表于 2014-11-20 16:16:30 | 显示全部楼层
赞一个,lz

出0入53汤圆

发表于 2014-11-20 16:59:21 | 显示全部楼层
LZ请问宝马开发板是你开发的吗?

出0入0汤圆

发表于 2014-11-21 15:29:46 | 显示全部楼层
谢谢楼主

出0入0汤圆

发表于 2014-11-21 20:13:43 | 显示全部楼层
好东西啊 楼主好

出0入0汤圆

发表于 2014-11-21 22:17:31 | 显示全部楼层
赞一个,正要做这方面了

出0入0汤圆

发表于 2014-11-21 22:18:12 | 显示全部楼层
正要做这方面,赞楼主!

出0入0汤圆

发表于 2014-11-23 10:41:36 | 显示全部楼层
真不错,楼主大神

出0入0汤圆

发表于 2014-11-23 11:50:05 | 显示全部楼层
支持楼主开源精神!

出0入0汤圆

发表于 2014-11-23 13:02:19 | 显示全部楼层
不错的资料 谢谢

出0入0汤圆

发表于 2014-11-24 16:03:17 | 显示全部楼层
谢谢楼主

出0入0汤圆

发表于 2015-9-21 17:32:24 | 显示全部楼层
楼主好样的

出0入0汤圆

发表于 2015-9-21 17:40:16 | 显示全部楼层
如此叼,必须赞一个。

出0入0汤圆

发表于 2015-9-21 19:11:19 | 显示全部楼层
先讚一下,以後細看。

出0入0汤圆

发表于 2015-9-22 07:41:10 | 显示全部楼层
收藏一个

出0入0汤圆

发表于 2016-1-18 10:34:58 | 显示全部楼层
下载学习了  也要说声3q

出0入0汤圆

发表于 2016-1-25 12:13:33 | 显示全部楼层
好高端的样子

出0入42汤圆

发表于 2016-2-21 16:17:01 | 显示全部楼层
谢谢  流程值得学习  这个用在无线上面  是否通讯?

出0入0汤圆

发表于 2017-11-6 14:04:40 | 显示全部楼层
物联网板:MCU+Zigbee,MCU+ESP8266,Zigbee和ESP8266使用串口与MCU通信,ESP8266负责跟服务器通信,Zigbee负责与插座节点通信。使用上位机软件远程控制插座节点。
物联网板链接:http://pan.baidu.com/s/1jIim8Nc 密码:hbze

出0入0汤圆

发表于 2017-11-6 18:31:01 | 显示全部楼层

虽然目前用不上,但是还是给楼主赞一个

出0入0汤圆

发表于 2017-11-6 19:05:14 | 显示全部楼层
不错  支持一下

出0入4汤圆

发表于 2017-11-6 21:01:35 | 显示全部楼层
顶 远程网络监控系统
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 21:05

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表