1
1
#include " WiFiSSLClient.h"
2
2
3
3
/* -------------------------------------------------------------------------- */
4
- WiFiSSLClient::WiFiSSLClient () {
4
+ WiFiSSLClient::WiFiSSLClient () : _sock(- 1 ) {
5
5
/* -------------------------------------------------------------------------- */
6
6
7
7
}
8
8
9
+ /* -------------------------------------------------------------------------- */
10
+ void WiFiSSLClient::getSocket () {
11
+ /* -------------------------------------------------------------------------- */
12
+ if (_sock == -1 ) {
13
+ string res = " " ;
14
+ modem.begin ();
15
+ if (modem.write (string (PROMPT (_SSLBEGINCLIENT)),res, " %s" , CMD (_SSLBEGINCLIENT))) {
16
+ _sock = atoi (res.c_str ());
17
+ }
18
+ }
19
+ }
20
+
9
21
/* -------------------------------------------------------------------------- */
10
22
int WiFiSSLClient::connect (IPAddress ip, uint16_t port) {
11
23
/* -------------------------------------------------------------------------- */
12
24
getSocket ();
13
25
string res = " " ;
14
- if (modem.write (string (PROMPT (_SSLCLIENTCONNECT )),res, " %s%d,%s,%d\r\n " , CMD_WRITE (_SSLCLIENTCONNECT ), _sock, ip.toString (), port)) {
26
+ if (modem.write (string (PROMPT (_SSLCLIENTCONNECTIP )),res, " %s%d,%s,%d\r\n " , CMD_WRITE (_SSLCLIENTCONNECTIP ), _sock, ip.toString (), port)) {
15
27
return 1 ;
16
28
}
17
29
return 0 ;
@@ -22,28 +34,214 @@ int WiFiSSLClient::connect(const char* host, uint16_t port) {
22
34
/* -------------------------------------------------------------------------- */
23
35
getSocket ();
24
36
string res = " " ;
25
- if (modem.write (DO_NOT_CHECK_CMD ,res, " %s%d,%s,%d\r\n " , CMD_WRITE (_SSLCLIENTCONNECT ), _sock, host, port)) {
37
+ if (modem.write (string ( PROMPT (_SSLCLIENTCONNECTNAME)) ,res, " %s%d,%s,%d\r\n " , CMD_WRITE (_SSLCLIENTCONNECTNAME ), _sock, host, port)) {
26
38
return 1 ;
27
39
}
28
40
return 0 ;
29
41
}
30
42
31
43
/* -------------------------------------------------------------------------- */
32
- void WiFiSSLClient::setCACert (const char * root_ca) {
44
+ void WiFiSSLClient::setCACert (const char * root_ca, size_t size ) {
33
45
/* -------------------------------------------------------------------------- */
34
46
getSocket ();
35
47
string res = " " ;
36
- modem.write (string (PROMPT (_SETCAROOT)),res, " %s%d,%s\r\n " , CMD_WRITE (_SETCAROOT), _sock,root_ca);
48
+ Serial.print (" size " );
49
+ Serial.println (size);
50
+ if (size > 0 ) {
51
+ modem.write_nowait (string (PROMPT (_SETCAROOT)),res, " %s%d,%d\r\n " , CMD_WRITE (_SETCAROOT), _sock, size);
52
+ if (modem.passthrough ((uint8_t *)root_ca, size)) {
53
+ return ;
54
+ }
55
+ } else {
56
+ modem.write (string (PROMPT (_SETCAROOT)),res, " %s%d\r\n " , CMD_WRITE (_SETCAROOT), _sock);
57
+ }
37
58
}
38
59
39
60
/* -------------------------------------------------------------------------- */
40
61
void WiFiSSLClient::setInsecure () {
41
62
/* -------------------------------------------------------------------------- */
42
63
getSocket ();
43
64
string res = " " ;
44
- modem.write (DO_NOT_CHECK_CMD,res, " %s%d\r\n " , CMD_WRITE (_SSLSETINSERCURE), _sock);
45
- // if(modem.write(string(PROMPT(_SSLSETINSERCURE)),res, "%s%d\r\n" , CMD_WRITE(_SSLSETINSERCURE), _sock)) {
46
- // return true;
47
- // }
48
-
65
+ modem.write (string (PROMPT (_SSLSETINSERCURE)),res, " %s%d\r\n " , CMD_WRITE (_SSLSETINSERCURE), _sock);
66
+
67
+ }
68
+
69
+ /* -------------------------------------------------------------------------- */
70
+ size_t WiFiSSLClient::write (uint8_t b){
71
+ /* -------------------------------------------------------------------------- */
72
+ return write (&b, 1 );
73
+ }
74
+
75
+ /* -------------------------------------------------------------------------- */
76
+ size_t WiFiSSLClient::write (const uint8_t *buf, size_t size){
77
+ /* -------------------------------------------------------------------------- */
78
+ if (_sock >= 0 ) {
79
+ string res = " " ;
80
+ modem.begin ();
81
+ modem.write_nowait (string (PROMPT (_SSLCLIENTSEND)),res, " %s%d,%d\r\n " , CMD_WRITE (_SSLCLIENTSEND), _sock, size);
82
+ if (modem.passthrough (buf,size)) {
83
+ return size;
84
+ }
85
+
86
+ }
87
+ return 0 ;
88
+
89
+ }
90
+
91
+ /* -------------------------------------------------------------------------- */
92
+ int WiFiSSLClient::available (){
93
+ /* -------------------------------------------------------------------------- */
94
+ int rv = 0 ;
95
+ if (_sock >= 0 ) {
96
+ if (rx_buffer.available () > 0 ) {
97
+ return rx_buffer.available ();
98
+ }
99
+ else {
100
+ string res = " " ;
101
+ modem.begin ();
102
+ if (modem.write (string (PROMPT (_SSLAVAILABLE)),res, " %s%d\r\n " , CMD_WRITE (_SSLAVAILABLE), _sock)) {
103
+ rv = atoi (res.c_str ());
104
+ }
105
+ }
106
+ }
107
+ return rv;
108
+ }
109
+
110
+ /* -------------------------------------------------------------------------- */
111
+ int WiFiSSLClient::_read () {
112
+ /* -------------------------------------------------------------------------- */
113
+ int rv = -1 ;
114
+ if (_sock >= 0 ) {
115
+ string res = " " ;
116
+ uint32_t size = rx_buffer.freePositions () - 1 ;
117
+ modem.begin ();
118
+
119
+ /* important - it works one shot */
120
+ modem.avoid_trim_results ();
121
+ modem.read_using_size ();
122
+ if (modem.write (string (PROMPT (_SSLCLIENTRECEIVE)),res, " %s%d,%d\r\n " , CMD_WRITE (_SSLCLIENTRECEIVE), _sock, size)) {
123
+ for (int i = 0 , rv = 0 ; i < size && i < res.size (); i++) {
124
+ rx_buffer.store ((uint8_t )res[i]);
125
+ rv++;
126
+ }
127
+ }
128
+ }
129
+ return rv;
130
+ }
131
+
132
+ /* -------------------------------------------------------------------------- */
133
+ bool WiFiSSLClient::read_needed (size_t s) {
134
+ /* -------------------------------------------------------------------------- */
135
+ if ((size_t )rx_buffer.available () < s) {
136
+ _read ();
137
+ }
138
+ }
139
+
140
+ /* -------------------------------------------------------------------------- */
141
+ int WiFiSSLClient::read () {
142
+ /* -------------------------------------------------------------------------- */
143
+ uint8_t b;
144
+ if (read (&b, 1 ) == 1 ) {
145
+ return b;
146
+ }
147
+ return -1 ;
49
148
}
149
+
150
+ /* -------------------------------------------------------------------------- */
151
+ int WiFiSSLClient::read (uint8_t *buf, size_t size) {
152
+ /* -------------------------------------------------------------------------- */
153
+ read_needed (size);
154
+ int rv = 0 ;
155
+ bool go_on = true ;
156
+ for (int i = 0 ; i < size && go_on; i++) {
157
+ bool is_read = false ;
158
+ *(buf+i) = rx_buffer.read (&is_read);
159
+ if (is_read) {
160
+ rv++;
161
+ }
162
+ else {
163
+ go_on = false ;
164
+ }
165
+ }
166
+ return rv;
167
+ }
168
+
169
+ /* -------------------------------------------------------------------------- */
170
+ int WiFiSSLClient::peek () {
171
+ /* -------------------------------------------------------------------------- */
172
+ int rv = -1 ;
173
+ if (_sock >= 0 ) {
174
+ string res = " " ;
175
+ modem.begin ();
176
+ if (modem.write (string (PROMPT (_SSLPEEK)),res, " %s%d\r\n " , CMD_WRITE (_SSLPEEK), _sock)) {
177
+ rv = atoi (res.c_str ());
178
+ }
179
+ }
180
+ return rv;
181
+ }
182
+
183
+
184
+ /* -------------------------------------------------------------------------- */
185
+ void WiFiSSLClient::flush () {
186
+ /* -------------------------------------------------------------------------- */
187
+ if (_sock >= 0 ) {
188
+ string res = " " ;
189
+ modem.begin ();
190
+ modem.write (string (PROMPT (_SSLCLIENTFLUSH)),res, " %s%d\r\n " , CMD_WRITE (_SSLCLIENTFLUSH), _sock);
191
+ }
192
+ }
193
+
194
+ /* -------------------------------------------------------------------------- */
195
+ void WiFiSSLClient::stop () {
196
+ /* -------------------------------------------------------------------------- */
197
+ if (_sock >= 0 ) {
198
+ string res = " " ;
199
+ modem.begin ();
200
+ modem.write (string (PROMPT (_SSLCLIENTCLOSE)),res, " %s%d\r\n " , CMD_WRITE (_SSLCLIENTCLOSE), _sock);
201
+ _sock = -1 ;
202
+ }
203
+ }
204
+
205
+ /* -------------------------------------------------------------------------- */
206
+ uint8_t WiFiSSLClient::connected () {
207
+ /* -------------------------------------------------------------------------- */
208
+ uint8_t rv = 0 ;
209
+ if (_sock >= 0 ) {
210
+ string res = " " ;
211
+ modem.begin ();
212
+ if (modem.write (string (PROMPT (_SSLCLIENTCONNECTED)),res, " %s%d\r\n " , CMD_WRITE (_SSLCLIENTCONNECTED), _sock)) {
213
+ rv = atoi (res.c_str ());
214
+ }
215
+ }
216
+ return rv;
217
+ }
218
+
219
+ /* -------------------------------------------------------------------------- */
220
+ IPAddress WiFiSSLClient::remoteIP () {
221
+ /* -------------------------------------------------------------------------- */
222
+ IPAddress ip;
223
+ if (_sock >= 0 ) {
224
+ string res = " " ;
225
+ modem.begin ();
226
+ if (modem.write (string (PROMPT (_SSLREMOTEIP)),res, " %s%d\r\n " , CMD_WRITE (_SSLREMOTEIP), _sock)) {
227
+ ip.fromString (res.c_str ());
228
+ return ip;
229
+ }
230
+ }
231
+ return IPAddress (0 ,0 ,0 ,0 );
232
+ }
233
+
234
+ /* -------------------------------------------------------------------------- */
235
+ uint16_t WiFiSSLClient::remotePort (){
236
+ /* -------------------------------------------------------------------------- */
237
+ uint16_t rv = 0 ;
238
+ if (_sock >= 0 ) {
239
+ string res = " " ;
240
+ modem.begin ();
241
+ if (modem.write (string (PROMPT (_SSLREMOTEPORT)),res, " %s%d\r\n " , CMD_WRITE (_SSLREMOTEPORT), _sock)) {
242
+ rv = atoi (res.c_str ());
243
+ return rv;
244
+ }
245
+ }
246
+ return rv;
247
+ }
0 commit comments