57 _macAddress[0] = 0xDE; _macAddress[1] = 0xAD; _macAddress[2] = 0xBE; _macAddress[3] = 0xEF; _macAddress[4] = 0xFE; _macAddress[5] = 0xED;
64 _retransmissionCount = 8;
65 _retransmissionTimeout = 2000;
69 bool begin(
uint8_t macAddress[6]) {
70 setMACAddress(macAddress);
75 setMACAddress(macAddress);
77 setDnsServerIP(dnsServerIP);
86 IPAddress subnetMask() {
return _subnetMask; }
88 IPAddress gatewayIP() {
return _gatewayIP; }
90 IPAddress dnsServerIP() {
return _dnsServerIP; }
92 void MACAddress(
uint8_t* mac) {
for (
int i=0;
i<6; ++
i) mac[
i] = _macAddress[
i]; }
94 void setMACAddress(
const uint8_t* mac) {
for (
int i=0;
i<6; ++
i) _macAddress[
i] = mac[
i]; }
102 void setDnsServerIP(
const IPAddress&
ip) { _dnsServerIP =
ip; }
106 void setRetransmissionTimeout(
uint16_t timeout) { _retransmissionTimeout = timeout; }
109 int hardwareStatus() {
return _hardwareStatus; }
111 int linkStatus() {
return _linkStatus; }
115 int maintain() {
return 0; }
123 int _hardwareStatus = 1;
125 uint8_t _retransmissionCount = 8;
126 uint16_t _retransmissionTimeout = 2000;
133 static std::vector<EthernetClient*>& active_clients() {
134 static std::vector<EthernetClient*>
clients;
137 static void cleanupAll(
int sig) {
138 for (
auto*
client : active_clients()) {
148 p_sock = std::make_shared<SocketImpl>();
152 active_clients().push_back(
this);
157 this->bufferSize = bufferSize;
161 is_connected = p_sock->connected();
163 active_clients().push_back(
this);
170 p_sock = std::make_shared<SocketImpl>(
socket);
171 is_connected = p_sock->connected();
175 virtual uint8_t connected()
override {
176 if (!is_connected || !p_sock)
return false;
181 is_connected = p_sock->connected();
186 operator bool()
override {
return connected(); }
190 return connect(
ipAddress, port, getConnectionTimeout());
199 return connect(str.c_str(), port, timeout_ms);
203 virtual int connect(
const char* address,
uint16_t port)
override {
204 return connect(address, port, getConnectionTimeout());
208 Logger.info(WIFICLIENT,
"connect");
210 if (connectedFast()) {
216 is_connected =
false;
224 if (timeout_ms >= 0) {
233 Logger.info(
"Connecting to ", str.c_str());
241 is_connected =
false;
248 virtual size_t write(
char c) {
return write((
uint8_t)
c); }
252 virtual size_t write(
uint8_t c)
override {
253 if (writeBuffer.availableToWrite() == 0) {
256 return writeBuffer.write(
c);
259 virtual size_t write(
const char* str,
int len) {
260 return write((
const uint8_t*)str, len);
264 virtual size_t write(
const uint8_t* str,
size_t len)
override {
266 return p_sock->write(str, len);
269 virtual int print(
const char* str =
"") {
271 return write(str, len);
274 virtual int println(
const char* str =
"") {
276 int result = write(str, len);
284 virtual void flush()
override {
285 Logger.debug(WIFICLIENT,
"flush");
296 virtual int available()
override {
297 Logger.debug(WIFICLIENT,
"available");
298 if (readBuffer.available() > 0) {
299 return readBuffer.available();
301 long timeout = millis() + getTimeout();
302 int result = p_sock->available();
303 while (result <= 0 && millis() < timeout) {
305 result = p_sock->available();
311 virtual int read()
override {
314 if (readBytes(&
c, 1) == 1) {
320 virtual size_t readBytes(
char* buffer,
size_t len) {
321 int result = read((
uint8_t*)buffer, len);
325 virtual size_t readBytes(
uint8_t* buffer,
size_t len) {
326 int result = read(buffer, len);
331 virtual int peek()
override {
332 return p_sock->peek();
337 virtual void stop()
override { p_sock->close(); }
339 virtual void setInsecure() {}
341 int fd() {
return p_sock->fd(); }
343 uint16_t remotePort() {
return port; }
347 virtual void setCACert(
const char*
cert) {
348 Logger.error(WIFICLIENT,
"setCACert not supported");
351 void setConnectionTimeout(
int32_t timeout) {
352 connectTimeout = timeout;
355 int32_t getConnectionTimeout() {
356 return connectTimeout;
360 const char* WIFICLIENT =
"EthernetClient";
362 std::shared_ptr<SocketImpl> p_sock =
nullptr;
363 int bufferSize = 256;
366 bool is_connected =
false;
397 if (timeout_ms < 0) {
400 Logger.error(WIFICLIENT,
"Hostname resolution failed");
405 auto promise = std::make_shared<std::promise<IPAddress>>();
412 if (
future.wait_for(std::chrono::milliseconds(timeout_ms)) ==
413 std::future_status::ready) {
417 Logger.error(WIFICLIENT,
"Hostname resolution failed");
423 Logger.error(WIFICLIENT,
"Hostname resolution timeout");
433 return resolveHostname(address, timeout_ms);
438 void registerCleanup() {
441 SignalHandler::registerHandler(
SIGINT, cleanupAll);
442 SignalHandler::registerHandler(
SIGTERM, cleanupAll);
447 int read(
uint8_t* buffer,
size_t len)
override {
448 Logger.debug(WIFICLIENT,
"read");
450 long timeout = millis() + getTimeout();
451 result = p_sock->read(buffer, len);
452 while (result == 0 && millis() < timeout) {
454 result = p_sock->read(buffer, len);
459 Logger.debug(WIFICLIENT,
"read->",
lenStr);
464 bool connectedFast() {
return is_connected; }