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; }
357 if (!localAddress(
addr))
return 0;
361 virtual void setCACert(
const char*
cert) {
362 Logger.error(WIFICLIENT,
"setCACert not supported");
365 void setConnectionTimeout(
int32_t timeout) {
366 connectTimeout = timeout;
369 int32_t getConnectionTimeout() {
370 return connectTimeout;
374 const char* WIFICLIENT =
"EthernetClient";
376 std::shared_ptr<SocketImpl> p_sock =
nullptr;
377 int bufferSize = 256;
380 bool is_connected =
false;
411 if (timeout_ms < 0) {
414 Logger.error(WIFICLIENT,
"Hostname resolution failed");
419 auto promise = std::make_shared<std::promise<IPAddress>>();
426 if (
future.wait_for(std::chrono::milliseconds(timeout_ms)) ==
427 std::future_status::ready) {
431 Logger.error(WIFICLIENT,
"Hostname resolution failed");
437 Logger.error(WIFICLIENT,
"Hostname resolution timeout");
447 return resolveHostname(address, timeout_ms);
452 void registerCleanup() {
455 SignalHandler::registerHandler(
SIGINT, cleanupAll);
456 SignalHandler::registerHandler(
SIGTERM, cleanupAll);
461 int read(
uint8_t* buffer,
size_t len)
override {
462 Logger.debug(WIFICLIENT,
"read");
464 long timeout = millis() + getTimeout();
465 result = p_sock->read(buffer, len);
466 while (result == 0 && millis() < timeout) {
468 result = p_sock->read(buffer, len);
473 Logger.debug(WIFICLIENT,
"read->",
lenStr);
481 if (!p_sock || p_sock->fd() == INVALID_SOCKET_HANDLE)
return false;
483 if (::getsockname(p_sock->fd(), (
struct sockaddr*)&
addr, &len) != 0)
488 bool connectedFast() {
return is_connected; }