]> AND Private Git Repository - Cipher_code.git/blob - Arduino/libraries/Firmata/utility/WiFiStream.h
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
add openssl hmac
[Cipher_code.git] / Arduino / libraries / Firmata / utility / WiFiStream.h
1 /*
2   WiFiStream.h
3
4   An Arduino Stream extension for a WiFiClient or WiFiServer to be used
5   with legacy Arduino WiFi shield and other boards and shields that
6   are compatible with the Arduino WiFi library.
7
8   Copyright (C) 2015-2016 Jesse Frush. All rights reserved.
9   Copyright (C) 2016      Jens B. All rights reserved.
10
11   This library is free software; you can redistribute it and/or
12   modify it under the terms of the GNU Lesser General Public
13   License as published by the Free Software Foundation; either
14   version 2.1 of the License, or (at your option) any later version.
15
16   See file LICENSE.txt for further informations on licensing terms.
17
18   Last updated April 23rd, 2016
19  */
20
21 #ifndef WIFI_STREAM_H
22 #define WIFI_STREAM_H
23
24 #include <inttypes.h>
25 #include <Stream.h>
26
27 #define HOST_CONNECTION_DISCONNECTED 0
28 #define HOST_CONNECTION_CONNECTED    1
29
30 extern "C" {
31   // callback function types
32   typedef void (*hostConnectionCallbackFunction)(byte);
33 }
34
35 class WiFiStream : public Stream
36 {
37 protected:
38   WiFiClient _client;
39   bool _connected = false;
40   hostConnectionCallbackFunction _currentHostConnectionCallback;
41
42   //configuration members
43   IPAddress _local_ip;                // DHCP
44   IPAddress _subnet;
45   IPAddress _gateway;
46   IPAddress _remote_ip;
47   uint16_t _port;
48   uint8_t _key_idx;                   //WEP
49   const char *_key = nullptr;         //WEP
50   const char *_passphrase = nullptr;  //WPA
51   char *_ssid = nullptr;
52
53   /**
54    * check if TCP client is connected
55    * @return true if connected
56    */
57   virtual bool connect_client() = 0;
58
59 public:
60   /** constructor for TCP server */
61   WiFiStream(uint16_t server_port) : _port(server_port) {}
62
63   /** constructor for TCP client */
64   WiFiStream(IPAddress server_ip, uint16_t server_port) : _remote_ip(server_ip), _port(server_port) {}
65
66   inline void attach( hostConnectionCallbackFunction newFunction ) { _currentHostConnectionCallback = newFunction; }
67
68 /******************************************************************************
69  *           network configuration
70  ******************************************************************************/
71
72 #ifndef ESP8266
73   /**
74    * configure a static local IP address without defining the local network
75    * DHCP will be used as long as local IP address is not defined
76    */
77   inline void config(IPAddress local_ip)
78   {
79     _local_ip = local_ip;
80     WiFi.config( local_ip );
81   }
82 #endif
83
84   /**
85    * configure a static local IP address
86    * DHCP will be used as long as local IP address is not defined
87    */
88   inline void config(IPAddress local_ip, IPAddress gateway, IPAddress subnet)
89   {
90     _local_ip = local_ip;
91     _subnet = subnet;
92     _gateway = gateway;
93 #ifndef ESP8266
94     WiFi.config( local_ip, IPAddress(0, 0, 0, 0), gateway, subnet );
95 #else
96     WiFi.config( local_ip, gateway, subnet );
97 #endif
98   }
99
100   /**
101    * @return local IP address
102    */
103   inline IPAddress getLocalIP()
104   {
105     return WiFi.localIP();
106   }
107
108 /******************************************************************************
109  *           network functions
110  ******************************************************************************/
111
112   /**
113    * maintain WiFi and TCP connection
114    * @return true if WiFi and TCP connection are established
115    */
116   virtual bool maintain() = 0;
117
118 #ifdef ESP8266
119   /**
120    * get status of TCP connection
121    * @return status of TCP connection
122    *         CLOSED      = 0 (typical)
123    *         LISTEN      = 1 (not used)
124    *         SYN_SENT    = 2
125    *         SYN_RCVD    = 3
126    *         ESTABLISHED = 4 (typical)
127    *         FIN_WAIT_1  = 5
128    *         FIN_WAIT_2  = 6
129    *         CLOSE_WAIT  = 7
130    *         CLOSING     = 8
131    *         LAST_ACK    = 9
132    *         TIME_WAIT   = 10
133    */
134   inline uint8_t status()
135   {
136     return _client.status();
137   }
138 #endif
139
140   /**
141    * close TCP client connection
142    */
143   virtual void stop() = 0;
144
145 /******************************************************************************
146  *           WiFi configuration
147  ******************************************************************************/
148
149   /**
150    * initialize WiFi without security (open) and initiate client connection
151    * if WiFi connection is already established
152    * @return WL_CONNECTED if WiFi connection is established
153    */
154   inline int begin(char *ssid)
155   {
156     _ssid = ssid;
157
158     WiFi.begin(ssid);
159     int result = WiFi.status();
160     return WiFi.status();
161   }
162
163 #ifndef ESP8266
164   /**
165    * initialize WiFi with WEP security and initiate client connection
166    * if WiFi connection is already established
167    * @return WL_CONNECTED if WiFi connection is established
168    */
169   inline int begin(char *ssid, uint8_t key_idx, const char *key)
170   {
171     _ssid = ssid;
172     _key_idx = key_idx;
173     _key = key;
174
175     WiFi.begin( ssid, key_idx, key );
176     return WiFi.status();
177   }
178 #endif
179
180   /**
181    * initialize WiFi with WPA-PSK security and initiate client connection
182    * if WiFi connection is already established
183    * @return WL_CONNECTED if WiFi connection is established
184    */
185   inline int begin(char *ssid, const char *passphrase)
186   {
187     _ssid = ssid;
188     _passphrase = passphrase;
189
190     WiFi.begin(ssid, passphrase);
191     return WiFi.status();
192   }
193
194
195 /******************************************************************************
196  *             stream functions
197  ******************************************************************************/
198
199   inline int available()
200   {
201     return connect_client() ? _client.available() : 0;
202   }
203
204   inline void flush()
205   {
206     if( _client ) _client.flush();
207   }
208
209   inline int peek()
210   {
211     return connect_client() ? _client.peek(): 0;
212   }
213
214   inline int read()
215   {
216     return connect_client() ? _client.read() : -1;
217   }
218
219   inline size_t write(uint8_t byte)
220   {
221     return connect_client() ? _client.write( byte ) : 0;
222   }
223
224 };
225
226 #endif //WIFI_STREAM_H