22
33extern WiFiClass WiFi;
44
5- #ifndef WIFI_TCP_BUFFER_SIZE
6- #define WIFI_TCP_BUFFER_SIZE 1508
7- #endif
8-
95#ifndef SOCKET_TIMEOUT
10- #define SOCKET_TIMEOUT 1000
6+ #define SOCKET_TIMEOUT 1500
117#endif
128
139arduino::WiFiClient::WiFiClient ():
@@ -19,45 +15,96 @@ uint8_t arduino::WiFiClient::status() {
1915return _status;
2016}
2117
18+ void arduino::WiFiClient::readSocket () {
19+ while (1 ) {
20+ event->wait_any (0xFF , 100 );
21+ uint8_t data[SOCKET_BUFFER_SIZE];
22+ int ret = NSAPI_ERROR_WOULD_BLOCK;
23+ do {
24+ mutex->lock ();
25+ if (rxBuffer.availableForStore () == 0 ) {
26+ yield ();
27+ }
28+ if (sock == nullptr || (closing && borrowed_socket)) {
29+ goto cleanup;
30+ }
31+ ret = sock->recv (data, rxBuffer.availableForStore ());
32+ if (ret < 0 && ret != NSAPI_ERROR_WOULD_BLOCK) {
33+ goto cleanup;
34+ }
35+ for (int i = 0 ; i < ret; i++) {
36+ rxBuffer.store_char (data[i]);
37+ }
38+ _status = true ;
39+ mutex->unlock ();
40+ } while (ret == NSAPI_ERROR_WOULD_BLOCK || ret > 0 );
41+ }
42+ cleanup:
43+ _status = false ;
44+ mutex->unlock ();
45+ return ;
46+ }
47+
2248void arduino::WiFiClient::getStatus () {
23- if (sock == nullptr ) {
24- _status = false ;
25- return ;
49+ event->set (1 );
50+ }
51+
52+ void arduino::WiFiClient::setSocket (Socket* _sock) {
53+ sock = _sock;
54+ configureSocket (sock);
55+ }
56+
57+ void arduino::WiFiClient::configureSocket (Socket* _s) {
58+ _s->set_timeout (0 );
59+ _s->set_blocking (false );
60+
61+ if (event == nullptr ) {
62+ event = new rtos::EventFlags;
63+ }
64+ if (mutex == nullptr ) {
65+ mutex = new rtos::Mutex;
2666}
27-
28- uint8_t data[256 ];
29- int ret = sock->recv (data, rxBuffer.availableForStore ());
30- for (int i = 0 ; i < ret; i++) {
31- rxBuffer.store_char (data[i]);
32- }
33- if (ret < 0 && ret != NSAPI_ERROR_WOULD_BLOCK) {
34- _status = false ;
35- }
36- _status = true ;
67+ mutex->lock ();
68+ if (reader_th == nullptr ) {
69+ reader_th = new rtos::Thread;
70+ reader_th->start (mbed::callback (this , &WiFiClient::readSocket));
71+ }
72+ mutex->unlock ();
73+ _s->sigio (mbed::callback (this , &WiFiClient::getStatus));
74+ _status = true ;
3775}
3876
3977int arduino::WiFiClient::connect (SocketAddress socketAddress) {
4078if (sock == nullptr ) {
41- sock = new TCPSocket ();
42- if (static_cast <TCPSocket*>(sock)->open (WiFi.getNetwork ()) != NSAPI_ERROR_OK){
43- return 0 ;
44- }
79+ sock = new TCPSocket ();
80+ _own_socket = true ;
4581}
46- // sock->sigio(mbed::callback(this, &WiFiClient::getStatus));
47- // sock->set_blocking(false);
82+ if (sock == nullptr ) {
83+ return 0 ;
84+ }
85+
86+ if (static_cast <TCPSocket*>(sock)->open (WiFi.getNetwork ()) != NSAPI_ERROR_OK){
87+ return 0 ;
88+ }
89+
4890address = socketAddress;
49- sock->set_timeout (SOCKET_TIMEOUT);
5091nsapi_error_t returnCode = static_cast <TCPSocket*>(sock)->connect (socketAddress);
5192int ret = 0 ;
93+
5294switch (returnCode) {
5395case NSAPI_ERROR_IS_CONNECTED:
5496case NSAPI_ERROR_OK: {
5597ret = 1 ;
5698break ;
5799}
58100}
59- if (ret == 1 )
101+
102+ if (ret == 1 ) {
103+ configureSocket (sock);
60104_status = true ;
105+ } else {
106+ _status = false ;
107+ }
61108
62109return ret;
63110}
@@ -73,28 +120,48 @@ int arduino::WiFiClient::connect(const char *host, uint16_t port) {
73120return connect (socketAddress);
74121}
75122
76- int arduino::WiFiClient::connectSSL (SocketAddress socketAddress){
123+ int arduino::WiFiClient::connectSSL (SocketAddress socketAddress) {
77124if (sock == nullptr ) {
78125sock = new TLSSocket ();
79- if (static_cast <TLSSocket*>(sock)->open (WiFi.getNetwork ()) != NSAPI_ERROR_OK){
80- return 0 ;
81- }
126+ _own_socket = true ;
127+ }
128+ if (sock == nullptr ) {
129+ return 0 ;
82130}
131+
83132if (beforeConnect) {
84133beforeConnect ();
85134}
86- sock->set_timeout (SOCKET_TIMEOUT);
135+
136+ if (static_cast <TLSSocket*>(sock)->open (WiFi.getNetwork ()) != NSAPI_ERROR_OK){
137+ return 0 ;
138+ }
139+
140+ address = socketAddress;
141+
142+ restart_connect:
87143nsapi_error_t returnCode = static_cast <TLSSocket*>(sock)->connect (socketAddress);
88144int ret = 0 ;
145+
89146switch (returnCode) {
90- case NSAPI_ERROR_IS_CONNECTED:
91- case NSAPI_ERROR_OK: {
92- ret = 1 ;
93- break ;
94- }
147+ case NSAPI_ERROR_IS_CONNECTED:
148+ case NSAPI_ERROR_OK: {
149+ ret = 1 ;
150+ break ;
151+ }
152+ case NSAPI_ERROR_IN_PROGRESS:
153+ case NSAPI_ERROR_ALREADY: {
154+ delay (100 );
155+ goto restart_connect;
156+ }
95157}
96- if (ret == 1 )
158+
159+ if (ret == 1 ) {
160+ configureSocket (sock);
97161_status = true ;
162+ } else {
163+ _status = false ;
164+ }
98165
99166return ret;
100167}
@@ -111,36 +178,38 @@ int arduino::WiFiClient::connectSSL(const char *host, uint16_t port) {
111178}
112179
113180size_t arduino::WiFiClient::write (uint8_t c) {
114- if (sock == nullptr )
115- return 0 ;
116- auto ret = sock->send (&c, 1 );
117- return ret;
181+ return write (&c, 1 );
118182}
119183
120184size_t arduino::WiFiClient::write (const uint8_t *buf, size_t size) {
121185if (sock == nullptr )
122186return 0 ;
123187
124- auto ret = sock->send (buf, size);
125- return ret;
188+ sock->set_blocking (true );
189+ sock->set_timeout (SOCKET_TIMEOUT);
190+ sock->send (buf, size);
191+ configureSocket (sock);
192+ return size;
126193}
127194
128195int arduino::WiFiClient::available () {
129- if (rxBuffer.available () == 0 ) {
130- getStatus ();
131- }
132- return rxBuffer.available ();
196+ int ret = rxBuffer.available ();
197+ return ret;
133198}
134199
135200int arduino::WiFiClient::read () {
201+ mutex->lock ();
136202if (!available ()) {
137203 return -1 ;
138204}
139205
140- return rxBuffer.read_char ();
206+ int ret = rxBuffer.read_char ();
207+ mutex->unlock ();
208+ return ret;
141209}
142210
143211int arduino::WiFiClient::read (uint8_t *data, size_t len) {
212+ mutex->lock ();
144213int avail = available ();
145214
146215if (!avail) {
@@ -154,6 +223,7 @@ int arduino::WiFiClient::read(uint8_t *data, size_t len) {
154223for (size_t i = 0 ; i < len; i++) {
155224data[i] = rxBuffer.read_char ();
156225}
226+ mutex->unlock ();
157227
158228return len;
159229}
@@ -167,15 +237,38 @@ void arduino::WiFiClient::flush() {
167237}
168238
169239void arduino::WiFiClient::stop () {
170- if (sock != nullptr ) {
171- sock->close ();
240+ if (mutex != nullptr ) {
241+ mutex->lock ();
242+ }
243+ if (sock != nullptr && borrowed_socket == false ) {
244+ if (_own_socket) {
245+ delete sock;
246+ } else {
247+ sock->close ();
248+ }
172249sock = nullptr ;
173250}
251+ closing = true ;
252+ if (mutex != nullptr ) {
253+ mutex->unlock ();
254+ }
255+ if (reader_th != nullptr ) {
256+ reader_th->join ();
257+ delete reader_th;
258+ reader_th = nullptr ;
259+ }
260+ if (event != nullptr ) {
261+ delete event;
262+ event = nullptr ;
263+ }
264+ if (mutex != nullptr ) {
265+ delete mutex;
266+ mutex = nullptr ;
267+ }
174268_status = false ;
175269}
176270
177271uint8_t arduino::WiFiClient::connected () {
178- getStatus ();
179272return _status;
180273}
181274
0 commit comments