GSMA version

Dependencies:   FXOS8700CQ mbed sfh7779

Fork of StarterKit by Rick McConney

Committer:
elmkom
Date:
Fri Oct 07 17:01:22 2016 +0000
Revision:
42:8500f0cb2ea5
Child:
43:3979ea0a2df3
code

Who changed what in which revision?

UserRevisionLine numberNew contents of line
elmkom 42:8500f0cb2ea5 1 #include "Wnc.h"
elmkom 42:8500f0cb2ea5 2 #include "mbed.h"
elmkom 42:8500f0cb2ea5 3 #include <cctype>
elmkom 42:8500f0cb2ea5 4 #include <string>
elmkom 42:8500f0cb2ea5 5 #include "config_me.h"
elmkom 42:8500f0cb2ea5 6 #include "SerialBuffered.h"
elmkom 42:8500f0cb2ea5 7
elmkom 42:8500f0cb2ea5 8
elmkom 42:8500f0cb2ea5 9 extern Serial pc;
elmkom 42:8500f0cb2ea5 10
elmkom 42:8500f0cb2ea5 11 DigitalOut mdm_uart2_rx_boot_mode_sel(PTC17); // on powerup, 0 = boot mode, 1 = normal boot
elmkom 42:8500f0cb2ea5 12 DigitalOut mdm_power_on(PTB9); // 0 = turn modem on, 1 = turn modem off (should be held high for >5 seconds to cycle modem)
elmkom 42:8500f0cb2ea5 13 DigitalInOut mdm_wakeup_in(PTC2); // 0 = let modem sleep, 1 = keep modem awake -- Note: pulled high on shield
elmkom 42:8500f0cb2ea5 14
elmkom 42:8500f0cb2ea5 15 DigitalOut mdm_reset(PTC12); // active high
elmkom 42:8500f0cb2ea5 16
elmkom 42:8500f0cb2ea5 17 DigitalOut shield_3v3_1v8_sig_trans_ena(PTC4); // 0 = disabled (all signals high impedence, 1 = translation active
elmkom 42:8500f0cb2ea5 18 DigitalOut mdm_uart1_cts(PTD0);
elmkom 42:8500f0cb2ea5 19
elmkom 42:8500f0cb2ea5 20 SerialBuffered mdm(PTD3, PTD2, 512);
elmkom 42:8500f0cb2ea5 21
elmkom 42:8500f0cb2ea5 22 bool powerSave = false;
elmkom 42:8500f0cb2ea5 23
elmkom 42:8500f0cb2ea5 24 Wnc::Wnc(void)
elmkom 42:8500f0cb2ea5 25 {
elmkom 42:8500f0cb2ea5 26 }
elmkom 42:8500f0cb2ea5 27
elmkom 42:8500f0cb2ea5 28 void Wnc::checkPassthrough()
elmkom 42:8500f0cb2ea5 29 {
elmkom 42:8500f0cb2ea5 30 if(pc.readable())
elmkom 42:8500f0cb2ea5 31 {
elmkom 42:8500f0cb2ea5 32 if(pc.getc() == '~')
elmkom 42:8500f0cb2ea5 33 passthrough();
elmkom 42:8500f0cb2ea5 34 }
elmkom 42:8500f0cb2ea5 35 }
elmkom 42:8500f0cb2ea5 36
elmkom 42:8500f0cb2ea5 37
elmkom 42:8500f0cb2ea5 38 void Wnc::passthrough()
elmkom 42:8500f0cb2ea5 39 {
elmkom 42:8500f0cb2ea5 40 pc.printf(">>\r\n");
elmkom 42:8500f0cb2ea5 41 while(1)
elmkom 42:8500f0cb2ea5 42 {
elmkom 42:8500f0cb2ea5 43 char c;
elmkom 42:8500f0cb2ea5 44 if(pc.readable())
elmkom 42:8500f0cb2ea5 45 {
elmkom 42:8500f0cb2ea5 46 c = pc.getc();
elmkom 42:8500f0cb2ea5 47 pc.putc(c);
elmkom 42:8500f0cb2ea5 48 if(c == '~')
elmkom 42:8500f0cb2ea5 49 {
elmkom 42:8500f0cb2ea5 50 pc.printf("exit\r\n");
elmkom 42:8500f0cb2ea5 51 break;
elmkom 42:8500f0cb2ea5 52 }
elmkom 42:8500f0cb2ea5 53 else if(c == '<')
elmkom 42:8500f0cb2ea5 54 {
elmkom 42:8500f0cb2ea5 55
elmkom 42:8500f0cb2ea5 56 mdm_wakeup_in = 0;
elmkom 42:8500f0cb2ea5 57 pc.printf("sleep\r\n");
elmkom 42:8500f0cb2ea5 58 }
elmkom 42:8500f0cb2ea5 59 else if(c == '>')
elmkom 42:8500f0cb2ea5 60 {
elmkom 42:8500f0cb2ea5 61 mdm_wakeup_in = 1;
elmkom 42:8500f0cb2ea5 62 pc.printf("wake\r\n");
elmkom 42:8500f0cb2ea5 63 }
elmkom 42:8500f0cb2ea5 64 else if(c == '^')
elmkom 42:8500f0cb2ea5 65 {
elmkom 42:8500f0cb2ea5 66 pc.printf("reboot\r\n");
elmkom 42:8500f0cb2ea5 67 NVIC_SystemReset();
elmkom 42:8500f0cb2ea5 68 }
elmkom 42:8500f0cb2ea5 69 else
elmkom 42:8500f0cb2ea5 70 {
elmkom 42:8500f0cb2ea5 71
elmkom 42:8500f0cb2ea5 72 mdm.putc(c);
elmkom 42:8500f0cb2ea5 73 }
elmkom 42:8500f0cb2ea5 74 }
elmkom 42:8500f0cb2ea5 75 if(mdm.readable())
elmkom 42:8500f0cb2ea5 76 pc.putc(mdm.getc());
elmkom 42:8500f0cb2ea5 77 }
elmkom 42:8500f0cb2ea5 78 }
elmkom 42:8500f0cb2ea5 79
elmkom 42:8500f0cb2ea5 80 bool Wnc::isPowerSaveOn()
elmkom 42:8500f0cb2ea5 81 {
elmkom 42:8500f0cb2ea5 82 return powerSave;
elmkom 42:8500f0cb2ea5 83 }
elmkom 42:8500f0cb2ea5 84
elmkom 42:8500f0cb2ea5 85 void Wnc::resumePowerSave()
elmkom 42:8500f0cb2ea5 86 {
elmkom 42:8500f0cb2ea5 87 mdm_wakeup_in = 0;
elmkom 42:8500f0cb2ea5 88 }
elmkom 42:8500f0cb2ea5 89
elmkom 42:8500f0cb2ea5 90 char* Wnc::read(int timeout_ms)
elmkom 42:8500f0cb2ea5 91 {
elmkom 42:8500f0cb2ea5 92 static char response[3200];
elmkom 42:8500f0cb2ea5 93 int len = 0;
elmkom 42:8500f0cb2ea5 94
elmkom 42:8500f0cb2ea5 95 if(timeout_ms > 0) // read until timeout or OK
elmkom 42:8500f0cb2ea5 96 {
elmkom 42:8500f0cb2ea5 97 Timer timer;
elmkom 42:8500f0cb2ea5 98 timer.start();
elmkom 42:8500f0cb2ea5 99 while ((len < (3200-1)) && (timer.read_ms() < timeout_ms)) {
elmkom 42:8500f0cb2ea5 100 if (mdm.readable()) {
elmkom 42:8500f0cb2ea5 101 response[len++] = mdm.getc();
elmkom 42:8500f0cb2ea5 102 if(len>1 && response[len-2] == 'O' && response[len-1] == 'K')
elmkom 42:8500f0cb2ea5 103 break;
elmkom 42:8500f0cb2ea5 104 }
elmkom 42:8500f0cb2ea5 105 }
elmkom 42:8500f0cb2ea5 106 }
elmkom 42:8500f0cb2ea5 107
elmkom 42:8500f0cb2ea5 108 response[len] = (char)NULL;
elmkom 42:8500f0cb2ea5 109 pc.printf("{%s}\r\n",response);
elmkom 42:8500f0cb2ea5 110 return response;
elmkom 42:8500f0cb2ea5 111 }
elmkom 42:8500f0cb2ea5 112
elmkom 42:8500f0cb2ea5 113 char* Wnc::send(const char *cmd, int timeout_ms)
elmkom 42:8500f0cb2ea5 114 {
elmkom 42:8500f0cb2ea5 115 char* reply;
elmkom 42:8500f0cb2ea5 116
elmkom 42:8500f0cb2ea5 117 int tries = 4;
elmkom 42:8500f0cb2ea5 118 while(tries > 0)
elmkom 42:8500f0cb2ea5 119 {
elmkom 42:8500f0cb2ea5 120 tries--;
elmkom 42:8500f0cb2ea5 121 pc.printf("\r\n<%s>",cmd);
elmkom 42:8500f0cb2ea5 122 const char *pt = cmd;
elmkom 42:8500f0cb2ea5 123 size_t n = strlen(cmd);
elmkom 42:8500f0cb2ea5 124 while (n--) {
elmkom 42:8500f0cb2ea5 125 mdm.putc(*pt++);
elmkom 42:8500f0cb2ea5 126 };
elmkom 42:8500f0cb2ea5 127 mdm.putc('\r');
elmkom 42:8500f0cb2ea5 128 mdm.putc('\n');
elmkom 42:8500f0cb2ea5 129 reply = read(timeout_ms);
elmkom 42:8500f0cb2ea5 130 if(strlen(reply) > 0 && strstr(reply,"OK") !=0)
elmkom 42:8500f0cb2ea5 131 break;
elmkom 42:8500f0cb2ea5 132 checkPassthrough();
elmkom 42:8500f0cb2ea5 133 }
elmkom 42:8500f0cb2ea5 134 return reply;
elmkom 42:8500f0cb2ea5 135 }
elmkom 42:8500f0cb2ea5 136
elmkom 42:8500f0cb2ea5 137 bool Wnc::isModemResponding()
elmkom 42:8500f0cb2ea5 138 {
elmkom 42:8500f0cb2ea5 139 char *reply = send("AT",WNC_WAIT_TIME_MS);
elmkom 42:8500f0cb2ea5 140 if(strlen(reply) > 0 && strstr(reply,"OK") !=0)
elmkom 42:8500f0cb2ea5 141 return true;
elmkom 42:8500f0cb2ea5 142 return false;
elmkom 42:8500f0cb2ea5 143 }
elmkom 42:8500f0cb2ea5 144
elmkom 42:8500f0cb2ea5 145 void Wnc::setIn()
elmkom 42:8500f0cb2ea5 146 {
elmkom 42:8500f0cb2ea5 147 mdm_wakeup_in.input();
elmkom 42:8500f0cb2ea5 148 }
elmkom 42:8500f0cb2ea5 149
elmkom 42:8500f0cb2ea5 150 void Wnc::toggleWake()
elmkom 42:8500f0cb2ea5 151 {
elmkom 42:8500f0cb2ea5 152 mdm_wakeup_in = 0;
elmkom 42:8500f0cb2ea5 153 wait_ms(2000);
elmkom 42:8500f0cb2ea5 154 mdm_wakeup_in = 0;
elmkom 42:8500f0cb2ea5 155 }
elmkom 42:8500f0cb2ea5 156
elmkom 42:8500f0cb2ea5 157 int Wnc::init(void) {
elmkom 42:8500f0cb2ea5 158 mdm_wakeup_in.output();
elmkom 42:8500f0cb2ea5 159 // disable signal level translator (necessary
elmkom 42:8500f0cb2ea5 160 // for the modem to boot properly)
elmkom 42:8500f0cb2ea5 161 shield_3v3_1v8_sig_trans_ena = 0;
elmkom 42:8500f0cb2ea5 162
elmkom 42:8500f0cb2ea5 163 // Hard reset the modem (doesn't go through
elmkom 42:8500f0cb2ea5 164 // the signal level translator)
elmkom 42:8500f0cb2ea5 165 mdm_reset = 1;
elmkom 42:8500f0cb2ea5 166
elmkom 42:8500f0cb2ea5 167 // wait a moment for the modem to react
elmkom 42:8500f0cb2ea5 168 wait_ms(10);
elmkom 42:8500f0cb2ea5 169
elmkom 42:8500f0cb2ea5 170 // Let modem boot
elmkom 42:8500f0cb2ea5 171 mdm_reset = 0;
elmkom 42:8500f0cb2ea5 172
elmkom 42:8500f0cb2ea5 173 // wait a moment for the modem to react
elmkom 42:8500f0cb2ea5 174 wait(1.0);
elmkom 42:8500f0cb2ea5 175
elmkom 42:8500f0cb2ea5 176 // power modem on //off
elmkom 42:8500f0cb2ea5 177 mdm_power_on = 0; //1;
elmkom 42:8500f0cb2ea5 178
elmkom 42:8500f0cb2ea5 179 // insure modem boots into normal operating mode
elmkom 42:8500f0cb2ea5 180 // and does not go to sleep when powered on
elmkom 42:8500f0cb2ea5 181 mdm_uart2_rx_boot_mode_sel = 1;
elmkom 42:8500f0cb2ea5 182 mdm_wakeup_in = 1;
elmkom 42:8500f0cb2ea5 183
elmkom 42:8500f0cb2ea5 184 // initialze comm with the modem
elmkom 42:8500f0cb2ea5 185 mdm.baud(115200);
elmkom 42:8500f0cb2ea5 186 // clear out potential garbage
elmkom 42:8500f0cb2ea5 187 while (mdm.readable())
elmkom 42:8500f0cb2ea5 188 mdm.getc();
elmkom 42:8500f0cb2ea5 189
elmkom 42:8500f0cb2ea5 190 mdm_uart1_cts = 0;
elmkom 42:8500f0cb2ea5 191
elmkom 42:8500f0cb2ea5 192 // wait a moment for the modem to react to signal
elmkom 42:8500f0cb2ea5 193 // conditions while the level translator is disabled
elmkom 42:8500f0cb2ea5 194 // (sorry, don't have enough information to know
elmkom 42:8500f0cb2ea5 195 // what exactly the modem is doing with the current
elmkom 42:8500f0cb2ea5 196 // pin settings)
elmkom 42:8500f0cb2ea5 197 wait(1.0);
elmkom 42:8500f0cb2ea5 198
elmkom 42:8500f0cb2ea5 199 // enable the signal level translator to start
elmkom 42:8500f0cb2ea5 200 // modem reset process (modem will be powered down)
elmkom 42:8500f0cb2ea5 201 shield_3v3_1v8_sig_trans_ena = 1;
elmkom 42:8500f0cb2ea5 202
elmkom 42:8500f0cb2ea5 203 // Give the modem 60 secons to start responding by
elmkom 42:8500f0cb2ea5 204 // sending simple 'AT' commands to modem once per second.
elmkom 42:8500f0cb2ea5 205 Timer timer;
elmkom 42:8500f0cb2ea5 206 timer.start();
elmkom 42:8500f0cb2ea5 207 while (timer.read() < 60) {
elmkom 42:8500f0cb2ea5 208 SetLedColor(0x1); //red
elmkom 42:8500f0cb2ea5 209 if(isModemResponding())
elmkom 42:8500f0cb2ea5 210 {
elmkom 42:8500f0cb2ea5 211 SetLedColor(0);
elmkom 42:8500f0cb2ea5 212 return true;
elmkom 42:8500f0cb2ea5 213 }
elmkom 42:8500f0cb2ea5 214 SetLedColor(0); //off
elmkom 42:8500f0cb2ea5 215 wait_ms(1000 - (timer.read_ms() % 1000));
elmkom 42:8500f0cb2ea5 216 pc.printf("\r%d",timer.read_ms()/1000);
elmkom 42:8500f0cb2ea5 217
elmkom 42:8500f0cb2ea5 218 }
elmkom 42:8500f0cb2ea5 219 return false;
elmkom 42:8500f0cb2ea5 220 }
elmkom 42:8500f0cb2ea5 221 int Wnc::secToTau(int time)
elmkom 42:8500f0cb2ea5 222 {
elmkom 42:8500f0cb2ea5 223 /*
elmkom 42:8500f0cb2ea5 224 0 - value is incremented in multiples of 10 minutes
elmkom 42:8500f0cb2ea5 225 1 - value is incremented in multiples of 1 hour
elmkom 42:8500f0cb2ea5 226 2 - value is incremented in multiples of 10 hours
elmkom 42:8500f0cb2ea5 227 3 - value is incremented in multiples of 2 seconds
elmkom 42:8500f0cb2ea5 228 4 - value is incremented in multiples of 30 seconds
elmkom 42:8500f0cb2ea5 229 5 - value is incremented in multiples of 1 minute
elmkom 42:8500f0cb2ea5 230 */
elmkom 42:8500f0cb2ea5 231 if(time/2 < 32)
elmkom 42:8500f0cb2ea5 232 {
elmkom 42:8500f0cb2ea5 233 return (0x3<<5)+time/2;
elmkom 42:8500f0cb2ea5 234 }
elmkom 42:8500f0cb2ea5 235 else if(time/30 < 32)
elmkom 42:8500f0cb2ea5 236 {
elmkom 42:8500f0cb2ea5 237 return (0x4<<5)+time/30;
elmkom 42:8500f0cb2ea5 238 }
elmkom 42:8500f0cb2ea5 239 else if(time/60 < 32)
elmkom 42:8500f0cb2ea5 240 {
elmkom 42:8500f0cb2ea5 241 return (0x5<<5)+time/60;
elmkom 42:8500f0cb2ea5 242 }
elmkom 42:8500f0cb2ea5 243 else if(time/3600 < 32)
elmkom 42:8500f0cb2ea5 244 {
elmkom 42:8500f0cb2ea5 245 return (0x1<<5)+time/3600;
elmkom 42:8500f0cb2ea5 246 }
elmkom 42:8500f0cb2ea5 247 else if(time/36000 < 32)
elmkom 42:8500f0cb2ea5 248 {
elmkom 42:8500f0cb2ea5 249 return (0x2<<5)+time/36000;
elmkom 42:8500f0cb2ea5 250 }
elmkom 42:8500f0cb2ea5 251 else
elmkom 42:8500f0cb2ea5 252 return (0x7<<5);
elmkom 42:8500f0cb2ea5 253
elmkom 42:8500f0cb2ea5 254
elmkom 42:8500f0cb2ea5 255 }
elmkom 42:8500f0cb2ea5 256 int Wnc::secToActivity(int time)
elmkom 42:8500f0cb2ea5 257 {
elmkom 42:8500f0cb2ea5 258 /*
elmkom 42:8500f0cb2ea5 259 0 - value is incremented in multiples of 2 seconds
elmkom 42:8500f0cb2ea5 260 1 - value is incremented in multiples of 1 minute
elmkom 42:8500f0cb2ea5 261 2 - value is incremented in multiples of decihours
elmkom 42:8500f0cb2ea5 262 7 - value indicates that the timer is deactivated.
elmkom 42:8500f0cb2ea5 263 */
elmkom 42:8500f0cb2ea5 264 if(time/2 < 32)
elmkom 42:8500f0cb2ea5 265 {
elmkom 42:8500f0cb2ea5 266 return (0x0<<5)+time/2;
elmkom 42:8500f0cb2ea5 267 }
elmkom 42:8500f0cb2ea5 268 else if(time/60 < 32)
elmkom 42:8500f0cb2ea5 269 {
elmkom 42:8500f0cb2ea5 270 return (0x1<<5)+time/60;
elmkom 42:8500f0cb2ea5 271 }
elmkom 42:8500f0cb2ea5 272 else if(time/36000 < 32)
elmkom 42:8500f0cb2ea5 273 {
elmkom 42:8500f0cb2ea5 274 return (0x2<<5)+time/36000;
elmkom 42:8500f0cb2ea5 275 }
elmkom 42:8500f0cb2ea5 276 else
elmkom 42:8500f0cb2ea5 277 return (0x7<<5);
elmkom 42:8500f0cb2ea5 278
elmkom 42:8500f0cb2ea5 279 }
elmkom 42:8500f0cb2ea5 280 void Wnc::setPowerSave(bool on,int t3412,int t3324)
elmkom 42:8500f0cb2ea5 281 {
elmkom 42:8500f0cb2ea5 282 if(on)
elmkom 42:8500f0cb2ea5 283 {
elmkom 42:8500f0cb2ea5 284 int tau = secToTau(t3412);
elmkom 42:8500f0cb2ea5 285 int activity = secToActivity(t3324);
elmkom 42:8500f0cb2ea5 286 mdm_wakeup_in = 0; //allow power sleep mode
elmkom 42:8500f0cb2ea5 287 powerSave = true;
elmkom 42:8500f0cb2ea5 288 char cmd[32];
elmkom 42:8500f0cb2ea5 289 sprintf(cmd,"AT+CPSMS=1,,,%d,%d",tau,activity);
elmkom 42:8500f0cb2ea5 290 send(cmd, WNC_WAIT_TIME_MS);
elmkom 42:8500f0cb2ea5 291 }
elmkom 42:8500f0cb2ea5 292 else
elmkom 42:8500f0cb2ea5 293 {
elmkom 42:8500f0cb2ea5 294 mdm_wakeup_in = 1; //disallow power sleep mode
elmkom 42:8500f0cb2ea5 295 powerSave = false;
elmkom 42:8500f0cb2ea5 296 send("AT+CPSMS=0", WNC_WAIT_TIME_MS);
elmkom 42:8500f0cb2ea5 297 }
elmkom 42:8500f0cb2ea5 298 }
elmkom 42:8500f0cb2ea5 299
elmkom 42:8500f0cb2ea5 300 char* Wnc::getIccid()
elmkom 42:8500f0cb2ea5 301 {
elmkom 42:8500f0cb2ea5 302 static char iccidBuf[32];
elmkom 42:8500f0cb2ea5 303 iccidBuf[0] = NULL;
elmkom 42:8500f0cb2ea5 304 char* reply = send("AT%CCID",500);
elmkom 42:8500f0cb2ea5 305 int index = 0;
elmkom 42:8500f0cb2ea5 306 int begin = -1;
elmkom 42:8500f0cb2ea5 307 int i = 0;
elmkom 42:8500f0cb2ea5 308
elmkom 42:8500f0cb2ea5 309 while (reply[index]) { // While there are more characters to process...
elmkom 42:8500f0cb2ea5 310 if (begin == -1 && isdigit(reply[index])) { // Upon finding a digit, ...
elmkom 42:8500f0cb2ea5 311 begin = index;
elmkom 42:8500f0cb2ea5 312 }
elmkom 42:8500f0cb2ea5 313 if(begin != -1)
elmkom 42:8500f0cb2ea5 314 {
elmkom 42:8500f0cb2ea5 315 if(isdigit(reply[index]))
elmkom 42:8500f0cb2ea5 316 {
elmkom 42:8500f0cb2ea5 317 iccidBuf[i++] = reply[index];
elmkom 42:8500f0cb2ea5 318 }
elmkom 42:8500f0cb2ea5 319 else
elmkom 42:8500f0cb2ea5 320 {
elmkom 42:8500f0cb2ea5 321 iccidBuf[i++] = NULL;
elmkom 42:8500f0cb2ea5 322 return iccidBuf;
elmkom 42:8500f0cb2ea5 323 }
elmkom 42:8500f0cb2ea5 324 }
elmkom 42:8500f0cb2ea5 325 index++;
elmkom 42:8500f0cb2ea5 326 }
elmkom 42:8500f0cb2ea5 327 return iccidBuf;
elmkom 42:8500f0cb2ea5 328 }
elmkom 42:8500f0cb2ea5 329
elmkom 42:8500f0cb2ea5 330 void Wnc::wakeFromPowerSave()
elmkom 42:8500f0cb2ea5 331 {
elmkom 42:8500f0cb2ea5 332 char *reply;
elmkom 42:8500f0cb2ea5 333 mdm_wakeup_in = 1;
elmkom 42:8500f0cb2ea5 334 reply = send("AT+CFUN=1", WNC_WAIT_TIME_MS);
elmkom 42:8500f0cb2ea5 335 reply = send("AT%CMATT=1", WNC_WAIT_TIME_MS);
elmkom 42:8500f0cb2ea5 336 wait(2); // wait to attach
elmkom 42:8500f0cb2ea5 337 reply = send("AT+CREG?", WNC_WAIT_TIME_MS);
elmkom 42:8500f0cb2ea5 338 reply = send("AT@INTERNET=1", WNC_WAIT_TIME_MS); // Internet services enabled
elmkom 42:8500f0cb2ea5 339 reply = send("AT@SOCKDIAL=1", WNC_WAIT_TIME_MS);
elmkom 42:8500f0cb2ea5 340
elmkom 42:8500f0cb2ea5 341
elmkom 42:8500f0cb2ea5 342 }
elmkom 42:8500f0cb2ea5 343
elmkom 42:8500f0cb2ea5 344 void Wnc::startInternet()
elmkom 42:8500f0cb2ea5 345 {
elmkom 42:8500f0cb2ea5 346 char *reply;
elmkom 42:8500f0cb2ea5 347 reply = send("ATE1",WNC_WAIT_TIME_MS); // Echo ON
elmkom 42:8500f0cb2ea5 348 char apn [32];
elmkom 42:8500f0cb2ea5 349 sprintf(apn,"AT%%PDNSET=1,%s,IP",MY_APN_STR);
elmkom 42:8500f0cb2ea5 350
elmkom 42:8500f0cb2ea5 351 reply = send(apn, 2*WNC_WAIT_TIME_MS); // Set APN, cmd seems to take a little longer sometimes
elmkom 42:8500f0cb2ea5 352 reply = send("AT+CREG?", WNC_WAIT_TIME_MS);
elmkom 42:8500f0cb2ea5 353 reply = send("AT@INTERNET=1", WNC_WAIT_TIME_MS); // Internet services enabled
elmkom 42:8500f0cb2ea5 354 reply = send("AT@SOCKDIAL=1", WNC_WAIT_TIME_MS);
elmkom 42:8500f0cb2ea5 355 }
elmkom 42:8500f0cb2ea5 356
elmkom 42:8500f0cb2ea5 357 char* Wnc::ping(char* ip)
elmkom 42:8500f0cb2ea5 358 {
elmkom 42:8500f0cb2ea5 359 char cmd[32];
elmkom 42:8500f0cb2ea5 360 sprintf(cmd,"AT@PINGREQ=\"%s\"",ip);
elmkom 42:8500f0cb2ea5 361 return send(cmd,WNC_WAIT_TIME_MS);
elmkom 42:8500f0cb2ea5 362 }
elmkom 42:8500f0cb2ea5 363 // AT@SOCKCONN=1,"108.244.165.22",5005"
elmkom 42:8500f0cb2ea5 364 bool Wnc::connect(char* ip, int port)
elmkom 42:8500f0cb2ea5 365 {
elmkom 42:8500f0cb2ea5 366 char *reply;
elmkom 42:8500f0cb2ea5 367
elmkom 42:8500f0cb2ea5 368 reply = send("AT@SOCKCREAT=1", WNC_WAIT_TIME_MS);
elmkom 42:8500f0cb2ea5 369 if(strlen(reply) == 0 || strstr(reply,"OK") ==0)
elmkom 42:8500f0cb2ea5 370 return false;
elmkom 42:8500f0cb2ea5 371 char cmd[32];
elmkom 42:8500f0cb2ea5 372 sprintf(cmd,"AT@SOCKCONN=1,\"%s\",%d",ip,port);
elmkom 42:8500f0cb2ea5 373 reply = send(cmd,WNC_WAIT_TIME_MS);
elmkom 42:8500f0cb2ea5 374 if(strlen(reply) == 0 || strstr(reply,"OK") ==0)
elmkom 42:8500f0cb2ea5 375 return false;
elmkom 42:8500f0cb2ea5 376 return true;
elmkom 42:8500f0cb2ea5 377 }
elmkom 42:8500f0cb2ea5 378
elmkom 42:8500f0cb2ea5 379 void Wnc::disconnect()
elmkom 42:8500f0cb2ea5 380 {
elmkom 42:8500f0cb2ea5 381 send("AT@SOCKCLOSE=1", WNC_WAIT_TIME_MS);
elmkom 42:8500f0cb2ea5 382 }
elmkom 42:8500f0cb2ea5 383
elmkom 42:8500f0cb2ea5 384 char* Wnc::encode(int value, char* result, int base)
elmkom 42:8500f0cb2ea5 385 {
elmkom 42:8500f0cb2ea5 386 // check that the base if valid
elmkom 42:8500f0cb2ea5 387 if ( base < 2 || base > 36 ) {
elmkom 42:8500f0cb2ea5 388 *result = '\0';
elmkom 42:8500f0cb2ea5 389 return result;
elmkom 42:8500f0cb2ea5 390 }
elmkom 42:8500f0cb2ea5 391
elmkom 42:8500f0cb2ea5 392 char* ptr = result, *ptr1 = result, tmp_char;
elmkom 42:8500f0cb2ea5 393 int tmp_value;
elmkom 42:8500f0cb2ea5 394
elmkom 42:8500f0cb2ea5 395 do {
elmkom 42:8500f0cb2ea5 396 tmp_value = value;
elmkom 42:8500f0cb2ea5 397 value /= base;
elmkom 42:8500f0cb2ea5 398 *ptr++ = "zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz"[35 + (tmp_value - value * base)];
elmkom 42:8500f0cb2ea5 399 } while ( value );
elmkom 42:8500f0cb2ea5 400
elmkom 42:8500f0cb2ea5 401 // Apply negative sign
elmkom 42:8500f0cb2ea5 402 if ( tmp_value < 0 )
elmkom 42:8500f0cb2ea5 403 *ptr++ = '-';
elmkom 42:8500f0cb2ea5 404 *ptr-- = '\0';
elmkom 42:8500f0cb2ea5 405
elmkom 42:8500f0cb2ea5 406 while ( ptr1 < ptr ) {
elmkom 42:8500f0cb2ea5 407 tmp_char = *ptr;
elmkom 42:8500f0cb2ea5 408 *ptr-- = *ptr1;
elmkom 42:8500f0cb2ea5 409 *ptr1++ = tmp_char;
elmkom 42:8500f0cb2ea5 410 }
elmkom 42:8500f0cb2ea5 411 return result;
elmkom 42:8500f0cb2ea5 412 }
elmkom 42:8500f0cb2ea5 413
elmkom 42:8500f0cb2ea5 414 char* Wnc::writeSocket(const char * s)
elmkom 42:8500f0cb2ea5 415 {
elmkom 42:8500f0cb2ea5 416
elmkom 42:8500f0cb2ea5 417 char *reply;
elmkom 42:8500f0cb2ea5 418 char num2str[6];
elmkom 42:8500f0cb2ea5 419 size_t sLen = strlen(s);
elmkom 42:8500f0cb2ea5 420 if (sLen <= 99999)
elmkom 42:8500f0cb2ea5 421 {
elmkom 42:8500f0cb2ea5 422
elmkom 42:8500f0cb2ea5 423 string cmd_str("AT@SOCKWRITE=1,");
elmkom 42:8500f0cb2ea5 424 encode(sLen, num2str, 10);
elmkom 42:8500f0cb2ea5 425 cmd_str += num2str;
elmkom 42:8500f0cb2ea5 426 cmd_str += ",\"";
elmkom 42:8500f0cb2ea5 427 while(*s != '\0')
elmkom 42:8500f0cb2ea5 428 {
elmkom 42:8500f0cb2ea5 429 encode((int)*s++, num2str, 16);
elmkom 42:8500f0cb2ea5 430 // Always 2-digit ascii hex:
elmkom 42:8500f0cb2ea5 431 if (strlen(num2str) == 1)
elmkom 42:8500f0cb2ea5 432 {
elmkom 42:8500f0cb2ea5 433 num2str[2] = '\0';
elmkom 42:8500f0cb2ea5 434 num2str[1] = num2str[0];
elmkom 42:8500f0cb2ea5 435 num2str[0] = '0';
elmkom 42:8500f0cb2ea5 436 }
elmkom 42:8500f0cb2ea5 437 cmd_str += num2str;
elmkom 42:8500f0cb2ea5 438 }
elmkom 42:8500f0cb2ea5 439 cmd_str += "\"";
elmkom 42:8500f0cb2ea5 440 reply = send(cmd_str.c_str(), WNC_WAIT_TIME_MS);
elmkom 42:8500f0cb2ea5 441 }
elmkom 42:8500f0cb2ea5 442 else
elmkom 42:8500f0cb2ea5 443 pc.puts("sockwrite Err, string to long\r\n");
elmkom 42:8500f0cb2ea5 444 return NULL;
elmkom 42:8500f0cb2ea5 445 }
elmkom 42:8500f0cb2ea5 446
elmkom 42:8500f0cb2ea5 447 int Wnc::hex_to_int(char c){
elmkom 42:8500f0cb2ea5 448 if(c >=97)
elmkom 42:8500f0cb2ea5 449 c=c-32;
elmkom 42:8500f0cb2ea5 450 int first = c / 16 - 3;
elmkom 42:8500f0cb2ea5 451 int second = c % 16;
elmkom 42:8500f0cb2ea5 452 int result = first*10 + second;
elmkom 42:8500f0cb2ea5 453 if(result > 9) result--;
elmkom 42:8500f0cb2ea5 454 return result;
elmkom 42:8500f0cb2ea5 455 }
elmkom 42:8500f0cb2ea5 456
elmkom 42:8500f0cb2ea5 457 int Wnc::hex_to_ascii(char h, char l){
elmkom 42:8500f0cb2ea5 458 int high = hex_to_int(h) * 16;
elmkom 42:8500f0cb2ea5 459 int low = hex_to_int(l);
elmkom 42:8500f0cb2ea5 460 return high+low;
elmkom 42:8500f0cb2ea5 461 }
elmkom 42:8500f0cb2ea5 462
elmkom 42:8500f0cb2ea5 463 int Wnc::indexOf(char* str, char c)
elmkom 42:8500f0cb2ea5 464 {
elmkom 42:8500f0cb2ea5 465 int index = 0;
elmkom 42:8500f0cb2ea5 466 while(str[index] != 0)
elmkom 42:8500f0cb2ea5 467 {
elmkom 42:8500f0cb2ea5 468 if(str[index] == c)
elmkom 42:8500f0cb2ea5 469 return index;
elmkom 42:8500f0cb2ea5 470 index++;
elmkom 42:8500f0cb2ea5 471 }
elmkom 42:8500f0cb2ea5 472 return -1;
elmkom 42:8500f0cb2ea5 473 }
elmkom 42:8500f0cb2ea5 474
elmkom 42:8500f0cb2ea5 475 char* Wnc::readSocket()
elmkom 42:8500f0cb2ea5 476 {
elmkom 42:8500f0cb2ea5 477
elmkom 42:8500f0cb2ea5 478 static char data[1000];
elmkom 42:8500f0cb2ea5 479 int i = 0;
elmkom 42:8500f0cb2ea5 480 char *reply;
elmkom 42:8500f0cb2ea5 481 reply = send("AT@SOCKREAD=1,1024",1000);
elmkom 42:8500f0cb2ea5 482 if(strlen(reply) > 0)
elmkom 42:8500f0cb2ea5 483 {
elmkom 42:8500f0cb2ea5 484 int pos_start = indexOf(reply,'"');
elmkom 42:8500f0cb2ea5 485
elmkom 42:8500f0cb2ea5 486 if(pos_start > 0)
elmkom 42:8500f0cb2ea5 487 {
elmkom 42:8500f0cb2ea5 488 pos_start+=1;
elmkom 42:8500f0cb2ea5 489 int length = indexOf(&reply[pos_start],'"');
elmkom 42:8500f0cb2ea5 490
elmkom 42:8500f0cb2ea5 491 if(length > 0)
elmkom 42:8500f0cb2ea5 492 {
elmkom 42:8500f0cb2ea5 493 char hi;
elmkom 42:8500f0cb2ea5 494 char low;
elmkom 42:8500f0cb2ea5 495 for(i = 0; i < length; i++){
elmkom 42:8500f0cb2ea5 496 if(i % 2 != 0){
elmkom 42:8500f0cb2ea5 497 low = reply[pos_start++];
elmkom 42:8500f0cb2ea5 498 data[i/2] = (char) hex_to_ascii(hi,low);
elmkom 42:8500f0cb2ea5 499 }else{
elmkom 42:8500f0cb2ea5 500 hi = reply[pos_start++];
elmkom 42:8500f0cb2ea5 501 }
elmkom 42:8500f0cb2ea5 502 }
elmkom 42:8500f0cb2ea5 503 }
elmkom 42:8500f0cb2ea5 504 }
elmkom 42:8500f0cb2ea5 505 }
elmkom 42:8500f0cb2ea5 506 data[i] = NULL;
elmkom 42:8500f0cb2ea5 507 return data;
elmkom 42:8500f0cb2ea5 508 }