Klika Tech / Mbed 2 deprecated Nucleo-AWS-IoT-mbed

Dependencies:   X_NUCLEO_IKS01A1 mbed FP MQTTPacket DnsQuery ATParser

Committer:
PavelSavyhin
Date:
Wed Sep 27 14:40:52 2017 +0300
Revision:
0:4cdaf9b1e7d0
Child:
1:042ca9148926
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
PavelSavyhin 0:4cdaf9b1e7d0 1 /* SPWFInterface Example
PavelSavyhin 0:4cdaf9b1e7d0 2 * Copyright (c) 2015 ARM Limited
PavelSavyhin 0:4cdaf9b1e7d0 3 *
PavelSavyhin 0:4cdaf9b1e7d0 4 * Licensed under the Apache License, Version 2.0 (the "License");
PavelSavyhin 0:4cdaf9b1e7d0 5 * you may not use this file except in compliance with the License.
PavelSavyhin 0:4cdaf9b1e7d0 6 * You may obtain a copy of the License at
PavelSavyhin 0:4cdaf9b1e7d0 7 *
PavelSavyhin 0:4cdaf9b1e7d0 8 * http://www.apache.org/licenses/LICENSE-2.0
PavelSavyhin 0:4cdaf9b1e7d0 9 *
PavelSavyhin 0:4cdaf9b1e7d0 10 * Unless required by applicable law or agreed to in writing, software
PavelSavyhin 0:4cdaf9b1e7d0 11 * distributed under the License is distributed on an "AS IS" BASIS,
PavelSavyhin 0:4cdaf9b1e7d0 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
PavelSavyhin 0:4cdaf9b1e7d0 13 * See the License for the specific language governing permissions and
PavelSavyhin 0:4cdaf9b1e7d0 14 * limitations under the License.
PavelSavyhin 0:4cdaf9b1e7d0 15 */
PavelSavyhin 0:4cdaf9b1e7d0 16
PavelSavyhin 0:4cdaf9b1e7d0 17 #include "SPWFSA01.h"
PavelSavyhin 0:4cdaf9b1e7d0 18 #include "mbed_debug.h"
PavelSavyhin 0:4cdaf9b1e7d0 19 #include "stdint.h"
PavelSavyhin 0:4cdaf9b1e7d0 20
PavelSavyhin 0:4cdaf9b1e7d0 21 #define SPWFSA01_CONNECT_TIMEOUT 15000
PavelSavyhin 0:4cdaf9b1e7d0 22 #define SPWFSA01_SEND_TIMEOUT 500
PavelSavyhin 0:4cdaf9b1e7d0 23 #define SPWFSA01_RECV_TIMEOUT 1500//some commands like AT&F/W takes some time to get the result back!
PavelSavyhin 0:4cdaf9b1e7d0 24 #define SPWFSA01_MISC_TIMEOUT 500
PavelSavyhin 0:4cdaf9b1e7d0 25 #define SPWFSA01_SOCKQ_TIMEOUT 3000
PavelSavyhin 0:4cdaf9b1e7d0 26
PavelSavyhin 0:4cdaf9b1e7d0 27 #define EPOCH_TIME 1453727657//Human time (GMT): Mon, 25 Jan 2016 13:14:17 GMT
PavelSavyhin 0:4cdaf9b1e7d0 28
PavelSavyhin 0:4cdaf9b1e7d0 29 SPWFSA01::SPWFSA01(PinName tx, PinName rx, PinName reset, PinName wakeup, bool debug)
PavelSavyhin 0:4cdaf9b1e7d0 30 : _serial(tx, rx, 1024), _parser(_serial,"\r\n", 2048),
PavelSavyhin 0:4cdaf9b1e7d0 31 _wakeup(wakeup, PIN_OUTPUT, PullNone, 0),
PavelSavyhin 0:4cdaf9b1e7d0 32 _reset(reset, PIN_OUTPUT, PullNone, 1),
PavelSavyhin 0:4cdaf9b1e7d0 33 dbg_on(debug)
PavelSavyhin 0:4cdaf9b1e7d0 34 {
PavelSavyhin 0:4cdaf9b1e7d0 35 _serial.baud(115200); // LICIO FIXME increase the speed
PavelSavyhin 0:4cdaf9b1e7d0 36 _parser.debugOn(debug);
PavelSavyhin 0:4cdaf9b1e7d0 37 }
PavelSavyhin 0:4cdaf9b1e7d0 38
PavelSavyhin 0:4cdaf9b1e7d0 39 bool SPWFSA01::startup(int mode)
PavelSavyhin 0:4cdaf9b1e7d0 40 {
PavelSavyhin 0:4cdaf9b1e7d0 41 _parser.setTimeout(SPWFSA01_MISC_TIMEOUT);
PavelSavyhin 0:4cdaf9b1e7d0 42 /*Test module before reset*/
PavelSavyhin 0:4cdaf9b1e7d0 43 waitSPWFReady();
PavelSavyhin 0:4cdaf9b1e7d0 44 /*Reset module*/
PavelSavyhin 0:4cdaf9b1e7d0 45 reset();
PavelSavyhin 0:4cdaf9b1e7d0 46
PavelSavyhin 0:4cdaf9b1e7d0 47 /*set local echo to 0*/
PavelSavyhin 0:4cdaf9b1e7d0 48 if(!(_parser.send("AT+S.SCFG=localecho1,%d\r", 0) && _parser.recv("OK")))
PavelSavyhin 0:4cdaf9b1e7d0 49 {
PavelSavyhin 0:4cdaf9b1e7d0 50 debug_if(dbg_on, "SPWF> error local echo set\r\n");
PavelSavyhin 0:4cdaf9b1e7d0 51 return false;
PavelSavyhin 0:4cdaf9b1e7d0 52 }
PavelSavyhin 0:4cdaf9b1e7d0 53 /*reset factory settings*/
PavelSavyhin 0:4cdaf9b1e7d0 54 if(!(_parser.send("AT&F") && _parser.recv("OK")))
PavelSavyhin 0:4cdaf9b1e7d0 55 {
PavelSavyhin 0:4cdaf9b1e7d0 56 debug_if(dbg_on, "SPWF> error AT&F\r\n");
PavelSavyhin 0:4cdaf9b1e7d0 57 return false;
PavelSavyhin 0:4cdaf9b1e7d0 58 }
PavelSavyhin 0:4cdaf9b1e7d0 59
PavelSavyhin 0:4cdaf9b1e7d0 60 /*set Wi-Fi mode and rate to b/g*/
PavelSavyhin 0:4cdaf9b1e7d0 61 if(!(_parser.send("AT+S.SCFG=wifi_ht_mode,%d\r", 0) && _parser.recv("OK")))
PavelSavyhin 0:4cdaf9b1e7d0 62 {
PavelSavyhin 0:4cdaf9b1e7d0 63 debug_if(dbg_on, "SPWF> error setting ht_mode\r\n");
PavelSavyhin 0:4cdaf9b1e7d0 64 return false;
PavelSavyhin 0:4cdaf9b1e7d0 65 }
PavelSavyhin 0:4cdaf9b1e7d0 66
PavelSavyhin 0:4cdaf9b1e7d0 67 //if(!(_parser.send("AT+S.SCFG=wifi_opr_rate_mask,0x003FFFCF\r") && _parser.recv("OK")))
PavelSavyhin 0:4cdaf9b1e7d0 68 if(!(_parser.send("AT+S.SCFG=wifi_opr_rate_mask,0x00000001\r") && _parser.recv("OK")))// set most effective speed for such kind of device
PavelSavyhin 0:4cdaf9b1e7d0 69 {
PavelSavyhin 0:4cdaf9b1e7d0 70 debug_if(dbg_on, "SPWF> error setting operational rates\r\n");
PavelSavyhin 0:4cdaf9b1e7d0 71 return false;
PavelSavyhin 0:4cdaf9b1e7d0 72 }
PavelSavyhin 0:4cdaf9b1e7d0 73
PavelSavyhin 0:4cdaf9b1e7d0 74 if(!(_parser.send("AT+S.SCFG=wifi_bas_rate_mask,0x0000000F\r") && _parser.recv("OK")))// set most effective speed for such kind of device
PavelSavyhin 0:4cdaf9b1e7d0 75 {
PavelSavyhin 0:4cdaf9b1e7d0 76 debug_if(dbg_on, "SPWF> error setting basic rates\r\n");
PavelSavyhin 0:4cdaf9b1e7d0 77 return false;
PavelSavyhin 0:4cdaf9b1e7d0 78 }
PavelSavyhin 0:4cdaf9b1e7d0 79
PavelSavyhin 0:4cdaf9b1e7d0 80 if(!(_parser.send("AT+S.SCFG=wifi_powersave,0\r") && _parser.recv("OK")))// set most effective speed for such kind of device
PavelSavyhin 0:4cdaf9b1e7d0 81 {
PavelSavyhin 0:4cdaf9b1e7d0 82 debug_if(dbg_on, "SPWF> error setting power save mode\r\n");
PavelSavyhin 0:4cdaf9b1e7d0 83 return false;
PavelSavyhin 0:4cdaf9b1e7d0 84 }
PavelSavyhin 0:4cdaf9b1e7d0 85
PavelSavyhin 0:4cdaf9b1e7d0 86 if(!(_parser.send("AT+S.SCFG=sleep_enabled,0\r") && _parser.recv("OK")))// set most effective speed for such kind of device
PavelSavyhin 0:4cdaf9b1e7d0 87 {
PavelSavyhin 0:4cdaf9b1e7d0 88 debug_if(dbg_on, "SPWF> error setting sleep mode\r\n");
PavelSavyhin 0:4cdaf9b1e7d0 89 return false;
PavelSavyhin 0:4cdaf9b1e7d0 90 }
PavelSavyhin 0:4cdaf9b1e7d0 91
PavelSavyhin 0:4cdaf9b1e7d0 92 if(!(_parser.send("AT+S.SCFG=wifi_tx_power,18\r") && _parser.recv("OK")))// set most effective speed for such kind of device
PavelSavyhin 0:4cdaf9b1e7d0 93 {
PavelSavyhin 0:4cdaf9b1e7d0 94 debug_if(dbg_on, "SPWF> error setting transmit power\r\n");
PavelSavyhin 0:4cdaf9b1e7d0 95 return false;
PavelSavyhin 0:4cdaf9b1e7d0 96 }
PavelSavyhin 0:4cdaf9b1e7d0 97
PavelSavyhin 0:4cdaf9b1e7d0 98 if(!(_parser.send("AT+S.SCFG=ip_use_dhcp,1\r") && _parser.recv("OK")))// set most effective speed for such kind of device
PavelSavyhin 0:4cdaf9b1e7d0 99 {
PavelSavyhin 0:4cdaf9b1e7d0 100 debug_if(dbg_on, "SPWF> error setting dhcp on\r\n");
PavelSavyhin 0:4cdaf9b1e7d0 101 return false;
PavelSavyhin 0:4cdaf9b1e7d0 102 }
PavelSavyhin 0:4cdaf9b1e7d0 103
PavelSavyhin 0:4cdaf9b1e7d0 104 if(!(_parser.send("AT+S.SCFG=ip_dhcp_timeout,20\r") && _parser.recv("OK")))// set most effective speed for such kind of device
PavelSavyhin 0:4cdaf9b1e7d0 105 {
PavelSavyhin 0:4cdaf9b1e7d0 106 debug_if(dbg_on, "SPWF> error setting dhcp timeout\r\n");
PavelSavyhin 0:4cdaf9b1e7d0 107 return false;
PavelSavyhin 0:4cdaf9b1e7d0 108 }
PavelSavyhin 0:4cdaf9b1e7d0 109
PavelSavyhin 0:4cdaf9b1e7d0 110 /*set idle mode (0->idle, 1->STA,3->miniAP, 2->IBSS)*/
PavelSavyhin 0:4cdaf9b1e7d0 111 if(!(_parser.send("AT+S.SCFG=wifi_mode,%d\r", mode) && _parser.recv("OK")))
PavelSavyhin 0:4cdaf9b1e7d0 112 {
PavelSavyhin 0:4cdaf9b1e7d0 113 debug_if(dbg_on, "SPWF> error wifi mode set\r\n");
PavelSavyhin 0:4cdaf9b1e7d0 114 return false;
PavelSavyhin 0:4cdaf9b1e7d0 115 }
PavelSavyhin 0:4cdaf9b1e7d0 116
PavelSavyhin 0:4cdaf9b1e7d0 117 /* save current setting in flash */
PavelSavyhin 0:4cdaf9b1e7d0 118 if(!(_parser.send("AT&W") && _parser.recv("OK")))
PavelSavyhin 0:4cdaf9b1e7d0 119 {
PavelSavyhin 0:4cdaf9b1e7d0 120 debug_if(dbg_on, "SPWF> error AT&W\r\n");
PavelSavyhin 0:4cdaf9b1e7d0 121 return false;
PavelSavyhin 0:4cdaf9b1e7d0 122 }
PavelSavyhin 0:4cdaf9b1e7d0 123
PavelSavyhin 0:4cdaf9b1e7d0 124 /*reset again and send AT command and check for result (AT->OK)*/
PavelSavyhin 0:4cdaf9b1e7d0 125 reset();
PavelSavyhin 0:4cdaf9b1e7d0 126
PavelSavyhin 0:4cdaf9b1e7d0 127 return true;
PavelSavyhin 0:4cdaf9b1e7d0 128 }
PavelSavyhin 0:4cdaf9b1e7d0 129
PavelSavyhin 0:4cdaf9b1e7d0 130 bool SPWFSA01::hw_reset(void)
PavelSavyhin 0:4cdaf9b1e7d0 131 {
PavelSavyhin 0:4cdaf9b1e7d0 132 if (_reset.is_connected()) {
PavelSavyhin 0:4cdaf9b1e7d0 133 /* reset the pin PC12 */
PavelSavyhin 0:4cdaf9b1e7d0 134 _reset.write(0);
PavelSavyhin 0:4cdaf9b1e7d0 135 wait_ms(200);
PavelSavyhin 0:4cdaf9b1e7d0 136 _reset.write(1);
PavelSavyhin 0:4cdaf9b1e7d0 137 wait_ms(100);
PavelSavyhin 0:4cdaf9b1e7d0 138 return 1;
PavelSavyhin 0:4cdaf9b1e7d0 139 } else { return 0; }
PavelSavyhin 0:4cdaf9b1e7d0 140 }
PavelSavyhin 0:4cdaf9b1e7d0 141
PavelSavyhin 0:4cdaf9b1e7d0 142 bool SPWFSA01::reset(void)
PavelSavyhin 0:4cdaf9b1e7d0 143 {
PavelSavyhin 0:4cdaf9b1e7d0 144 if(!_parser.send("AT+CFUN=1")) return false;
PavelSavyhin 0:4cdaf9b1e7d0 145 while(1) {
PavelSavyhin 0:4cdaf9b1e7d0 146 if (_parser.recv("+WIND:32:WiFi Hardware Started\r")) {
PavelSavyhin 0:4cdaf9b1e7d0 147 return true;
PavelSavyhin 0:4cdaf9b1e7d0 148 }
PavelSavyhin 0:4cdaf9b1e7d0 149 }
PavelSavyhin 0:4cdaf9b1e7d0 150 }
PavelSavyhin 0:4cdaf9b1e7d0 151
PavelSavyhin 0:4cdaf9b1e7d0 152 void SPWFSA01::waitSPWFReady(void)
PavelSavyhin 0:4cdaf9b1e7d0 153 {
PavelSavyhin 0:4cdaf9b1e7d0 154 //wait_ms(200);
PavelSavyhin 0:4cdaf9b1e7d0 155 while(1)
PavelSavyhin 0:4cdaf9b1e7d0 156 if(_parser.send("AT") && _parser.recv("OK"))
PavelSavyhin 0:4cdaf9b1e7d0 157 //till we get OK from AT command
PavelSavyhin 0:4cdaf9b1e7d0 158 //printf("\r\nwaiting for reset to complete..\n");
PavelSavyhin 0:4cdaf9b1e7d0 159 return;
PavelSavyhin 0:4cdaf9b1e7d0 160
PavelSavyhin 0:4cdaf9b1e7d0 161 }
PavelSavyhin 0:4cdaf9b1e7d0 162
PavelSavyhin 0:4cdaf9b1e7d0 163 /* Security Mode
PavelSavyhin 0:4cdaf9b1e7d0 164 None = 0,
PavelSavyhin 0:4cdaf9b1e7d0 165 WEP = 1,
PavelSavyhin 0:4cdaf9b1e7d0 166 WPA_Personal = 2,
PavelSavyhin 0:4cdaf9b1e7d0 167 */
PavelSavyhin 0:4cdaf9b1e7d0 168 bool SPWFSA01::connect(const char *ap, const char *passPhrase, int securityMode)
PavelSavyhin 0:4cdaf9b1e7d0 169 {
PavelSavyhin 0:4cdaf9b1e7d0 170 uint32_t n1, n2, n3, n4;
PavelSavyhin 0:4cdaf9b1e7d0 171
PavelSavyhin 0:4cdaf9b1e7d0 172 _parser.setTimeout(SPWFSA01_CONNECT_TIMEOUT);
PavelSavyhin 0:4cdaf9b1e7d0 173 //AT+S.SCFG=wifi_wpa_psk_text,%s\r
PavelSavyhin 0:4cdaf9b1e7d0 174 if(!(_parser.send("AT+S.SCFG=wifi_wpa_psk_text,%s", passPhrase) && _parser.recv("OK")))
PavelSavyhin 0:4cdaf9b1e7d0 175 {
PavelSavyhin 0:4cdaf9b1e7d0 176 debug_if(dbg_on, "SPWF> error pass set\r\n");
PavelSavyhin 0:4cdaf9b1e7d0 177 return false;
PavelSavyhin 0:4cdaf9b1e7d0 178 }
PavelSavyhin 0:4cdaf9b1e7d0 179 //AT+S.SSIDTXT=%s\r
PavelSavyhin 0:4cdaf9b1e7d0 180 if(!(_parser.send("AT+S.SSIDTXT=%s", ap) && _parser.recv("OK")))
PavelSavyhin 0:4cdaf9b1e7d0 181 {
PavelSavyhin 0:4cdaf9b1e7d0 182 debug_if(dbg_on, "SPWF> error ssid set\r\n");
PavelSavyhin 0:4cdaf9b1e7d0 183 return false;
PavelSavyhin 0:4cdaf9b1e7d0 184 }
PavelSavyhin 0:4cdaf9b1e7d0 185 //AT+S.SCFG=wifi_priv_mode,%d\r
PavelSavyhin 0:4cdaf9b1e7d0 186 if(!(_parser.send("AT+S.SCFG=wifi_priv_mode,%d", securityMode) && _parser.recv("OK")))
PavelSavyhin 0:4cdaf9b1e7d0 187 {
PavelSavyhin 0:4cdaf9b1e7d0 188 debug_if(dbg_on, "SPWF> error security mode set\r\n");
PavelSavyhin 0:4cdaf9b1e7d0 189 return false;
PavelSavyhin 0:4cdaf9b1e7d0 190 }
PavelSavyhin 0:4cdaf9b1e7d0 191 //"AT+S.SCFG=wifi_mode,%d\r"
PavelSavyhin 0:4cdaf9b1e7d0 192 /*set idle mode (0->idle, 1->STA,3->miniAP, 2->IBSS)*/
PavelSavyhin 0:4cdaf9b1e7d0 193 if(!(_parser.send("AT+S.SCFG=wifi_mode,%d\r", 1) && _parser.recv("OK")))
PavelSavyhin 0:4cdaf9b1e7d0 194 {
PavelSavyhin 0:4cdaf9b1e7d0 195 debug_if(dbg_on, "SPWF> error wifi mode set\r\n");
PavelSavyhin 0:4cdaf9b1e7d0 196 return false;
PavelSavyhin 0:4cdaf9b1e7d0 197 }
PavelSavyhin 0:4cdaf9b1e7d0 198 //AT&W
PavelSavyhin 0:4cdaf9b1e7d0 199 /* save current setting in flash */
PavelSavyhin 0:4cdaf9b1e7d0 200 if(!(_parser.send("AT&W") && _parser.recv("OK")))
PavelSavyhin 0:4cdaf9b1e7d0 201 {
PavelSavyhin 0:4cdaf9b1e7d0 202 debug_if(dbg_on, "SPWF> error AT&W\r\n");
PavelSavyhin 0:4cdaf9b1e7d0 203 return false;
PavelSavyhin 0:4cdaf9b1e7d0 204 }
PavelSavyhin 0:4cdaf9b1e7d0 205 //reset module
PavelSavyhin 0:4cdaf9b1e7d0 206 reset();
PavelSavyhin 0:4cdaf9b1e7d0 207
PavelSavyhin 0:4cdaf9b1e7d0 208 while(1)
PavelSavyhin 0:4cdaf9b1e7d0 209 if((_parser.recv("+WIND:24:WiFi Up:%u.%u.%u.%u",&n1, &n2, &n3, &n4)))
PavelSavyhin 0:4cdaf9b1e7d0 210 {
PavelSavyhin 0:4cdaf9b1e7d0 211 break;
PavelSavyhin 0:4cdaf9b1e7d0 212 }
PavelSavyhin 0:4cdaf9b1e7d0 213
PavelSavyhin 0:4cdaf9b1e7d0 214 return true;
PavelSavyhin 0:4cdaf9b1e7d0 215 }
PavelSavyhin 0:4cdaf9b1e7d0 216
PavelSavyhin 0:4cdaf9b1e7d0 217 bool SPWFSA01::disconnect(void)
PavelSavyhin 0:4cdaf9b1e7d0 218 {
PavelSavyhin 0:4cdaf9b1e7d0 219 //"AT+S.SCFG=wifi_mode,%d\r"
PavelSavyhin 0:4cdaf9b1e7d0 220 /*set idle mode (0->idle, 1->STA,3->miniAP, 2->IBSS)*/
PavelSavyhin 0:4cdaf9b1e7d0 221 if(!(_parser.send("AT+S.SCFG=wifi_mode,%d\r", 0) && _parser.recv("OK")))
PavelSavyhin 0:4cdaf9b1e7d0 222 {
PavelSavyhin 0:4cdaf9b1e7d0 223 debug_if(dbg_on, "SPWF> error wifi mode set\r\n");
PavelSavyhin 0:4cdaf9b1e7d0 224 return false;
PavelSavyhin 0:4cdaf9b1e7d0 225 }
PavelSavyhin 0:4cdaf9b1e7d0 226 //AT&W
PavelSavyhin 0:4cdaf9b1e7d0 227 /* save current setting in flash */
PavelSavyhin 0:4cdaf9b1e7d0 228 if(!(_parser.send("AT&W") && _parser.recv("OK")))
PavelSavyhin 0:4cdaf9b1e7d0 229 {
PavelSavyhin 0:4cdaf9b1e7d0 230 debug_if(dbg_on, "SPWF> error AT&W\r\n");
PavelSavyhin 0:4cdaf9b1e7d0 231 return false;
PavelSavyhin 0:4cdaf9b1e7d0 232 }
PavelSavyhin 0:4cdaf9b1e7d0 233 //reset module
PavelSavyhin 0:4cdaf9b1e7d0 234 reset();
PavelSavyhin 0:4cdaf9b1e7d0 235 return true;
PavelSavyhin 0:4cdaf9b1e7d0 236 }
PavelSavyhin 0:4cdaf9b1e7d0 237
PavelSavyhin 0:4cdaf9b1e7d0 238 bool SPWFSA01::dhcp(int mode)
PavelSavyhin 0:4cdaf9b1e7d0 239 {
PavelSavyhin 0:4cdaf9b1e7d0 240 //only 3 valid modes
PavelSavyhin 0:4cdaf9b1e7d0 241 //0->off(ip_addr must be set by user), 1->on(auto set by AP), 2->on&customize(miniAP ip_addr can be set by user)
PavelSavyhin 0:4cdaf9b1e7d0 242 if(mode < 0 || mode > 2) {
PavelSavyhin 0:4cdaf9b1e7d0 243 return false;
PavelSavyhin 0:4cdaf9b1e7d0 244 }
PavelSavyhin 0:4cdaf9b1e7d0 245
PavelSavyhin 0:4cdaf9b1e7d0 246 return _parser.send("AT+S.SCFG=ip_use_dhcp,%d\r", mode)
PavelSavyhin 0:4cdaf9b1e7d0 247 && _parser.recv("OK");
PavelSavyhin 0:4cdaf9b1e7d0 248 }
PavelSavyhin 0:4cdaf9b1e7d0 249
PavelSavyhin 0:4cdaf9b1e7d0 250
PavelSavyhin 0:4cdaf9b1e7d0 251 const char *SPWFSA01::getIPAddress(void)
PavelSavyhin 0:4cdaf9b1e7d0 252 {
PavelSavyhin 0:4cdaf9b1e7d0 253 uint32_t n1, n2, n3, n4;
PavelSavyhin 0:4cdaf9b1e7d0 254
PavelSavyhin 0:4cdaf9b1e7d0 255 if (!(_parser.send("AT+S.STS=ip_ipaddr")
PavelSavyhin 0:4cdaf9b1e7d0 256 && _parser.recv("# ip_ipaddr = %u.%u.%u.%u", &n1, &n2, &n3, &n4)
PavelSavyhin 0:4cdaf9b1e7d0 257 && _parser.recv("OK"))) {
PavelSavyhin 0:4cdaf9b1e7d0 258 debug_if(dbg_on, "SPWF> getIPAddress error\r\n");
PavelSavyhin 0:4cdaf9b1e7d0 259 return 0;
PavelSavyhin 0:4cdaf9b1e7d0 260 }
PavelSavyhin 0:4cdaf9b1e7d0 261
PavelSavyhin 0:4cdaf9b1e7d0 262 sprintf((char*)_ip_buffer,"%u.%u.%u.%u", n1, n2, n3, n4);
PavelSavyhin 0:4cdaf9b1e7d0 263
PavelSavyhin 0:4cdaf9b1e7d0 264 return _ip_buffer;
PavelSavyhin 0:4cdaf9b1e7d0 265 }
PavelSavyhin 0:4cdaf9b1e7d0 266
PavelSavyhin 0:4cdaf9b1e7d0 267 const char *SPWFSA01::getMACAddress(void)
PavelSavyhin 0:4cdaf9b1e7d0 268 {
PavelSavyhin 0:4cdaf9b1e7d0 269 uint32_t n1, n2, n3, n4, n5, n6;
PavelSavyhin 0:4cdaf9b1e7d0 270
PavelSavyhin 0:4cdaf9b1e7d0 271 if (!(_parser.send("AT+S.GCFG=nv_wifi_macaddr")
PavelSavyhin 0:4cdaf9b1e7d0 272 && _parser.recv("# nv_wifi_macaddr = %x:%x:%x:%x:%x:%x", &n1, &n2, &n3, &n4, &n5, &n6)
PavelSavyhin 0:4cdaf9b1e7d0 273 && _parser.recv("OK"))) {
PavelSavyhin 0:4cdaf9b1e7d0 274 debug_if(dbg_on, "SPWF> getMACAddress error\r\n");
PavelSavyhin 0:4cdaf9b1e7d0 275 return 0;
PavelSavyhin 0:4cdaf9b1e7d0 276 }
PavelSavyhin 0:4cdaf9b1e7d0 277
PavelSavyhin 0:4cdaf9b1e7d0 278 sprintf((char*)_mac_buffer,"%02X:%02X:%02X:%02X:%02X:%02X", n1, n2, n3, n4, n5, n6);
PavelSavyhin 0:4cdaf9b1e7d0 279
PavelSavyhin 0:4cdaf9b1e7d0 280 return _mac_buffer;
PavelSavyhin 0:4cdaf9b1e7d0 281 }
PavelSavyhin 0:4cdaf9b1e7d0 282
PavelSavyhin 0:4cdaf9b1e7d0 283 bool SPWFSA01::isConnected(void)
PavelSavyhin 0:4cdaf9b1e7d0 284 {
PavelSavyhin 0:4cdaf9b1e7d0 285 return getIPAddress() != 0;
PavelSavyhin 0:4cdaf9b1e7d0 286 }
PavelSavyhin 0:4cdaf9b1e7d0 287
PavelSavyhin 0:4cdaf9b1e7d0 288 bool SPWFSA01::open(const char *type, int* id, const char* addr, int port)
PavelSavyhin 0:4cdaf9b1e7d0 289 {
PavelSavyhin 0:4cdaf9b1e7d0 290 Timer timer;
PavelSavyhin 0:4cdaf9b1e7d0 291 timer.start();
PavelSavyhin 0:4cdaf9b1e7d0 292 socket_closed = 0;
PavelSavyhin 0:4cdaf9b1e7d0 293
PavelSavyhin 0:4cdaf9b1e7d0 294 if(!_parser.send("AT+S.SOCKON=%s,%d,%s,ind", addr, port, type))
PavelSavyhin 0:4cdaf9b1e7d0 295 {
PavelSavyhin 0:4cdaf9b1e7d0 296 debug_if(dbg_on, "SPWF> error opening socket\r\n");
PavelSavyhin 0:4cdaf9b1e7d0 297 return false;
PavelSavyhin 0:4cdaf9b1e7d0 298 }
PavelSavyhin 0:4cdaf9b1e7d0 299
PavelSavyhin 0:4cdaf9b1e7d0 300 while(1)
PavelSavyhin 0:4cdaf9b1e7d0 301 {
PavelSavyhin 0:4cdaf9b1e7d0 302 if( _parser.recv(" ID: %d", id)
PavelSavyhin 0:4cdaf9b1e7d0 303 && _parser.recv("OK"))
PavelSavyhin 0:4cdaf9b1e7d0 304 break;
PavelSavyhin 0:4cdaf9b1e7d0 305
PavelSavyhin 0:4cdaf9b1e7d0 306 if (timer.read_ms() > SPWFSA01_CONNECT_TIMEOUT) {
PavelSavyhin 0:4cdaf9b1e7d0 307 return false;
PavelSavyhin 0:4cdaf9b1e7d0 308 }
PavelSavyhin 0:4cdaf9b1e7d0 309
PavelSavyhin 0:4cdaf9b1e7d0 310 //TODO:implement time-out functionality in case of no response
PavelSavyhin 0:4cdaf9b1e7d0 311 //if(timeout) return false;
PavelSavyhin 0:4cdaf9b1e7d0 312 //TODO: deal with errors like "ERROR: Failed to resolve name"
PavelSavyhin 0:4cdaf9b1e7d0 313 //TODO: deal with errors like "ERROR: Data mode not available"
PavelSavyhin 0:4cdaf9b1e7d0 314 }
PavelSavyhin 0:4cdaf9b1e7d0 315
PavelSavyhin 0:4cdaf9b1e7d0 316 return true;
PavelSavyhin 0:4cdaf9b1e7d0 317 }
PavelSavyhin 0:4cdaf9b1e7d0 318
PavelSavyhin 0:4cdaf9b1e7d0 319 bool SPWFSA01::send(int id, const void *data, uint32_t amount)
PavelSavyhin 0:4cdaf9b1e7d0 320 {
PavelSavyhin 0:4cdaf9b1e7d0 321 char _buf[18];
PavelSavyhin 0:4cdaf9b1e7d0 322 _parser.setTimeout(SPWFSA01_SEND_TIMEOUT);
PavelSavyhin 0:4cdaf9b1e7d0 323
PavelSavyhin 0:4cdaf9b1e7d0 324 sprintf((char*)_buf,"AT+S.SOCKW=%d,%d\r", id, amount);
PavelSavyhin 0:4cdaf9b1e7d0 325
PavelSavyhin 0:4cdaf9b1e7d0 326 //May take a second try if device is busy
PavelSavyhin 0:4cdaf9b1e7d0 327 for (unsigned i = 0; i < 2; i++) {
PavelSavyhin 0:4cdaf9b1e7d0 328 if (_parser.write((char*)_buf, strlen(_buf)) >=0
PavelSavyhin 0:4cdaf9b1e7d0 329 && _parser.write((char*)data, (int)amount) >= 0
PavelSavyhin 0:4cdaf9b1e7d0 330 && _parser.recv("OK")) {
PavelSavyhin 0:4cdaf9b1e7d0 331 return true;
PavelSavyhin 0:4cdaf9b1e7d0 332 }
PavelSavyhin 0:4cdaf9b1e7d0 333 }
PavelSavyhin 0:4cdaf9b1e7d0 334 return false;
PavelSavyhin 0:4cdaf9b1e7d0 335 }
PavelSavyhin 0:4cdaf9b1e7d0 336
PavelSavyhin 0:4cdaf9b1e7d0 337
PavelSavyhin 0:4cdaf9b1e7d0 338 int32_t SPWFSA01::recv(int id, void *data, uint32_t amount)
PavelSavyhin 0:4cdaf9b1e7d0 339 {
PavelSavyhin 0:4cdaf9b1e7d0 340 uint32_t recv_amount=0;
PavelSavyhin 0:4cdaf9b1e7d0 341 int wind_id;
PavelSavyhin 0:4cdaf9b1e7d0 342
PavelSavyhin 0:4cdaf9b1e7d0 343 if (socket_closed) {
PavelSavyhin 0:4cdaf9b1e7d0 344 socket_closed = 0;
PavelSavyhin 0:4cdaf9b1e7d0 345 return -3;
PavelSavyhin 0:4cdaf9b1e7d0 346 }
PavelSavyhin 0:4cdaf9b1e7d0 347 if(!(_parser.send("AT+S.SOCKQ=%d", id) //send a query (will be required for secure sockets)
PavelSavyhin 0:4cdaf9b1e7d0 348 && _parser.recv(" DATALEN: %u", &recv_amount)
PavelSavyhin 0:4cdaf9b1e7d0 349 && _parser.recv("OK"))) {
PavelSavyhin 0:4cdaf9b1e7d0 350 return -2;
PavelSavyhin 0:4cdaf9b1e7d0 351 }
PavelSavyhin 0:4cdaf9b1e7d0 352 if (recv_amount==0) { return -1; }
PavelSavyhin 0:4cdaf9b1e7d0 353 if(recv_amount > amount)
PavelSavyhin 0:4cdaf9b1e7d0 354 recv_amount = amount;
PavelSavyhin 0:4cdaf9b1e7d0 355
PavelSavyhin 0:4cdaf9b1e7d0 356 int par_timeout = _parser.getTimeout();
PavelSavyhin 0:4cdaf9b1e7d0 357 _parser.setTimeout(0);
PavelSavyhin 0:4cdaf9b1e7d0 358
PavelSavyhin 0:4cdaf9b1e7d0 359 while(_parser.recv("+WIND:%d:", &wind_id)) {
PavelSavyhin 0:4cdaf9b1e7d0 360 // printf("Wind received: %d\n\r", wind_id);
PavelSavyhin 0:4cdaf9b1e7d0 361 if (wind_id == 58) {
PavelSavyhin 0:4cdaf9b1e7d0 362 socket_closed = 1;
PavelSavyhin 0:4cdaf9b1e7d0 363 _parser.flush();
PavelSavyhin 0:4cdaf9b1e7d0 364 }
PavelSavyhin 0:4cdaf9b1e7d0 365 }
PavelSavyhin 0:4cdaf9b1e7d0 366 _parser.setTimeout(par_timeout);
PavelSavyhin 0:4cdaf9b1e7d0 367
PavelSavyhin 0:4cdaf9b1e7d0 368 _parser.flush();
PavelSavyhin 0:4cdaf9b1e7d0 369 if(!(_parser.send("AT+S.SOCKR=%d,%d", id, recv_amount))){
PavelSavyhin 0:4cdaf9b1e7d0 370 return -2;
PavelSavyhin 0:4cdaf9b1e7d0 371 }
PavelSavyhin 0:4cdaf9b1e7d0 372 if(!((_parser.read((char*)data, recv_amount) >0)
PavelSavyhin 0:4cdaf9b1e7d0 373 && _parser.recv("OK"))) {
PavelSavyhin 0:4cdaf9b1e7d0 374 return -2;
PavelSavyhin 0:4cdaf9b1e7d0 375 }
PavelSavyhin 0:4cdaf9b1e7d0 376 return recv_amount;
PavelSavyhin 0:4cdaf9b1e7d0 377 }
PavelSavyhin 0:4cdaf9b1e7d0 378
PavelSavyhin 0:4cdaf9b1e7d0 379 bool SPWFSA01::close(int id)
PavelSavyhin 0:4cdaf9b1e7d0 380 {
PavelSavyhin 0:4cdaf9b1e7d0 381 uint32_t recv_amount=0;
PavelSavyhin 0:4cdaf9b1e7d0 382 void * data = NULL;
PavelSavyhin 0:4cdaf9b1e7d0 383
PavelSavyhin 0:4cdaf9b1e7d0 384 _parser.setTimeout(SPWFSA01_MISC_TIMEOUT);
PavelSavyhin 0:4cdaf9b1e7d0 385 _parser.flush();
PavelSavyhin 0:4cdaf9b1e7d0 386 /* socket flush */
PavelSavyhin 0:4cdaf9b1e7d0 387 if(!(_parser.send("AT+S.SOCKQ=%d", id) //send a query (will be required for secure sockets)
PavelSavyhin 0:4cdaf9b1e7d0 388 && _parser.recv(" DATALEN: %u", &recv_amount)
PavelSavyhin 0:4cdaf9b1e7d0 389 && _parser.recv("OK"))) {
PavelSavyhin 0:4cdaf9b1e7d0 390 return -2;
PavelSavyhin 0:4cdaf9b1e7d0 391 }
PavelSavyhin 0:4cdaf9b1e7d0 392 if (recv_amount>0) {
PavelSavyhin 0:4cdaf9b1e7d0 393 data = malloc (recv_amount+4);
PavelSavyhin 0:4cdaf9b1e7d0 394 if(!(_parser.send("AT+S.SOCKR=%d,%d", id, recv_amount))) {
PavelSavyhin 0:4cdaf9b1e7d0 395 free (data);
PavelSavyhin 0:4cdaf9b1e7d0 396 return -2;
PavelSavyhin 0:4cdaf9b1e7d0 397 }
PavelSavyhin 0:4cdaf9b1e7d0 398 // printf ("--->>>Close flushing recv_amount: %d \n\r",recv_amount);
PavelSavyhin 0:4cdaf9b1e7d0 399 if(!((_parser.read((char*)data, recv_amount) >0)
PavelSavyhin 0:4cdaf9b1e7d0 400 && _parser.recv("OK"))) {
PavelSavyhin 0:4cdaf9b1e7d0 401 free (data);
PavelSavyhin 0:4cdaf9b1e7d0 402 return -2;
PavelSavyhin 0:4cdaf9b1e7d0 403 }
PavelSavyhin 0:4cdaf9b1e7d0 404 free (data);
PavelSavyhin 0:4cdaf9b1e7d0 405 }
PavelSavyhin 0:4cdaf9b1e7d0 406
PavelSavyhin 0:4cdaf9b1e7d0 407 //May take a second try if device is busy or error is returned
PavelSavyhin 0:4cdaf9b1e7d0 408 for (unsigned i = 0; i < 2; i++) {
PavelSavyhin 0:4cdaf9b1e7d0 409 if (_parser.send("AT+S.SOCKC=%d", id)
PavelSavyhin 0:4cdaf9b1e7d0 410 && _parser.recv("OK")) {
PavelSavyhin 0:4cdaf9b1e7d0 411 socket_closed = 1;
PavelSavyhin 0:4cdaf9b1e7d0 412 return true;
PavelSavyhin 0:4cdaf9b1e7d0 413 }
PavelSavyhin 0:4cdaf9b1e7d0 414 else
PavelSavyhin 0:4cdaf9b1e7d0 415 {
PavelSavyhin 0:4cdaf9b1e7d0 416 if(_parser.recv("ERROR: Pending data")) {
PavelSavyhin 0:4cdaf9b1e7d0 417 debug_if(dbg_on, "SPWF> ERROR!!!!\r\n");
PavelSavyhin 0:4cdaf9b1e7d0 418 return false;
PavelSavyhin 0:4cdaf9b1e7d0 419 }
PavelSavyhin 0:4cdaf9b1e7d0 420 }
PavelSavyhin 0:4cdaf9b1e7d0 421 //TODO: Deal with "ERROR: Pending data" (Closing a socket with pending data)
PavelSavyhin 0:4cdaf9b1e7d0 422 }
PavelSavyhin 0:4cdaf9b1e7d0 423 return false;
PavelSavyhin 0:4cdaf9b1e7d0 424 }
PavelSavyhin 0:4cdaf9b1e7d0 425
PavelSavyhin 0:4cdaf9b1e7d0 426
PavelSavyhin 0:4cdaf9b1e7d0 427 bool SPWFSA01::readable()
PavelSavyhin 0:4cdaf9b1e7d0 428 {
PavelSavyhin 0:4cdaf9b1e7d0 429 return _serial.readable();
PavelSavyhin 0:4cdaf9b1e7d0 430 }
PavelSavyhin 0:4cdaf9b1e7d0 431
PavelSavyhin 0:4cdaf9b1e7d0 432 bool SPWFSA01::writeable()
PavelSavyhin 0:4cdaf9b1e7d0 433 {
PavelSavyhin 0:4cdaf9b1e7d0 434 return _serial.writeable();
PavelSavyhin 0:4cdaf9b1e7d0 435 }
PavelSavyhin 0:4cdaf9b1e7d0 436
PavelSavyhin 0:4cdaf9b1e7d0 437 int SPWFSA01::setSocketClientSecurity(uint8_t* tls_mode, uint8_t* root_ca_server, uint8_t* client_cert, uint8_t* client_key, uint8_t* client_domain, uint32_t tls_epoch_time)
PavelSavyhin 0:4cdaf9b1e7d0 438 {
PavelSavyhin 0:4cdaf9b1e7d0 439 int err = 0;
PavelSavyhin 0:4cdaf9b1e7d0 440 unsigned long epoch_time;
PavelSavyhin 0:4cdaf9b1e7d0 441
PavelSavyhin 0:4cdaf9b1e7d0 442 if(!(_parser.send("AT+S.TLSCERT2=clean,all\r", 0) && _parser.recv("OK")))
PavelSavyhin 0:4cdaf9b1e7d0 443 {
PavelSavyhin 0:4cdaf9b1e7d0 444 debug_if(dbg_on, "SPWF> TLSCERT2 cleared\r\n");
PavelSavyhin 0:4cdaf9b1e7d0 445 return -1;
PavelSavyhin 0:4cdaf9b1e7d0 446 }
PavelSavyhin 0:4cdaf9b1e7d0 447
PavelSavyhin 0:4cdaf9b1e7d0 448 if(tls_epoch_time==0)
PavelSavyhin 0:4cdaf9b1e7d0 449 epoch_time = EPOCH_TIME;
PavelSavyhin 0:4cdaf9b1e7d0 450 else
PavelSavyhin 0:4cdaf9b1e7d0 451 epoch_time = tls_epoch_time;
PavelSavyhin 0:4cdaf9b1e7d0 452
PavelSavyhin 0:4cdaf9b1e7d0 453 if(!(_parser.send("AT+S.SETTIME=%lu\r", (unsigned long)epoch_time) && _parser.recv("OK")))
PavelSavyhin 0:4cdaf9b1e7d0 454 {
PavelSavyhin 0:4cdaf9b1e7d0 455 debug_if(dbg_on, "SPWF> time is set to %d\r\n", epoch_time);
PavelSavyhin 0:4cdaf9b1e7d0 456 return -1;
PavelSavyhin 0:4cdaf9b1e7d0 457 }
PavelSavyhin 0:4cdaf9b1e7d0 458
PavelSavyhin 0:4cdaf9b1e7d0 459 /*AT+S.TLSCERT=f_ca,<size><CR><data>*/
PavelSavyhin 0:4cdaf9b1e7d0 460 if(!(_parser.send("AT+S.TLSCERT=f_ca,%d\r%s\r", strlen((const char *)root_ca_server) - 1, root_ca_server) && _parser.recv("OK")))
PavelSavyhin 0:4cdaf9b1e7d0 461 {
PavelSavyhin 0:4cdaf9b1e7d0 462 debug_if(dbg_on, "SPWF> error TLSCERT=f_ca set\r\n");
PavelSavyhin 0:4cdaf9b1e7d0 463 return -1;
PavelSavyhin 0:4cdaf9b1e7d0 464 }
PavelSavyhin 0:4cdaf9b1e7d0 465
PavelSavyhin 0:4cdaf9b1e7d0 466 /*AT+S.TLSCERT=f_cert,<size><CR><data>*/
PavelSavyhin 0:4cdaf9b1e7d0 467 if(tls_mode[0]=='m')
PavelSavyhin 0:4cdaf9b1e7d0 468 {
PavelSavyhin 0:4cdaf9b1e7d0 469 if(!(_parser.send("AT+S.TLSCERT=f_cert,%d\r%s", strlen((const char *)client_cert) - 1, client_cert) && _parser.recv("OK")))
PavelSavyhin 0:4cdaf9b1e7d0 470 {
PavelSavyhin 0:4cdaf9b1e7d0 471 debug_if(dbg_on, "SPWF> error TLSCERT=f_cert set\r\n");
PavelSavyhin 0:4cdaf9b1e7d0 472 return -1;
PavelSavyhin 0:4cdaf9b1e7d0 473 }
PavelSavyhin 0:4cdaf9b1e7d0 474
PavelSavyhin 0:4cdaf9b1e7d0 475 /*AT+S.TLSCERT=f_key,<size><CR><data>*/
PavelSavyhin 0:4cdaf9b1e7d0 476 if(!(_parser.send("AT+S.TLSCERT=f_key,%d\r%s", strlen((const char *)client_key) - 1, client_key) && _parser.recv("OK")))
PavelSavyhin 0:4cdaf9b1e7d0 477 {
PavelSavyhin 0:4cdaf9b1e7d0 478 debug_if(dbg_on, "SPWF> error TLSCERT=f_key set\r\n");
PavelSavyhin 0:4cdaf9b1e7d0 479 return -1;
PavelSavyhin 0:4cdaf9b1e7d0 480 }
PavelSavyhin 0:4cdaf9b1e7d0 481 }
PavelSavyhin 0:4cdaf9b1e7d0 482
PavelSavyhin 0:4cdaf9b1e7d0 483 /*AT+S.TLSDOMAIN=f_domain,<server domain>*/
PavelSavyhin 0:4cdaf9b1e7d0 484 if(!(_parser.send("AT+S.TLSDOMAIN=f_domain,%s\r", client_domain) && _parser.recv("OK")))
PavelSavyhin 0:4cdaf9b1e7d0 485 {
PavelSavyhin 0:4cdaf9b1e7d0 486 debug_if(dbg_on, "SPWF> error TLSDOMAIN=f_domain set\r\n");
PavelSavyhin 0:4cdaf9b1e7d0 487 return -1;
PavelSavyhin 0:4cdaf9b1e7d0 488 }
PavelSavyhin 0:4cdaf9b1e7d0 489
PavelSavyhin 0:4cdaf9b1e7d0 490 return err;
PavelSavyhin 0:4cdaf9b1e7d0 491 }
PavelSavyhin 0:4cdaf9b1e7d0 492