<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://devzone.nordicsemi.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Need the nrf9160 example to transfer large data by TCP.</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/51336/need-the-nrf9160-example-to-transfer-large-data-by-tcp</link><description>Hi, 
 I am a beginner to nrf9160. 
 I already can do send the large data to server. (Maybe not too large just about 15KB) 
 In my test, I will send that data in every 25 minutes. 
 The problem is it is not stable, It will stall after a few times. 
 I</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Mon, 09 Sep 2019 15:33:18 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/51336/need-the-nrf9160-example-to-transfer-large-data-by-tcp" /><item><title>RE: Need the nrf9160 example to transfer large data by TCP.</title><link>https://devzone.nordicsemi.com/thread/208748?ContentTypeID=1</link><pubDate>Mon, 09 Sep 2019 15:33:18 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:fbd465ed-5b4a-43ca-9bd1-2755aee11c9c</guid><dc:creator>Luther</dc:creator><description>&lt;p&gt;Hi Martin,&lt;/p&gt;
&lt;p&gt;I had look into tcp example, but it seem not what I want.&lt;br /&gt;That example is for receiving data. But it has a &amp;quot;blocking_send&amp;quot; function.&lt;br /&gt;So I had modify that tcp example to do the following test for sending large tcp data.&lt;br /&gt;The send buffer size is about 20KB&lt;br /&gt;Test 1: Just using &amp;quot;blocking_send&amp;quot; to send the data.&lt;br /&gt;Result: &lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;***** Booting Zephyr OS v1.14.99-ncs2 *****
LTE Link Connecting ...
LTE Link Connected!
TCP example getaddrinfo err: 0
client_fd: 3
connect err: 0
Send total data size: 20479
Test 1: blocking_send -1&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Actually it will fail to send data. The return code is -1.&lt;/p&gt;
&lt;p&gt;Test 2: I write a new function slice the buffer, every time just send 512 bytes. but without delay.&lt;br /&gt;Result:&lt;br /&gt;&lt;pre class="ui-code" data-mode="text"&gt;***** Booting Zephyr OS v1.14.99-ncs2 *****
LTE Link Connecting ...
LTE Link Connected!
TCP example getaddrinfo err: 0
client_fd: 3
connect err: 0
Send total data size: 20479
Send piece NoDelay: 512
Send piece NoDelay: 512
Send piece NoDelay: 512
Send piece NoDelay: 512
Send piece NoDelay: 512
Send piece NoDelay: 512
Send piece NoDelay: 512
Error: send large data, c:-1, ix:3584
Test 2: sendLargeData 3584&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;As you can see, the data send about 7 piece then got the error code -1.&lt;/p&gt;
&lt;p&gt;Test 3: Slice the buffer, every time send 512 bytes and add delay 200ms.&lt;br /&gt;Result:&lt;br /&gt;&lt;pre class="ui-code" data-mode="text"&gt;***** Booting Zephyr OS v1.14.99-ncs2 *****
LTE Link Connecting ...
LTE Link Connected!
TCP example getaddrinfo err: 0
client_fd: 3
connect err: 0
Send total data size: 20479
Send piece delay 200ms: 512
Send piece delay 200ms: 512
Send piece delay 200ms: 512
Send piece delay 200ms: 512
Send piece delay 200ms: 512
Send piece delay 200ms: 512
Send piece delay 200ms: 512
Send piece delay 200ms: 512
Send piece delay 200ms: 512
Send piece delay 200ms: 512
Send piece delay 200ms: 512
Send piece delay 200ms: 512
Send piece delay 200ms: 512
Send piece delay 200ms: 512
Send piece delay 200ms: 512
Send piece delay 200ms: 512
Send piece delay 200ms: 512
Send piece delay 200ms: 512
Send piece delay 200ms: 512
Send piece delay 200ms: 512
Send piece delay 200ms: 512
Send piece delay 200ms: 512
Send piece delay 200ms: 512
Send piece delay 200ms: 512
Send piece delay 200ms: 512
Send piece delay 200ms: 512
Send piece delay 200ms: 512
Send piece delay 200ms: 512
Send piece delay 200ms: 512
Send piece delay 200ms: 512
Send piece delay 200ms: 512
Send piece delay 200ms: 512
Send piece delay 200ms: 512
Send piece delay 200ms: 512
Send piece delay 200ms: 512
Send piece delay 200ms: 512
Send piece delay 200ms: 512
Send piece delay 200ms: 512
Send piece delay 200ms: 512
Send piece delay 200ms: 511
Test 2: sendLargeData 20479&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Yes, this time. The data had successful be send. But I wish I could do the optimum about the delay time.&lt;br /&gt;&lt;br /&gt;BTW, I am testing the NBIoT.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Here is my prj.conf and main.c&lt;br /&gt;&lt;pre class="ui-code" data-mode="text"&gt;prj.conf

CONFIG_BSD_LIBRARY=y
CONFIG_GPIO=n
CONFIG_SERIAL=y
CONFIG_STDOUT_CONSOLE=y
CONFIG_UART_INTERRUPT_DRIVEN=y
CONFIG_TEST_RANDOM_GENERATOR=y
CONFIG_NETWORKING=y
CONFIG_NET_BUF_USER_DATA_SIZE=1
CONFIG_NET_SOCKETS_OFFLOAD=y
CONFIG_NET_SOCKETS=y
CONFIG_NET_SOCKETS_POSIX_NAMES=y
CONFIG_NET_RAW_MODE=y
CONFIG_TRUSTED_EXECUTION_NONSECURE=y
CONFIG_LOG=n
CONFIG_LOG_DEFAULT_LEVEL=4
CONFIG_HEAP_MEM_POOL_SIZE=1024
# LTE link control
CONFIG_LTE_LINK_CONTROL=y
CONFIG_LTE_AUTO_INIT_AND_CONNECT=n
CONFIG_LTE_NETWORK_MODE_NBIOT=y
# TYPE &amp;quot;4&amp;quot;:E-UTRAN (WB-S1 mode), &amp;quot;5&amp;quot; E-UTRAN (NB-S1 mode)
CONFIG_LTE_EDRX_REQ_ACTT_TYPE=&amp;quot;5&amp;quot;
CONFIG_MAIN_STACK_SIZE=4096&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Remember to modify the #define TCP_HOST and&amp;nbsp;TCP_PORT to your test server.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="c_cpp"&gt;/*
 * Copyright (c) 2018 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: LicenseRef-BSD-5-Clause-Nordic
 */

#include &amp;lt;zephyr.h&amp;gt;
#include &amp;lt;net/socket.h&amp;gt;
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;uart.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &amp;lt;lte_lc.h&amp;gt;

#define TEST_SEND_WITH_DELAY
//#define DO_TEST_1

#define TCP_HOST &amp;quot;test.com&amp;quot;
#define TCP_PORT &amp;quot;8080&amp;quot;
#define RECV_BUF_SIZE ((80 * 24) + 1)
#define MAX_SOCKET_SEND_SIZE  512
#define SEND_BUF_SIZE (20 * 1024)

char recv_buf[RECV_BUF_SIZE];
char send_buf[SEND_BUF_SIZE];

u32_t inet_addr(u8_t a, u8_t b, u8_t c, u8_t d)
{
	u32_t value = 0;

	value |= (u32_t)((((u8_t)(d)) &amp;lt;&amp;lt; 24) &amp;amp; 0xFF000000);
	value |= (u32_t)((((u8_t)(c)) &amp;lt;&amp;lt; 16) &amp;amp; 0x00FF0000);
	value |= (u32_t)((((u8_t)(b)) &amp;lt;&amp;lt; 8) &amp;amp; 0x0000FF00);
	value |= (u32_t)((((u8_t)(a)) &amp;lt;&amp;lt; 0) &amp;amp; 0x000000FF);

	return value;
}

int blocking_recv(int fd, u8_t *buf, u32_t size, u32_t flags)
{
	int err;

	do {
		err = recv(fd, buf, size, flags);
	} while (err &amp;lt; 0 &amp;amp;&amp;amp; errno == EAGAIN);

	return err;
}

int blocking_send(int fd, u8_t *buf, u32_t size, u32_t flags)
{
	int err;

	do {
		err = send(fd, buf, size, flags);
	} while (err &amp;lt; 0 &amp;amp;&amp;amp; errno == EAGAIN);

	return err;
}

int blocking_connect(int fd, struct sockaddr *local_addr, socklen_t len)
{
	int err;

	do {
		err = connect(fd, local_addr, len);
	} while (err &amp;lt; 0 &amp;amp;&amp;amp; errno == EAGAIN);

	return err;
}

int sendLargeData(int sock, uint8_t *pSrc, int size)
{
  int sendCount = 0;
  int sendIx = 0;
  int err = 0;
  int remainSize = size;

  while (remainSize &amp;gt; 0)
  {
    if (remainSize &amp;gt; MAX_SOCKET_SEND_SIZE)
    {
      sendCount = MAX_SOCKET_SEND_SIZE;
    }
    else
    {
      sendCount = remainSize;
    }

    err = blocking_send(sock, (pSrc + sendIx), sendCount, 0);
    if (err != sendCount)
    {
      printk(&amp;quot;Error: send large data, c:%d, ix:%d\n&amp;quot;, err, sendIx);
      break;
    }
    remainSize -= sendCount;
    sendIx += sendCount;
#ifdef TEST_SEND_WITH_DELAY
    printk(&amp;quot;Send piece delay 200ms: %d\n&amp;quot;, sendCount);
    if (remainSize &amp;gt; 0)
    {
      k_sleep(200);
    }
#else
    printk(&amp;quot;Send piece NoDelay: %d\n&amp;quot;, sendCount);
#endif //TEST_SEND_WITH_DELAY

  }

  return sendIx;
}

void app_tcp_socket_start(void)
{
	struct addrinfo *res;
  static struct addrinfo hints;
  
	printk(&amp;quot;TCP example &amp;quot;);

  hints.ai_family = AF_INET;
  hints.ai_socktype = SOCK_STREAM;
	int err = getaddrinfo(TCP_HOST, TCP_PORT, &amp;amp;hints, &amp;amp;res);

	printk(&amp;quot;getaddrinfo err: %d\n\r&amp;quot;, err);
	//((struct sockaddr_in *)res-&amp;gt;ai_addr)-&amp;gt;sin_port = htons(TCP_PORT);
	//struct sockaddr_in local_addr;

	//local_addr.sin_family = AF_INET;
	//local_addr.sin_port = htons(0);
	//local_addr.sin_addr.s_addr = 0;

	int client_fd = socket(AF_INET, SOCK_STREAM, 0);

	printk(&amp;quot;client_fd: %d\n\r&amp;quot;, client_fd);
	//err = bind(client_fd, (struct sockaddr *)&amp;amp;local_addr,
	//	   sizeof(local_addr));
	//printk(&amp;quot;bind err: %d\n\r&amp;quot;, err);
	err = blocking_connect(client_fd, (struct sockaddr *)res-&amp;gt;ai_addr,
			       sizeof(struct sockaddr_in));
	printk(&amp;quot;connect err: %d\n\r&amp;quot;, errno);

	size_t ret;
  printk(&amp;quot;Send total data size: %d\n&amp;quot;, sizeof(send_buf) - 1);
#ifdef DO_TEST_1
  /* Luther add TEST 1: using blocking_send in one time */
  ret = blocking_send(client_fd, send_buf, sizeof(send_buf) - 1, 0);
  printk(&amp;quot;Test 1: blocking_send %d&amp;quot;, ret);
#else	
  /* Luther add TEST 2: slice small piece send large data. */
  ret = sendLargeData(client_fd, send_buf, sizeof(send_buf) - 1);
  printk(&amp;quot;Test 2: sendLargeData %d&amp;quot;, ret);
#endif //DO_TEST_1

	do {
		ret = blocking_recv(client_fd, recv_buf, sizeof(recv_buf) - 1,
				    0);
		if (ret &amp;gt; 0 &amp;amp;&amp;amp; ret &amp;lt; RECV_BUF_SIZE) {
			/* Ensure that string is zero terminated */
			recv_buf[ret] = 0;
			printk(&amp;quot;%s&amp;quot;, recv_buf);
		}
	} while (ret &amp;gt; 0);

	printk(&amp;quot;\n\rfin&amp;quot;);
	freeaddrinfo(res);
	err = close(client_fd);
}

/* initial the send buffer, fill 1 to 255*/
void init_send_buf()
{
  int size = sizeof(send_buf);
  int i = 0;
  for (i=0;i&amp;lt;size;i++)
  {
    send_buf[i] = (char)i;
  }
}

/**@brief Configures modem to provide LTE link. Blocks until link is
 * successfully established.
 */
static void modem_configure(void)
{
#if defined(CONFIG_LTE_LINK_CONTROL)
  if (IS_ENABLED(CONFIG_LTE_AUTO_INIT_AND_CONNECT)) {
    /* Do nothing, modem is already turned on
     * and connected.
     */
  } else {
    int err;
    printk(&amp;quot;LTE Link Connecting ...\n&amp;quot;);
    err = lte_lc_init_and_connect();
    __ASSERT(err == 0, &amp;quot;LTE link could not be established.&amp;quot;);
    printk(&amp;quot;LTE Link Connected!\n&amp;quot;);
  }
#endif
}

int main(void)
{
  /* Enable NBIoT */
  modem_configure();
  
  init_send_buf();
	app_tcp_socket_start();
  
  return 0;
}
&lt;/pre&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Need the nrf9160 example to transfer large data by TCP.</title><link>https://devzone.nordicsemi.com/thread/206350?ContentTypeID=1</link><pubDate>Tue, 27 Aug 2019 11:47:24 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:ab8c448e-ddec-4c55-b9dc-f7eb40d131d1</guid><dc:creator>Martin Lesund</dc:creator><description>&lt;p&gt;Please take a look at this &lt;a href="https://github.com/Rallare/fw-nrfconnect-nrf/blob/nrf9160_samples/samples/nrf9160/tcp/src/main.c" rel="noopener noreferrer" target="_blank"&gt;TCP &lt;/a&gt;sample and&amp;nbsp;use that as reference.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://devzone.nordicsemi.com/f/nordic-q-a/48086/publising-big-mqtt-msgs" rel="noopener noreferrer" target="_blank"&gt;(similar thread)&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Need the nrf9160 example to transfer large data by TCP.</title><link>https://devzone.nordicsemi.com/thread/206199?ContentTypeID=1</link><pubDate>Mon, 26 Aug 2019 20:58:54 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:8efc50e6-4406-4403-bf7d-2ee95ba68b49</guid><dc:creator>Luther</dc:creator><description>&lt;p&gt;Hi Martin,&lt;/p&gt;
&lt;p&gt;Thanks for your reply.&lt;br /&gt;I&amp;nbsp; already using the modem firmware v1.0.0.&lt;br /&gt;After I update the NCS, and update the two libbsd_nrf9160_xxaa.a files.&lt;br /&gt;It seems better now, it already running 10 hours and success to send the data to the server without error.&lt;br /&gt;I will continue testing.&lt;/p&gt;
&lt;p&gt;Thanks a lot.&lt;/p&gt;
&lt;p&gt;By the way, can you suggest a smart way to send the large data?&lt;br /&gt;Here is my send data function.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="c_cpp"&gt;#define MAX_SOCKET_SEND_SIZE  512

int sendLargeData(int sock, uint8_t *pSrc, int size)
{
  int sendCount = 0;
  int sendIx = 0;
  int err = 0;
  int remainSize = size;

  while (remainSize &amp;gt; 0)
  {
    if (remainSize &amp;gt; MAX_SOCKET_SEND_SIZE)
    {
      sendCount = MAX_SOCKET_SEND_SIZE;
    }
    else
    {
      sendCount = remainSize;
    }

    err = blocking_send(sock, (pSrc + sendIx), sendCount, 0);
    if (err != sendCount)
    {
      DBG_PRINT(&amp;quot;Error: send large data, c:%d, ix:%d\n&amp;quot;, err, sendIx);
      break;
    }
    remainSize -= sendCount;
    sendIx += sendCount;
    if (remainSize &amp;gt; 0)
    {
      k_sleep(200);
    }
  }

  return sendIx;
}&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;I slice the total data to small pieces, and add a delay k_sleep(200) after send each piece.&lt;br /&gt;It seems after call the send() function, the data just keep in the buffer. Not finished the sending data.&lt;br /&gt;I don&amp;#39;t know how to check the buffer is clear or not. So I just add a waiting time. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Need the nrf9160 example to transfer large data by TCP.</title><link>https://devzone.nordicsemi.com/thread/205861?ContentTypeID=1</link><pubDate>Fri, 23 Aug 2019 11:15:24 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:48f110b4-bdfa-47dd-a36d-1a504633855e</guid><dc:creator>Martin Lesund</dc:creator><description>&lt;p&gt;Hi Luther,&amp;nbsp;&lt;br /&gt;Please make sure you have the &lt;a href="https://devzone.nordicsemi.com/nordic/nordic-blog/b/blog/posts/how-to-get-production-version-v1-0-0-to-nrf9160" rel="noopener noreferrer" target="_blank"&gt;latest modem firmware&amp;nbsp;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And please add this fix into your environment:&amp;nbsp;&lt;a href="https://github.com/NordicPlayground/nrfxlib/pull/77"&gt;https://github.com/NordicPlayground/nrfxlib/pull/77&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Also please&amp;nbsp;share any log output or even a&lt;a href="https://devzone.nordicsemi.com/nordic/nordic-blog/b/blog/posts/how-to-get-modem-trace-using-trace-collector-in-nrf-connect" rel="noopener noreferrer" target="_blank"&gt; modem trace would be beneficial.&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>