You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

227 lines
5.7 KiB

/*
WiFiStream.h
An Arduino Stream extension for a WiFiClient or WiFiServer to be used
with legacy Arduino WiFi shield and other boards and shields that
are compatible with the Arduino WiFi library.
Copyright (C) 2015-2016 Jesse Frush. All rights reserved.
Copyright (C) 2016 Jens B. All rights reserved.
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.
See file LICENSE.txt for further informations on licensing terms.
Last updated April 23rd, 2016
*/
#ifndef WIFI_STREAM_H
#define WIFI_STREAM_H
#include <inttypes.h>
#include <Stream.h>
#define HOST_CONNECTION_DISCONNECTED 0
#define HOST_CONNECTION_CONNECTED 1
extern "C" {
// callback function types
typedef void (*hostConnectionCallbackFunction)(byte);
}
class WiFiStream : public Stream
{
protected:
WiFiClient _client;
bool _connected = false;
hostConnectionCallbackFunction _currentHostConnectionCallback;
//configuration members
IPAddress _local_ip; // DHCP
IPAddress _subnet;
IPAddress _gateway;
IPAddress _remote_ip;
uint16_t _port;
uint8_t _key_idx; //WEP
const char *_key = nullptr; //WEP
const char *_passphrase = nullptr; //WPA
char *_ssid = nullptr;
/**
* check if TCP client is connected
* @return true if connected
*/
virtual bool connect_client() = 0;
public:
/** constructor for TCP server */
WiFiStream(uint16_t server_port) : _port(server_port) {}
/** constructor for TCP client */
WiFiStream(IPAddress server_ip, uint16_t server_port) : _remote_ip(server_ip), _port(server_port) {}
inline void attach( hostConnectionCallbackFunction newFunction ) { _currentHostConnectionCallback = newFunction; }
/******************************************************************************
* network configuration
******************************************************************************/
#ifndef ESP8266
/**
* configure a static local IP address without defining the local network
* DHCP will be used as long as local IP address is not defined
*/
inline void config(IPAddress local_ip)
{
_local_ip = local_ip;
WiFi.config( local_ip );
}
#endif
/**
* configure a static local IP address
* DHCP will be used as long as local IP address is not defined
*/
inline void config(IPAddress local_ip, IPAddress gateway, IPAddress subnet)
{
_local_ip = local_ip;
_subnet = subnet;
_gateway = gateway;
#ifndef ESP8266
WiFi.config( local_ip, IPAddress(0, 0, 0, 0), gateway, subnet );
#else
WiFi.config( local_ip, gateway, subnet );
#endif
}
/**
* @return local IP address
*/
inline IPAddress getLocalIP()
{
return WiFi.localIP();
}
/******************************************************************************
* network functions
******************************************************************************/
/**
* maintain WiFi and TCP connection
* @return true if WiFi and TCP connection are established
*/
virtual bool maintain() = 0;
#ifdef ESP8266
/**
* get status of TCP connection
* @return status of TCP connection
* CLOSED = 0 (typical)
* LISTEN = 1 (not used)
* SYN_SENT = 2
* SYN_RCVD = 3
* ESTABLISHED = 4 (typical)
* FIN_WAIT_1 = 5
* FIN_WAIT_2 = 6
* CLOSE_WAIT = 7
* CLOSING = 8
* LAST_ACK = 9
* TIME_WAIT = 10
*/
inline uint8_t status()
{
return _client.status();
}
#endif
/**
* close TCP client connection
*/
virtual void stop() = 0;
/******************************************************************************
* WiFi configuration
******************************************************************************/
/**
* initialize WiFi without security (open) and initiate client connection
* if WiFi connection is already established
* @return WL_CONNECTED if WiFi connection is established
*/
inline int begin(char *ssid)
{
_ssid = ssid;
WiFi.begin(ssid);
int result = WiFi.status();
return WiFi.status();
}
#ifndef ESP8266
/**
* initialize WiFi with WEP security and initiate client connection
* if WiFi connection is already established
* @return WL_CONNECTED if WiFi connection is established
*/
inline int begin(char *ssid, uint8_t key_idx, const char *key)
{
_ssid = ssid;
_key_idx = key_idx;
_key = key;
WiFi.begin( ssid, key_idx, key );
return WiFi.status();
}
#endif
/**
* initialize WiFi with WPA-PSK security and initiate client connection
* if WiFi connection is already established
* @return WL_CONNECTED if WiFi connection is established
*/
inline int begin(char *ssid, const char *passphrase)
{
_ssid = ssid;
_passphrase = passphrase;
WiFi.begin(ssid, passphrase);
return WiFi.status();
}
/******************************************************************************
* stream functions
******************************************************************************/
inline int available()
{
return connect_client() ? _client.available() : 0;
}
inline void flush()
{
if( _client ) _client.flush();
}
inline int peek()
{
return connect_client() ? _client.peek(): 0;
}
inline int read()
{
return connect_client() ? _client.read() : -1;
}
inline size_t write(uint8_t byte)
{
return connect_client() ? _client.write( byte ) : 0;
}
};
#endif //WIFI_STREAM_H