tcp接收数据中途--断线,求大神支招。

2019-08-14 20:18发布

通过客户端(手机)控制设备(裸机,无系统),系统架构为手机发送给云服务器,服务器转发给mqtt代理,代理再发送给设备。每按一下按键发送同一条控制指令。在连续按键一段时间后出现tcp断开连接的现象。无论按动的频率多慢,1秒按一次也会掉线;出错时间也不定,有时按到第30多次掉线,有时按到10多次就掉线了。我在自己电脑上配置了一个mqtt客户端,订阅同一个主题,能正确收到每次按键的控制指令,个人认为客户端下发的指令至少顺利到达mqtt代理,并且mqtt代理也正常的将数据发送出去了,所以问题就只能出在我的设备上。最可能的,我想还应该是tcp初始化的问题。这种判断对吗?下面是TCP客户端初始化函数,使用的协议栈为lwip 1.4.1,程序都是参照网上的例程修修改改而来,新手接触lwip,让大家见笑了。出错的地方使用红 {MOD}字标出,有两个问题我一直不解:1、接收函数中在什么情况下回出现pbuf p == NULL?是接收到了类似ACK这种数据为空的数据包吗? 2、接收函数的返回值err_t err == ERR_OK是个什么概念?ERR_OK不是表示无错误(正常)么?为什么检测到出现这种状态时好像是在处理一个错误一样的将tcp关闭呢? 这个问题卡住我几天了。求大神支招。感激不尽。err_t tcp_Init(void){                 err_t err;         struct ip_addr serverIp;         IP4_ADDR( &serverIp,192.168.2.120);  /*设置服务器IP*/         iot_client_pcb = tcp_new();    err= tcp_connect(iot_client_pcb,&serverIp,MQTT_SERVER_PORT,iot_tcp_accept);         return err;}err_tiot_tcp_accept(void *arg, struct tcp_pcb *newpcb, err_t err){  //监听到新的客户端连接请求   err_t ret_err;  UdpStdioPrintf("iot_tcp_accept!");  tcp_recv(newpcb,iot_tcp_recv); //指定回调函数  tcp_err(newpcb,iot_tcp_error); //指定错误函数  tcp_poll(newpcb,iot_tcp_poll,1);                  //指定轮询函数  mqttConnect();       /*连接MQTT服务器*/           return ret_err;  } err_tiot_tcp_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err){  char *buf;  uchar mqttCmd;  err_t ret_err = ERR_OK;    struct name *name = (struct name *)arg;  UdpStdioPrintf("iot_client_recv");  if (p != NULL)   {                UdpStdioPrintf("------------------------1!");         tcp_recved(tpcb, p->tot_len);    buf = p->payload;         mqttCmd = (*buf & 0xf0) >> 4;         switch(mqttCmd) {          case PUBLISH:                   {                       UdpStdioPrintf("Publish In!");                   } break;          case CONNACK:                   {                       mqtt_device_connected = TRUE;                   } break;          case PUBACK:                   {                       mIotTcpTxFrame.waitFlag = 0;  //收到回应,继续上报下一条数据                   }  break;          default:                     break;    }         iot_missContactCount = 0;   //有收到数据,则表示保持通讯    pbuf_free(p);         ret_err = ERR_OK;  }  else if (err == ERR_OK)   {    /*进入此处导致tcp关闭。返回的错误值err == ERR_OK 是个什么概念呢?*/mem_free(name);         UdpStdioPrintf("iot_tcp_recv::err== ERR_OK->tcp_close");    return tcp_close(tpcb);  }   return ret_err;}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。