Example sketches for the new Arduino IDE for ESP8266

Moderator: igrr

User avatar
By gbafamily1
#64737 Modification of the WiFiTelnetToSerial example program included with the ESP8266 board support package to use softAP mode. This has been used to connect a GPS receiver to the ESP UART port running at 9600. First, the client must connect to the SSID "TCPUARTBridge" with password "12345678". Next the client must open a TCP connection to 192.168.1.1 port 23. At this point, the TCP client receives NMEA output from the GPS receiver. There is nothing specific to GPS in this program so it can be used with other serial devices.

Code: Select all/*
  WiFiTelnetToSerial - Example Transparent UART to Telnet Server for esp8266

  Copyright (c) 2015 Hristo Gochkov. All rights reserved.
  This file is part of the ESP8266WiFi library for Arduino environment.

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

/*
   Modified to use softAP mode. No need for Internet connection.
*/
#include <ESP8266WiFi.h>

//how many clients should be able to telnet to this ESP8266
#define MAX_SRV_CLIENTS 1
#define TCP_PORT (23)           // Choose any port you want
WiFiServer tcpServer(TCP_PORT);
WiFiClient tcpServerClients[MAX_SRV_CLIENTS];

IPAddress apIP(192, 168, 1, 1);
const char SSID[] = "TCPUARTBridge";  // Choose any SSID
const char PASSWORD[] = "12345678"; // minimum 8 characters. !!!CHANGE THIS!!!

#define SerialDebug Serial1   // Debug goes out on GPIO02
#define SerialGPS   Serial    // GPS or other device connected to the ESP UART

#ifndef min
#define min(x,y)  ((x)<(y)?(x):(y))
#endif

void setup() {
  // !!! Debug output goes to GPIO02 !!!
  SerialDebug.begin(115200);
  SerialDebug.println("TCP <-> UART bridge");

  WiFi.mode(WIFI_AP);
  WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));
  WiFi.softAP(SSID, PASSWORD);

  //start UART. Be sure to set the speed to match the speed of whatever is
  //connected  to the UART.
  SerialGPS.begin(9600);

  // Start TCP listener on port TCP_PORT
  tcpServer.begin();
  tcpServer.setNoDelay(true);
  SerialDebug.print("Ready! Use 'telnet or nc ");
  SerialDebug.print(WiFi.localIP());
  SerialDebug.print(' ');
  SerialDebug.print(TCP_PORT);
  SerialDebug.println("' to connect");
}

void loop() {
  uint8_t i;
  char buf[1024];
  int bytesAvail, bytesIn;

  //check if there are any new clients
  if (tcpServer.hasClient()) {
    for (i = 0; i < MAX_SRV_CLIENTS; i++) {
      //find free/disconnected spot
      if (!tcpServerClients[i] || !tcpServerClients[i].connected()) {
        if (tcpServerClients[i]) tcpServerClients[i].stop();
        tcpServerClients[i] = tcpServer.available();
        SerialDebug.print("New client: "); SerialDebug.print(i);
        continue;
      }
    }
    //no free/disconnected spot so reject
    WiFiClient tcpServerClient = tcpServer.available();
    tcpServerClient.stop();
  }

  //check clients for data
  for (i = 0; i < MAX_SRV_CLIENTS; i++) {
    if (tcpServerClients[i] && tcpServerClients[i].connected()) {
      //get data from the telnet client and push it to the UART
      while ((bytesAvail = tcpServerClients[i].available()) > 0) {
        bytesIn = tcpServerClients[i].readBytes(buf, min(sizeof(buf), bytesAvail));
        if (bytesIn > 0) {
          SerialGPS.write(buf, bytesIn);
          delay(0);
        }
      }
    }
  }

  //check UART for data
  while ((bytesAvail = SerialGPS.available()) > 0) {
    bytesIn = SerialGPS.readBytes(buf, min(sizeof(buf), bytesAvail));
    if (bytesIn > 0) {
      //push UART data to all connected telnet clients
      for (i = 0; i < MAX_SRV_CLIENTS; i++) {
        if (tcpServerClients[i] && tcpServerClients[i].connected()) {
          tcpServerClients[i].write((uint8_t*)buf, bytesIn);
          delay(0);
        }
      }
    }
  }
}
User avatar
By BobAGI
#64924
gbafamily1 wrote:First, the client must connect to the SSID "TCPUARTBridge" with password "12345678". Next the client must open a TCP connection to 192.168.1.1 port 23.

Question1:
What will be the IP address of the connected client? Is SoftAP mode also implementing a DHCP server to set the client IP address? If so how is it configured?
I am investigating ways for the ESP8266 to open a TCP connection to the client in this mode and need the client IP address.
There is nothing specific to GPS in this program so it can be used with other serial devices.

Question2:
I would like to know if the serial transfers using this mode is completely transparent to the data being transferred?
Our device sends large data blocks in some modes and these are pure binary so any byte sequence can occur, like multiple 0x00 bytes (NULL) and also '+++Axyz' which must not escape the system into AT command handling!

CODE comment:
I have understood all that is included! Very simple and wasy to understand this part.
But how is DHCP IP range set up for the SoftAP server?