2020-06-22 03:11:02 +03:00
|
|
|
#include "Module/Telnet.h"
|
|
|
|
|
|
|
|
|
|
bool Telnet::onInit() {
|
|
|
|
|
_server = new WiFiServer(_port);
|
|
|
|
|
_term = new Terminal();
|
|
|
|
|
_term->enableControlCodes();
|
|
|
|
|
_term->enableEcho(false);
|
|
|
|
|
_term->setStream(&_client);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Telnet::onEnd() {
|
|
|
|
|
delete _server;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool Telnet::onStart() {
|
|
|
|
|
_server->begin();
|
|
|
|
|
_server->setNoDelay(true);
|
|
|
|
|
return _server->status() != CLOSED;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Telnet::onStop() {
|
|
|
|
|
if (hasClient()) {
|
|
|
|
|
_client.stop();
|
|
|
|
|
}
|
|
|
|
|
_server->stop();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool Telnet::hasClient() { return _client.connected(); }
|
|
|
|
|
|
|
|
|
|
void Telnet::sendData(const String& data) {
|
|
|
|
|
if (hasClient()) {
|
|
|
|
|
_client.write(data.c_str());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-06-24 01:33:42 +03:00
|
|
|
void Telnet::setCommandShell(CommandShell* shell) {
|
|
|
|
|
_shell = shell;
|
|
|
|
|
_shell->setTerm(_term);
|
|
|
|
|
}
|
|
|
|
|
|
2020-06-22 03:11:02 +03:00
|
|
|
void Telnet::setEventHandler(TelnetEventHandler h) { _eventHandler = h; }
|
|
|
|
|
|
|
|
|
|
void Telnet::onLoop() {
|
|
|
|
|
if (_server->hasClient()) {
|
|
|
|
|
if (!_client) {
|
|
|
|
|
_client = _server->available();
|
|
|
|
|
} else {
|
|
|
|
|
if (!_client.connected()) {
|
|
|
|
|
_server->stop();
|
|
|
|
|
_client = _server->available();
|
|
|
|
|
} else {
|
|
|
|
|
WiFiClient rejected;
|
|
|
|
|
rejected = _server->available();
|
|
|
|
|
rejected.stop();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (_lastConnected != hasClient()) {
|
|
|
|
|
_lastConnected = hasClient();
|
|
|
|
|
if (_lastConnected) {
|
|
|
|
|
onConnect();
|
|
|
|
|
} else {
|
|
|
|
|
onDisconnect();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (hasClient() && _shell != nullptr) _shell->loop();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool Telnet::isShellActive() {
|
|
|
|
|
return _shell->active();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Telnet::onConnect() {
|
|
|
|
|
if (_eventHandler) {
|
|
|
|
|
_eventHandler(TE_CONNECTED, &_client);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Telnet::onDisconnect() {
|
|
|
|
|
if (_eventHandler) {
|
|
|
|
|
_eventHandler(TE_DISCONNECTED, nullptr);
|
|
|
|
|
}
|
|
|
|
|
}
|