/****************************************************************************** * FunctionName : espconn_connect * Description : The function given as the connect * Parameters : espconn -- the espconn used to listen the connection * Returns : none *******************************************************************************/ sint8 ICACHE_FLASH_ATTR espconn_connect(struct espconn *espconn) { ip_addr_t ipaddr; tcpip_adapter_ip_info_t ipinfo; uint8 connect_status = 0; sint8 value = ESPCONN_OK; espconn_msg *plist = NULL; // remot_info *pinfo = NULL; if (espconn == NULL) { return ESPCONN_ARG; } else if (espconn ->type != ESPCONN_TCP) return ESPCONN_ARG; /*Check the active node count whether is the limit or not*/ if (espconn_get_acticve_num(ESPCONN_TCP) >= espconn_tcp_get_max_con()) { printf("espconn_tcp_get_max_con \n"); return ESPCONN_ISCONN; } /*Check the IP address whether is zero or not in different mode*/ esp_wifi_get_mode((wifi_mode_t*)&value); if (value == WIFI_MODE_STA){ wifi_get_ip_info(TCPIP_ADAPTER_IF_STA,&ipinfo); if (ipinfo.ip.addr == 0){ return ESPCONN_RTE; } } else if(value == WIFI_MODE_AP){ wifi_get_ip_info(TCPIP_ADAPTER_IF_AP,&ipinfo); if (ipinfo.ip.addr == 0){ return ESPCONN_RTE; } } else if(value == WIFI_MODE_APSTA){ IP4_ADDR(&ipaddr.u_addr.ip4, espconn->proto.tcp->remote_ip[0], espconn->proto.tcp->remote_ip[1], espconn->proto.tcp->remote_ip[2], espconn->proto.tcp->remote_ip[3]); ipaddr.u_addr.ip4.addr <<= 8; wifi_get_ip_info(TCPIP_ADAPTER_IF_AP,&ipinfo); ipinfo.ip.addr <<= 8; // espconn_printf("softap_addr = %x, remote_addr = %x\n", ipinfo.ip.addr, ipaddr.u_addr.ip4.addr); if (ipaddr.u_addr.ip4.addr != ipinfo.ip.addr){ connect_status = wifi_station_get_connect_status(); if (connect_status == SYSTEM_EVENT_STA_GOT_IP){ wifi_get_ip_info(TCPIP_ADAPTER_IF_STA,&ipinfo); // espconn_printf("wifi_get_ip_info:(ip: " IPSTR ", mask: " IPSTR ", gw: " IPSTR ")\n", // IP2STR(&ipinfo.ip), IP2STR(&ipinfo.netmask), IP2STR(&ipinfo.gw)); if (ipinfo.ip.addr == 0) return ESPCONN_RTE; } else if (connect_status != SYSTEM_EVENT_STA_GOT_IP){ return ESPCONN_RTE; } else { return connect_status; } } } /*check the active node information whether is the same as the entity or not*/ for (plist = plink_active; plist != NULL; plist = plist->pnext){ if (plist->pespconn && plist->pespconn->type == ESPCONN_TCP){ if (espconn->proto.tcp->local_port == plist->pespconn->proto.tcp->local_port){ return ESPCONN_ISCONN; } } } espconn_set_opt(espconn, ESPCONN_COPY|ESPCONN_NODELAY); value = espconn_tcp_client(espconn); espconn_printf("espconn_connect err value %d \n",value); return value; }
/****************************************************************************** * FunctionName : espconn_connect * Description : The function given as the connect * Parameters : espconn -- the espconn used to listen the connection * Returns : none *******************************************************************************/ sint8 ICACHE_FLASH_ATTR espconn_connect(struct espconn *espconn) { struct ip_addr ipaddr; struct ip_info ipinfo; uint8 connect_status = 0; sint8 value = ESPCONN_OK; espconn_msg *plist = NULL; remot_info *pinfo = NULL; if (espconn == NULL) { return ESPCONN_ARG; } else if (espconn ->type != ESPCONN_TCP) return ESPCONN_ARG; /*Check the active node count whether is the limit or not*/ if (espconn_get_acticve_num(ESPCONN_TCP) >= espconn_tcp_get_max_con()) return ESPCONN_ISCONN; /*Check the IP address whether is zero or not in different mode*/ if (wifi_get_opmode() == ESPCONN_STA) { wifi_get_ip_info(STA_NETIF,&ipinfo); if (ipinfo.ip.addr == 0) { return ESPCONN_RTE; } } else if(wifi_get_opmode() == ESPCONN_AP) { wifi_get_ip_info(AP_NETIF,&ipinfo); if (ipinfo.ip.addr == 0) { return ESPCONN_RTE; } } else if(wifi_get_opmode() == ESPCONN_AP_STA) { IP4_ADDR(&ipaddr, espconn->proto.tcp->remote_ip[0], espconn->proto.tcp->remote_ip[1], espconn->proto.tcp->remote_ip[2], espconn->proto.tcp->remote_ip[3]); ipaddr.addr <<= 8; wifi_get_ip_info(AP_NETIF,&ipinfo); ipinfo.ip.addr <<= 8; espconn_printf("softap_addr = %x, remote_addr = %x\n", ipinfo.ip.addr, ipaddr.addr); if (ipaddr.addr != ipinfo.ip.addr) { connect_status = wifi_station_get_connect_status(); if (connect_status == STATION_GOT_IP) { wifi_get_ip_info(STA_NETIF,&ipinfo); if (ipinfo.ip.addr == 0) return ESPCONN_RTE; } else if (connect_status == STATION_IDLE) { return ESPCONN_RTE; } else { return connect_status; } } } /*check the active node information whether is the same as the entity or not*/ for (plist = plink_active; plist != NULL; plist = plist->pnext) { if (plist->pespconn && plist->pespconn->type == ESPCONN_TCP) { if (espconn->proto.tcp->local_port == plist->pespconn->proto.tcp->local_port) { return ESPCONN_ISCONN; } } } value = espconn_tcp_client(espconn); return value; }