/*
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);
}
}
}
}
}
Moderator: igrr
https://www.hackster.io/rayburne/tardis-time-esp8266-ap-webserver-gps-6b5d2a
Ray
mrburnette wrote:'tis can also be done with UDP:
https://www.hackster.io/rayburne/tardis-time-esp8266-ap-webserver-gps-6b5d2a
Ray
As far as I can tell the OP wasn't asking of a way to do this, he was giving one. So it seems to me that you are giving an answer to and answer.
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?
Bo B
Sweden