54 _macAddress[0] = 0xDE; _macAddress[1] = 0xAD; _macAddress[2] = 0xBE; _macAddress[3] = 0xEF; _macAddress[4] = 0xFE; _macAddress[5] = 0xED;
61 _retransmissionCount = 8;
62 _retransmissionTimeout = 2000;
66 bool begin(
uint8_t macAddress[6]) {
67 setMACAddress(macAddress);
72 setMACAddress(macAddress);
74 setDnsServerIP(dnsServerIP);
83 IPAddress subnetMask() {
return _subnetMask; }
85 IPAddress gatewayIP() {
return _gatewayIP; }
87 IPAddress dnsServerIP() {
return _dnsServerIP; }
89 void MACAddress(
uint8_t* mac) {
for (
int i=0;
i<6; ++
i) mac[
i] = _macAddress[
i]; }
91 void setMACAddress(
const uint8_t* mac) {
for (
int i=0;
i<6; ++
i) _macAddress[
i] = mac[
i]; }
99 void setDnsServerIP(
const IPAddress&
ip) { _dnsServerIP =
ip; }
103 void setRetransmissionTimeout(
uint16_t timeout) { _retransmissionTimeout = timeout; }
106 int hardwareStatus() {
return _hardwareStatus; }
108 int linkStatus() {
return _linkStatus; }
112 int maintain() {
return 0; }
120 int _hardwareStatus = 1;
122 uint8_t _retransmissionCount = 8;
123 uint16_t _retransmissionTimeout = 2000;
130 static std::vector<EthernetClient*>& active_clients() {
131 static std::vector<EthernetClient*>
clients;
134 static void cleanupAll(
int sig) {
135 for (
auto*
client : active_clients()) {
145 p_sock = std::make_shared<SocketImpl>();
149 active_clients().push_back(
this);
154 this->bufferSize = bufferSize;
158 is_connected = p_sock->connected();
160 active_clients().push_back(
this);
167 p_sock = std::make_shared<SocketImpl>(
socket);
168 is_connected = p_sock->connected();
172 virtual uint8_t connected()
override {
173 if (!is_connected)
return false;
174 if (p_sock->connected())
return true;
175 long timeout = millis() + getConnectionTimeout();
177 while (
result <= 0 && millis() < timeout) {
179 result = p_sock->connected();
185 operator bool()
override {
return connected(); }
194 return connect(str.c_str(), port);
198 virtual int connect(
const char* address,
uint16_t port)
override {
199 Logger.info(WIFICLIENT,
"connect");
201 if (connectedFast()) {
206 is_connected =
false;
211 Logger.info(
"Connecting to ", str.c_str());
212 p_sock->connect(str.c_str(), port);
217 virtual size_t write(
char c) {
return write((
uint8_t)
c); }
221 virtual size_t write(
uint8_t c)
override {
222 if (writeBuffer.availableToWrite() == 0) {
225 return writeBuffer.write(
c);
228 virtual size_t write(
const char* str,
int len) {
229 return write((
const uint8_t*)str, len);
233 virtual size_t write(
const uint8_t* str,
size_t len)
override {
235 return p_sock->write(str, len);
238 virtual int print(
const char* str =
"") {
240 return write(str, len);
243 virtual int println(
const char* str =
"") {
245 int result = write(str, len);
253 virtual void flush()
override {
254 Logger.debug(WIFICLIENT,
"flush");
265 virtual int available()
override {
266 Logger.debug(WIFICLIENT,
"available");
267 if (readBuffer.available() > 0) {
268 return readBuffer.available();
270 long timeout = millis() + getTimeout();
271 int result = p_sock->available();
272 while (
result <= 0 && millis() < timeout) {
274 result = p_sock->available();
280 virtual int read()
override {
283 if (readBytes(&
c, 1) == 1) {
289 virtual size_t readBytes(
char* buffer,
size_t len) {
290 return read((
uint8_t*)buffer, len);
293 virtual size_t readBytes(
uint8_t* buffer,
size_t len) {
294 return read(buffer, len);
298 virtual int peek()
override {
299 return p_sock->peek();
304 virtual void stop()
override { p_sock->close(); }
306 virtual void setInsecure() {}
308 int fd() {
return p_sock->fd(); }
310 uint16_t remotePort() {
return port; }
314 virtual void setCACert(
const char*
cert) {
315 Logger.error(WIFICLIENT,
"setCACert not supported");
318 void setConnectionTimeout(
int32_t timeout) {
319 connectTimeout = timeout;
322 int32_t getConnectionTimeout() {
323 return connectTimeout;
327 const char* WIFICLIENT =
"EthernetClient";
329 std::shared_ptr<SocketImpl> p_sock =
nullptr;
330 int bufferSize = 256;
333 bool is_connected =
false;
345 struct hostent*
he = ::gethostbyname(address);
346 if (
he ==
nullptr ||
he->h_addr_list[0] ==
nullptr) {
347 Logger.error(WIFICLIENT,
"Hostname resolution failed");
356 void registerCleanup() {
359 SignalHandler::registerHandler(
SIGINT, cleanupAll);
360 SignalHandler::registerHandler(
SIGTERM, cleanupAll);
365 int read(
uint8_t* buffer,
size_t len)
override {
366 Logger.debug(WIFICLIENT,
"read");
368 long timeout = millis() + getTimeout();
369 result = p_sock->read(buffer, len);
370 while (
result <= 0 && millis() < timeout) {
372 result = p_sock->read(buffer, len);
377 Logger.debug(WIFICLIENT,
"read->",
lenStr);
382 bool connectedFast() {
return is_connected; }