Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add new example: telnet echo server #663

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions examples/telnet_echo/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Makefile for access_point example
PROGRAM=telnet_echo

include ../../common.mk
167 changes: 167 additions & 0 deletions examples/telnet_echo/telnet_echo.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
/**
* Very basic example showing usage of netconn data receive echo over telnet.
* the connection.
*
* This example code is in the public domain.
*/
#include <string.h>

#include <espressif/esp_common.h>
#include <esp/uart.h>
#include <FreeRTOS.h>
#include <task.h>
#include <queue.h>

#include <ssid_config.h>

#include <lwip/api.h>

#define TELNET_PORT 23
#define ECHO_PREFIX "\r\nYou entered: "
#define ECHO_POSTFIX "\r\n"
#define INPUT_ERROR "\r\nERROR: input line too long - try again.\r\n"
#define BYE "\r\nBYE\r\n"

static void telnetTask(void *pvParameters);

static void heartbeatTask(void *pvParameters){
while(1){
vTaskDelay(1000 / portTICK_PERIOD_MS);
printf("Uptime %d seconds\r\n", xTaskGetTickCount() * portTICK_PERIOD_MS / 1000);
}
}

void user_init(void)
{
uart_set_baud(0, 115200);
printf("SDK version:%s\n", sdk_system_get_sdk_version());

struct sdk_station_config config = {
.ssid = WIFI_SSID,
.password = WIFI_PASS,
};

sdk_wifi_set_opmode(STATION_MODE);
sdk_wifi_station_set_config(&config);
sdk_wifi_station_connect();

xTaskCreate(telnetTask, "telnetTask", 512, NULL, 2, NULL);
xTaskCreate(heartbeatTask, "heardbeatTask", 512, NULL, 2, NULL);
}

/* Telnet task listens on port 23, returns some status information and then closes
the connection if you connect to it.
*/
static void telnetTask(void *pvParameters)
{
struct netconn *nc = netconn_new(NETCONN_TCP);
if (!nc)
{
printf("Status monitor: Failed to allocate socket.\r\n");
return;
}
netconn_bind(nc, IP_ANY_TYPE, TELNET_PORT);
netconn_listen(nc);

while (1)
{
struct netconn *client = NULL;
#ifdef DEBUG
printf("waiting for new connection\n");
#endif
err_t err = netconn_accept(nc, &client);

if (err != ERR_OK)
{
if (client){
netconn_delete(client);
}
continue;
}

ip_addr_t client_addr;
uint16_t port_ignore;
netconn_peer(client, &client_addr, &port_ignore);
// TODO check return codes
char buf[80];
snprintf(buf, sizeof(buf), "Uptime %d seconds\r\n", xTaskGetTickCount() * portTICK_PERIOD_MS / 1000);
netconn_write(client, buf, strlen(buf), NETCONN_COPY);
snprintf(buf, sizeof(buf), "Free heap %d bytes\r\n", (int) xPortGetFreeHeapSize());
netconn_write(client, buf, strlen(buf), NETCONN_COPY);
char abuf[40];
snprintf(buf, sizeof(buf), "Your address is %s\r\n\r\n", ipaddr_ntoa_r(&client_addr, abuf, sizeof(abuf)));
netconn_write(client, buf, strlen(buf), NETCONN_COPY);

char input_line[160] = {'\0'};
size_t buffer_pos = 0;
while(err == ERR_OK)
{
struct netbuf *nb;
if ((err = netconn_recv(client, &nb)) == ERR_OK) {
char *data_in = NULL;
uint16_t data_len = 0;
err = netbuf_data(nb, (void*)&data_in, &data_len);

if(err != ERR_OK){
if(nb != NULL){
netbuf_delete(nb);
}
break;
}
#ifdef DEBUG
printf("input[%d]: %s\n", data_len, data_in);
#endif
// check for termination request
if((data_len == 1 && data_in[0] == 0x04) || (data_len == 2 && data_in[0] == 0xFF && data_in[1] == 0xEC)){
#ifdef DEBUG
printf("exit requested\n");
#endif
err = netconn_write(client, BYE, strlen(BYE), NETCONN_NOFLAG);
if(nb != NULL){
netbuf_delete(nb);
}
break;
}

// check if there's space left in the buffer
if(buffer_pos + data_len < sizeof(input_line)) {
// copy data into input buffer
if(data_len > 0){
memcpy(&input_line[buffer_pos], (char*)data_in, data_len);
buffer_pos += data_len;
// check for line ending
if((data_len >= 2) &&
(((data_in[data_len-2] == 0x0D) && (data_in[data_len-1] == 0x00))
||
((data_in[data_len-2] == '\r') && (data_in[data_len-1] == '\n')))){ // \r\n
#ifdef DEBUG
printf("got line ending\n");
#endif
netconn_write(client, ECHO_PREFIX, strlen(ECHO_PREFIX), NETCONN_NOFLAG);
netconn_write(client, input_line, strlen(input_line), NETCONN_COPY);
netconn_write(client, ECHO_POSTFIX, strlen(ECHO_POSTFIX), NETCONN_NOFLAG);

// set buffer to zero, otherwise we would have to add the null byte by hand
memset(input_line, 0, sizeof(input_line));
buffer_pos = 0;
}
}
} else {
netconn_write(client, INPUT_ERROR, strlen(INPUT_ERROR), NETCONN_NOFLAG);
memset(input_line, 0, sizeof(input_line));
buffer_pos = 0;
}
}
if(nb != NULL){
netbuf_delete(nb);
}
}
memset(input_line, 0, sizeof(input_line));
buffer_pos = 0;
netconn_close(client);
netconn_delete(client);
#ifdef DEBUG
printf("connection close\n");
#endif
}
}