I am trying to design some test cases to check the LTE stability and performance.
#include <zephyr.h>
#include <stdio.h>
#include <string.h>
#include <gps.h>
#include <sensor.h>
#include <console.h>
#include <nrf_cloud.h>
#include <dk_buttons_and_leds.h>
#include <lte_lc.h>
#include <misc/reboot.h>
#include <bsd.h>
#include "nrf_socket.h"
#include "orientation_detector.h"
#include <net/socket.h>
#include <sys/time.h>
#define TCP_HOST "45.33.53.75"
#define TCP_PORT 9090
#define LC_MAX_READ_LENGTH1 128
#define AT_CMD_SIZE1(x) (sizeof(x) - 1)
static const char subscribe[] = "AT+CEREG=2";
static const char psm_disable[] = "AT+CPSMS=0";
static const char normal[] = "AT+CFUN=1";
static const char success[] = "OK";
static const char status1[] = "+CEREG: 1";
static const char status2[] = "+CEREG:1";
static const char status3[] = "+CEREG: 5";
static const char status4[] = "+CEREG:5";
static int at_cmd1(int fd, const char *cmd, size_t size)
{
int len;
u8_t buffer[LC_MAX_READ_LENGTH1];
printk("====AT send (%d bytes): %s\n", strlen(cmd), cmd);
len = send(fd, cmd, size, 0);
if (len != size) {
printk("***ERROR: AT send: failed, ret=%d.\n", len);
return -1;
}
for (int i=0; i<50; i++) // wait for 5s
{
len = recv(fd, buffer, LC_MAX_READ_LENGTH1, MSG_DONTWAIT);
if (len > 0)
{
printk("====AT receive (%d bytes): %s", strlen(buffer), buffer);
return 0;
}
k_sleep(K_MSEC(100));
}
printk("**********AT receive ERROR.\n");
return -1;
}
void main(void)
{
printk("Application started\n");
int err;
int at_socket_fd;
u8_t buffer[LC_MAX_READ_LENGTH1];
// create AT socket
at_socket_fd = socket(AF_LTE, 0, NPROTO_AT);
// start modem
at_cmd1(at_socket_fd, subscribe, AT_CMD_SIZE1(subscribe));
at_cmd1(at_socket_fd, psm_disable, AT_CMD_SIZE1(psm_disable));
at_cmd1(at_socket_fd, normal, AT_CMD_SIZE1(normal));
// wait for LET connection ready
printk("LTE connecting ...\n");
while (true) {
int bytes;
bytes = recv(at_socket_fd, buffer, LC_MAX_READ_LENGTH1, 0);
if (bytes) {
buffer[bytes] = 0;
printk("====AT receive (%d bytes): %s", bytes, buffer);
if (!memcmp(status1, buffer, AT_CMD_SIZE1(status1)) ||
!memcmp(status2, buffer, AT_CMD_SIZE1(status2)) ||
!memcmp(status3, buffer, AT_CMD_SIZE1(status3)) ||
!memcmp(status4, buffer, AT_CMD_SIZE1(status4))) {
break;
}
}
}
printk("\nLTE connected\n\n");
// get server IP address
struct addrinfo * server_addr;
err = getaddrinfo(TCP_HOST, NULL, NULL, &server_addr);
if (err != 0)
{
printk("***ERROR: failed to get server IP address\n");
return 0;
}
// print server IP address
{
u8_t * p2 = &(((struct sockaddr_in *)server_addr->ai_addr)->sin_addr.s_addr);
printk("server IP addr=%d.%d.%d.%d\n", p2[0], p2[1], p2[2], p2[3]);
}
// set server TCP listening port
((struct sockaddr_in *)server_addr->ai_addr)->sin_port = htons(TCP_PORT);
// create & bind TCP socket
int tcp_socket_fd;
{
tcp_socket_fd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in local_addr;
local_addr.sin_family = AF_INET;
local_addr.sin_port = htons(0);
local_addr.sin_addr.s_addr = 0;
err = bind(tcp_socket_fd, (struct sockaddr *)&local_addr, sizeof(local_addr));
if (err != 0)
{
printk("TCP sokcet bind err: %d\n\r", err);
return;
}
}
// connect to server
while(1)
{
printk("\nTCP connect()...\n");
err = connect(tcp_socket_fd, (struct sockaddr *)server_addr->ai_addr, sizeof(struct sockaddr_in));
if (err == 0)
{
printk("TCP connect() succeeded\n\n");
break;
}
k_sleep(K_MSEC(1000)); // delay 1s
}
// check modem status; send TCP data to server
int loop = 1;
while(1)
{
// read AT socket to see if there is any data; with non-block mode read
while (true)
{
int bytes;
bytes = recv(at_socket_fd, buffer, LC_MAX_READ_LENGTH1, MSG_DONTWAIT );
if (bytes <= 0)
break;
buffer[bytes] = 0;
printk("====AT receive (%d bytes): %s", bytes, buffer);
}
printk("---------------------------------------- %d\n", loop++);
// send AT command to check modem status
// at_cmd1(at_socket_fd, "AT%XCBAND", AT_CMD_SIZE1("AT%XCBAND"));
at_cmd1(at_socket_fd, "AT+CESQ", AT_CMD_SIZE1("AT+CESQ"));
at_cmd1(at_socket_fd, "AT+CEREG?", AT_CMD_SIZE1("AT+CEREG?"));
at_cmd1(at_socket_fd, "AT+CGDCONT?", AT_CMD_SIZE1("AT+CGDCONT?"));
// send TCP data to server
#if 1
static char buf[] = {"a"};
static int len = sizeof(buf);
err = send(tcp_socket_fd, buf, len, 0);
if (err != len)
printk("**********TCP send: error=%d.\n", err);
else
printk("====TCP send (%d bytes)\n", len);
#endif
// sleep 10s
k_sleep(K_MSEC(10000));
}
close(at_socket_fd);
return 0;
}
***** Booting Zephyr OS v1.13.99-ncs2 ***** Secure Boot: configure flash Secure Boot: SPU: set region 0 as Secure Secure Boot: SPU: set region 1 as Secure Secure Boot: SPU: set region 2 as Secure Secure Boot: SPU: set region 3 as Secure Secure Boot: SPU: set region 4 as Secure Secure Boot: SPU: set region 5 as Secure Secure Boot: SPU: set region 6 as Secure Secure Boot: SPU: set region 7 as Secure Secure Boot: SPU: set Flash region 8 as Non-Secure Secure Boot: SPU: set Flash region 9 as Non-Secure Secure Boot: SPU: set Flash region 10 as Non-Secure Secure Boot: SPU: set Flash region 11 as Non-Secure Secure Boot: SPU: set Flash region 12 as Non-Secure Secure Boot: SPU: set Flash region 13 as Non-Secure Secure Boot: SPU: set Flash region 14 as Non-Secure Secure Boot: SPU: set Flash region 15 as Non-Secure Secure Boot: SPU: set Flash region 16 as Non-Secure Secure Boot: SPU: set Flash region 17 as Non-Secure Secure Boot: SPU: set Flash region 18 as Non-Secure Secure Boot: SPU: set Flash region 19 as Non-Secure Secure Boot: SPU: set Flash region 20 as Non-Secure Secure Boot: SPU: set Flash region 21 as Non-Secure Secure Boot: SPU: set Flash region 22 as Non-Secure Secure Boot: SPU: set Flash region 23 as Non-Secure Secure Boot: SPU: set Flash region 24 as Non-Secure Secure Boot: SPU: set Flash region 25 as Non-Secure Secure Boot: SPU: set Flash region 26 as Non-Secure Secure Boot: SPU: set Flash region 27 as Non-Secure Secure Boot: SPU: set Flash region 28 as Non-Secure Secure Boot: SPU: set Flash region 29 as Non-Secure Secure Boot: SPU: set Flash region 30 as Non-Secure Secure Boot: SPU: set Flash region 31 as Non-Secure Secure Boot: configure SRAM Secure Boot: SPU: set SRAM region 0 as Secure Secure Boot: SPU: set SRAM region 1 as Secure Secure Boot: SPU: set SRAM region 2 as Secure Secure Boot: SPU: set SRAM region 3 as Secure Secure Boot: SPU: set SRAM region 4 as Secure Secure Boot: SPU: set SRAM region 5 as Secure Secure Boot: SPU: set SRAM region 6 as Secure Secure Boot: SPU: set SRAM region 7 as Secure Secure Boot: SPU: set SRAM region 8 as Non-Secure Secure Boot: SPU: set SRAM region 9 as Non-Secure Secure Boot: SPU: set SRAM region 10 as Non-Secure Secure Boot: SPU: set SRAM region 11 as Non-Secure Secure Boot: SPU: set SRAM region 12 as Non-Secure Secure Boot: SPU: set SRAM region 13 as Non-Secure Secure Boot: SPU: set SRAM region 14 as Non-Secure Secure Boot: SPU: set SRAM region 15 as Non-Secure Secure Boot: SPU: set SRAM region 16 as Non-Secure Secure Boot: SPU: set SRAM region 17 as Non-Secure Secure Boot: SPU: set SRAM region 18 as Non-Secure Secure Boot: SPU: set SRAM region 19 as Non-Secure Secure Boot: SPU: set SRAM region 20 as Non-Secure Secure Boot: SPU: set SRAM region 21 as Non-Secure Secure Boot: SPU: set SRAM region 22 as Non-Secure Secure Boot: SPU: set SRAM region 23 as Non-Secure Secure Boot: SPU: set SRAM region 24 as Non-Secure Secure Boot: SPU: set SRAM region 25 as Non-Secure Secure Boot: SPU: set SRAM region 26 as Non-Secure Secure Boot: SPU: set SRAM region 27 as Non-Secure Secure Boot: SPU: set SRAM region 28 as Non-Secure Secure Boot: SPU: set SRAM region 29 as Non-Secure Secure Boot: SPU: set SRAM region 30 as Non-Secure Secure Boot: SPU: set SRAM region 31 as Non-Secure Secure Boot: configure peripherals Secure Boot: MSP_NS 20029828 Secure Boot: prepare to jump to Non-Secure image ***** Booting Zephyr OS v1.13.99-ncs2 ***** Application started ====AT send (10 bytes): AT+CEREG=2 ====AT receive (4 bytes): OK ====AT send (10 bytes): AT+CPSMS=0 ====AT receive (4 bytes): OK ====AT send (9 bytes): AT+CFUN=1 ====AT receive (4 bytes): OK LTE connecting ... ====AT receive (32 bytes): +CEREG: 2,"2005","00803103",7 ====AT receive (32 bytes): +CEREG: 1,"2005","00803103",7 LTE connected server IP addr=45.33.53.75 TCP connect()... TCP connect() succeeded ---------------------------------------- 1 ====AT send (7 bytes): AT+CESQ ====AT receive (33 bytes): +CESQ: 99,99,255,255,255,51 OK ====AT send (9 bytes): AT+CEREG? ====AT receive (37 bytes): +CEREG: 2,1,"2005","00803103",7 OK ====AT send (11 bytes): AT+CGDCONT? ====AT receive (101 bytes): +CGDCONT: 0,"IPV4V6","vzwinternet","100.88.205.249 2600:1010:B007:C50D:0000:0057:158A:9F01",0,0 OK ====TCP send (2 bytes) ---------------------------------------- 2 ====AT send (7 bytes): AT+CESQ ====AT receive (33 bytes): +CESQ: 99,99,255,255,255,51 OK ====AT send (9 bytes): AT+CEREG? ====AT receive (37 bytes): +CEREG: 2,1,"2005","00803103",7 OK ====AT send (11 bytes): AT+CGDCONT? ====AT receive (101 bytes): +CGDCONT: 0,"IPV4V6","vzwinternet","100.88.205.249 2600:1010:B007:C50D:0000:0057:158A:9F01",0,0 OK ====TCP send (2 bytes) ---------------------------------------- 3 ====AT send (7 bytes): AT+CESQ ====AT receive (33 bytes): +CESQ: 99,99,255,255,255,51 OK ====AT send (9 bytes): AT+CEREG? ====AT receive (37 bytes): +CEREG: 2,1,"2005","00803103",7 OK ====AT send (11 bytes): AT+CGDCONT? ====AT receive (101 bytes): +CGDCONT: 0,"IPV4V6","vzwinternet","100.88.205.249 2600:1010:B007:C50D:0000:0057:158A:9F01",0,0 OK ====TCP send (2 bytes) ---------------------------------------- 4 ====AT send (7 bytes): AT+CESQ