TCP server (using net_context) running on nrf7002-DK in STA mode stopping receiving data

Hello everybody,

                         I have very bad problem for me. I am developing application on nrf7002-DK based on STA (station) example. I add own AT command analyzer and SCAN, so I am able to see webs that are available near my nrf7002-DK. With special AT command, i am able to connect to any web that my DK see.

I create AT command that allows me create a TCP server on nrf7002-DK.

static void create_tcp_server1(int port_number)
{
  //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	//                                          Vytvoření TCP serveru
	//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    int rc = net_context_get(AF_INET, SOCK_STREAM, IPPROTO_TCP, &server1.tcp_server);
    if (rc < 0) 
	{
		if(loggovani==true)
		{
           printk("net_context_get selhal: %d\n", rc);
		}
        
    } 
	else 
	{
	    if(loggovani==true)
		{
           printk("Podařilo se definovat parametry TCP serveru\n");
		}
    }
    //+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
	//                        Definice portu, na kterém poběží server
	//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    struct sockaddr_in addr;
    int ret;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port_number);
    addr.sin_addr.s_addr = INADDR_ANY;
    //+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
	//                              Svázání serveru s portem
	//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    ret = net_context_bind(server1.tcp_server, (struct sockaddr *)&addr, sizeof(addr));
    if (ret < 0) 
	{
		if(loggovani==true)
		{
           printk("Spojení serveru s portem selhalo: %d\n", ret);
		}

    }
	else 
	{
		if(loggovani==true)
		{
		   printk("Uspesne bindnuto\n");
		}
	}
	//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
	//                          Zahájení poslouchání na portu
	//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

    ret = net_context_listen(server1.tcp_server, 5);
    if (ret < 0) 
	{
		if(loggovani==true)
		{
           printk("Poslouchání na portu selhalo: %d\n", ret);
		}

    }
	else
	{
		if(loggovani==true)
		{
           printk("Server posloucha na portu\n");
		}
	}
	//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
	//                    Nastavení callbacku pro akceptování klienta
	//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    ret = net_context_accept(server1.tcp_server, obsazovani_slotu_server1, K_NO_WAIT, NULL);
    if (ret < 0) {
		if(loggovani==true)
		{
          printk("Pristup selhal: %d\n", ret);
		}
        
    }
	else
	{
		if(loggovani==true)
		{
          printk("Callback pro prihlaseni klienta pridan \n");
		}
	}
	printk("\n+TCPSERVER 1: RUNNING\n");
	server1.is_running=true;
}

I am working with net_context architecture. I try to use sockets, but it doesn't work.

I can show callabck, that I am using for receiving data:

static void prijimac_server1_klient1(struct net_context *context, struct net_pkt *pkt, union net_ip_header *ip_hdr, union net_proto_header *proto_hdr, int status, void *user_data)
{
    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	//                 Testování toho, jestli nepřišel prázdný packet
	//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
	if (!pkt)//pokud přišel prázdný packet. znamená to, že se klient odpojil
	{
        printk("\n+TCPSERVER 1, CLIENT 1 DISCONNECTED\n");
		printk("\nOK\n");
		server1.pripojen1=false;
		server1.transparetni_rezim1=false;
		server1.ip_client1=NULL;
		int ret = net_context_accept(server1.tcp_server, obsazovani_slotu_server1, K_NO_WAIT, NULL);
        if (ret < 0) 
		{
			if(loggovani==true)
			{
              printk("Callback pro prihlaseni se podarilo nastavit: %d\n", ret);
			}
        }
	    else
	    {
			if(loggovani==true)
			{
				printk("Callback pro prihlaseni klienta pridan \n");
			} 
	    }
	 }
	 else
	 {
		 if(server1.transparetni_rezim1==false)
		 {
            printk("+TCPSERVER 1, DATA CLIENT 1: ");
		 }
         size_t len = net_pkt_remaining_data(pkt);
		 data_prisla_1_1=true;
         //+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
		 //   Kontrola toho, jestli se data vejdou do bufferu
		 //+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
         if (len > sizeof(server1.buffer)) 
		 {
           len = sizeof(server1.buffer); //snížení velikosti přijímaných dat
         }
         //+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
		 //                 Samotné přijetí dat
		 //+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
         int ret = net_pkt_read(pkt, server1.buffer, len);
		 bool nalezeni= prohledej_buffer_serveru_1("JEDE, JEDE, MASINKA, KOURI SE JI Z KOMINKA");
		 net_pkt_unref(pkt);
         if (pkt) 
         {
	printk("SE nepovedlo\n");
	pkt = NULL;
}
else
{
	printk("POVEDLO se\n");
}  
net_context_recv(context, prijimac_server1_klient1,  K_NO_WAIT, NULL);
         //context->fifo_reserved;
          
		  //printk("%d\n",pocet);
		 //net_context_unref(context);
		 //net_context_ref(context);
		 //net_context_put(context);
		 if(nalezeni==true)
		 {
            printk("\nDATA NALEZENA\n");
			kontrola_nezkresleni_1_1=true;
		 }
		 else
		 {
            printk("\nNENASEL JSEM TO\n");
		 }
         if (ret == 0) 
		 {
           //for(int ukazovatko=0;ukazovatko<len;ukazovatko++)
		   //{
              //printk("%c",server1.buffer[ukazovatko]);
		   //}
		   //printk("\n");
         }
		 else
		 {
			if(loggovani==true)
			{
			   printk("Data se nepodarila nacist\n");   
		    }
	     }
	  }

}

I do net_pkt_unref().

If I connect to network, create and run TCP server, i can connect TCP client into TCP server. I am able to send data from client to server. But after maybe a 20 message.

I can show you log of communication:

> AT#TCPSERVER=1,1,6523

+TCPSERVER 1: RUNNING
OK
+TCPSERVER 1, CLIENT 1 CONNECTED
OK
+TCPSERVER 1, DATA CLIENT 1: SE nepovedlo

DATA NALEZENA
+TCPSERVER 1, DATA CLIENT 1: SE nepovedlo

DATA NALEZENA
+TCPSERVER 1, DATA CLIENT 1: SE nepovedlo

DATA NALEZENA
+TCPSERVER 1, DATA CLIENT 1: SE nepovedlo

DATA NALEZENA
+TCPSERVER 1, DATA CLIENT 1: SE nepovedlo

DATA NALEZENA
+TCPSERVER 1, DATA CLIENT 1: SE nepovedlo

DATA NALEZENA
+TCPSERVER 1, DATA CLIENT 1: SE nepovedlo

DATA NALEZENA
+TCPSERVER 1, DATA CLIENT 1: SE nepovedlo

DATA NALEZENA
+TCPSERVER 1, DATA CLIENT 1: SE nepovedlo

DATA NALEZENA
+TCPSERVER 1, DATA CLIENT 1: SE nepovedlo

DATA NALEZENA
+TCPSERVER 1, DATA CLIENT 1: SE nepovedlo

DATA NALEZENA
+TCPSERVER 1, DATA CLIENT 1: SE nepovedlo

DATA NALEZENA
+TCPSERVER 1, DATA CLIENT 1: SE nepovedlo

DATA NALEZENA
+TCPSERVER 1, DATA CLIENT 1: SE nepovedlo

DATA NALEZENA
+TCPSERVER 1, DATA CLIENT 1: SE nepovedlo

NENASEL JSEM TO
+TCPSERVER 1, DATA CLIENT 1: SE nepovedlo

NENASEL JSEM TO
+TCPSERVER 1, DATA CLIENT 1: SE nepovedlo

NENASEL JSEM TO
+TCPSERVER 1, DATA CLIENT 1: SE nepovedlo

DATA NALEZENA
+TCPSERVER 1, DATA CLIENT 1: SE nepovedlo

DATA NALEZENA
+TCPSERVER 1, DATA CLIENT 1: SE nepovedlo

DATA NALEZENA
+TCPSERVER 1, DATA CLIENT 1: SE nepovedlo

NENASEL JSEM TO
+TCPSERVER 1, DATA CLIENT 1: SE nepovedlo

NENASEL JSEM TO
+TCPSERVER 1, DATA CLIENT 1: SE nepovedlo

NENASEL JSEM TO
+TCPSERVER 1, DATA CLIENT 1: SE nepovedlo

NENASEL JSEM TO
+TCPSERVER 1, DATA CLIENT 1: SE nepovedlo

NENASEL JSEM TO
+TCPSERVER 1, DATA CLIENT 1: SE nepovedlo

NENASEL JSEM TO
+TCPSERVER 1, DATA CLIENT 1: SE nepovedlo

NENASEL JSEM TO
+TCPSERVER 1, DATA CLIENT 1: SE nepovedlo

NENASEL JSEM TO
+TCPSERVER 1, DATA CLIENT 1: SE nepovedlo

NENASEL JSEM TO
+TCPSERVER 1, DATA CLIENT 1: SE nepovedlo

NENASEL JSEM TO

+TCPSERVER 1, CLIENT 1 DISCONNECTED

CONNECTION DATA FLOW TIME EXPIRED

DATA DISTORTION

OK

this log shows: if message +TCPSERVER 1: DATA CLIENT 1: means, that data will be read by server (now without plot into console)

I added function, that will disconnect client, that didn't send message for some time (maybe 30 seconds). If I do disconnection of client and I do new connection, data start flow (only maybe 20 messages). If you do net_context unref and put.

void disconnect_server_1_client_1()
{
	    int navratova=0;
		//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
		//             První fáze odpojování klienta
		//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
	    navratova=net_context_unref(server1.client1);
		if(navratova==0)
		{
			if(loggovani==true)
		    {
              printk("Klient 1 server 1 se odpojuje, krok 1\n");
			}
		}
		else
		{
			if(loggovani==true)
		    {
              printk("Odpojeni klienta 1 server 1 se nezdarilo\n");
			}
		}
	    navratova=net_context_put(server1.client1); 
		if(navratova==0)
		{
			if(loggovani==true)
		    {
              printk("Klient 1 server 1 se odpojuje, krok 2\n");
			}
		}
		else
		{
			if(loggovani==true)
		    {
              printk("Odpojeni klienta 1 server 1 se nezdarilo\n");
			}
		}
		server1.pripojen1=false;
		printk("\n+TCPSERVER 1, CLIENT 1 DISCONNECTED\n");
		//printk("\nOK\n");
};

My prj. conf looks like this:

#
# Copyright (c) 2022 Nordic Semiconductor ASA
#
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
#
CONFIG_WIFI=y
CONFIG_WIFI_NRF70=y

CONFIG_SERIAL=y
CONFIG_NRFX_UART0=y
CONFIG_UART_ASYNC_API=y
# WPA supplicant
CONFIG_WIFI_NRF70_LOG_LEVEL_INF=n
CONFIG_WIFI_NRF70_LOG_LEVEL_DBG=n
CONFIG_WIFI_NRF70_LOG_LEVEL_DEFAULT=n
CONFIG_WIFI_NRF70_LOG_LEVEL_WRN=n
CONFIG_WIFI_NRF70_LOG_LEVEL_OFF=n
CONFIG_WIFI_NRF70_LOG_LEVEL_ERR=n

CONFIG_WIFI_READY_LIB=y
CONFIG_WIFI_NM_WPA_SUPPLICANT=y
CONFIG_WIFI_NM_WPA_SUPPLICANT_LOG_LEVEL_DBG=n
CONFIG_WIFI_NM_WPA_SUPPLICANT_LOG_LEVEL_INF=n
CONFIG_WIFI_NM_WPA_SUPPLICANT_LOG_LEVEL_DEFAULT=n
CONFIG_WIFI_NM_WPA_SUPPLICANT_LOG_LEVEL_ERR=n
CONFIG_WIFI_NM_WPA_SUPPLICANT_LOG_LEVEL_OFF=n
CONFIG_WIFI_NM_WPA_SUPPLICANT_LOG_LEVEL_WRN=n
CONFIG_NRF_WIFI_RPU_RECOVERY=y

CONFIG_WIFI_CREDENTIALS=y
CONFIG_WIFI_CREDENTIALS_STATIC=y
CONFIG_WIFI_CREDENTIALS_STATIC_SSID="yyyyyyyyyy"
CONFIG_WIFI_CREDENTIALS_STATIC_PASSWORD="xxxxxxxxxx"

# Networking
CONFIG_NETWORKING=y
CONFIG_NET_SOCKETS=y
CONFIG_NET_LOG=n
CONFIG_NET_IPV4=y
CONFIG_NET_UDP=y
CONFIG_NET_TCP=y
CONFIG_NET_DHCPV4=y

CONFIG_NET_MGMT_EVENT_LOG_LEVEL_DBG=n
CONFIG_NET_MGMT_EVENT_LOG_LEVEL_DEFAULT=n
CONFIG_NET_MGMT_EVENT_LOG_LEVEL_INF=n
CONFIG_NET_MGMT_EVENT_LOG_LEVEL_ERR=n
CONFIG_NET_MGMT_EVENT_LOG_LEVEL_WRN=n
CONFIG_NET_MGMT_EVENT_LOG_LEVEL_OFF=n



CONFIG_NET_PKT_RX_COUNT=32
CONFIG_NET_PKT_TX_COUNT=32
CONFIG_NRF70_RX_NUM_BUFS=16

# Below section is the primary contributor to SRAM and is currently
# tuned for performance, but this will be revisited in the future.
CONFIG_NET_BUF_RX_COUNT=64
CONFIG_NET_BUF_TX_COUNT=64
CONFIG_HEAP_MEM_POOL_SIZE=47000
CONFIG_HEAP_MEM_POOL_IGNORE_MIN=y
CONFIG_NRF_WIFI_CTRL_HEAP_SIZE=20000
CONFIG_NRF_WIFI_DATA_HEAP_SIZE=60000
CONFIG_NET_TC_TX_COUNT=1

CONFIG_NET_IF_UNICAST_IPV4_ADDR_COUNT=1
CONFIG_NET_MAX_CONTEXTS=50
CONFIG_NET_CONTEXT_SYNC_RECV=y

CONFIG_INIT_STACKS=y

CONFIG_NET_L2_ETHERNET=y
CONFIG_NET_L2_WIFI_MGMT=y
CONFIG_NET_L2_WIFI_MGMT_LOG_LEVEL_DBG=n
CONFIG_NET_L2_WIFI_MGMT_LOG_LEVEL_INF=n
CONFIG_NET_L2_WIFI_MGMT_LOG_LEVEL_WRN=n
CONFIG_NET_L2_WIFI_MGMT_LOG_LEVEL_ERR=n
CONFIG_NET_L2_WIFI_MGMT_LOG_LEVEL_DEFAULT=n
CONFIG_NET_L2_WIFI_MGMT_LOG_LEVEL_OFF=n

CONFIG_WIFI_MGMT_SCAN_SSID_FILT_MAX=4

CONFIG_NET_CONFIG_SETTINGS=y
CONFIG_NET_CONFIG_INIT_TIMEOUT=0

CONFIG_NET_SOCKETS_POLL_MAX=15

# Memories
CONFIG_MAIN_STACK_SIZE=60400
CONFIG_NET_TX_STACK_SIZE=16384
CONFIG_NET_RX_STACK_SIZE=16384
CONFIG_STA_SAMPLE_START_WIFI_THREAD_STACK_SIZE=60400

# Debugging
CONFIG_STACK_SENTINEL=y
CONFIG_DEBUG_COREDUMP=y
CONFIG_DEBUG_COREDUMP_BACKEND_LOGGING=y
CONFIG_DEBUG_COREDUMP_MEMORY_DUMP_MIN=y
CONFIG_SHELL_CMDS_RESIZE=n


# Kernel options
CONFIG_ENTROPY_GENERATOR=y

# Logging
CONFIG_LOG_BUFFER_SIZE=16384
CONFIG_POSIX_CLOCK=y

CONFIG_NET_CONFIG_MY_IPV4_ADDR="192.168.1.99"
CONFIG_NET_CONFIG_MY_IPV4_NETMASK="255.255.255.0"
CONFIG_NET_CONFIG_MY_IPV4_GW="192.168.1.1"

# printing of scan results puts pressure on queues in new locking
# design in net_mgmt. So, use a higher timeout for a crowded
# environment.
CONFIG_NET_MGMT_EVENT_QUEUE_TIMEOUT=50

CONFIG_WIFI_MGMT_RAW_SCAN_RESULTS=n
CONFIG_WIFI_MGMT_RAW_SCAN_RESULTS_ONLY=n

CONFIG_WIFI_SCAN_DWELL_TIME_ACTIVE=50
CONFIG_WIFI_SCAN_DWELL_TIME_PASSIVE=130

CONFIG_WIFI_LOG_LEVEL_OFF=n
CONFIG_WIFI_LOG_LEVEL_INF=n

CONFIG_LOG_BACKEND_NET_AUTOSTART=n
CONFIG_LOG=n
CONFIG_LOG_DEFAULT_LEVEL=3

CONFIG_TIMER=y
CONFIG_COUNTER=y
CONFIG_CLOCK_CONTROL=y
CONFIG_CLOCK_CONTROL_NRF=y
CONFIG_NRFX_CLOCK=y
CONFIG_RTC_ALARM=y
CONFIG_RTC_UPDATE=y
CONFIG_NET_ICMPV4_ACCEPT_BROADCAST=y

#CONFIG_NET_BUF_DATA_SIZE=8192
CONFIG_NET_BUF_POOL_USAGE=y

CONFIG_NET_RX_DEFAULT_PRIORITY=7

Could you please help me solve this problem, I want to be able read any count of messages.

Kind regards

Jaroslav Havel 

Parents
  • Hi, Jaroslav.

    We'll do our best to help you.

    Could you please specify again what your specific problem is?

    I am working with net_context architecture. I try to use sockets, but it doesn't work.

    What specifically doesn't work when you're trying to use sockets?

    I added function, that will disconnect client, that didn't send message for some time (maybe 30 seconds). If I do disconnection of client and I do new connection, data start flow (only maybe 20 messages). If you do net_context unref and put.

    Is it that you're only able to receive 20 messages before a disconnect occurs?

    Could you please help me solve this problem, I want to be able read any count of messages.

    Or is it a different number of messages you're able to receive before the disconnect occurs?

    Best regards,
    Mathias

  • Hi Mathias,

                          I thing for start it will be hard to understand each other. Maybe it is because I am not able to decribe my problem. But I can send project (in .zip) or a video when I show issue. If you are interested, please give me some contact or link for send a video or complete project.

    Kind regards

    Jaroslav

Reply Children
No Data
Related