GSMA version
Dependencies: FXOS8700CQ mbed sfh7779
Fork of StarterKit by
Diff: Wnc.cpp
- Revision:
- 45:fe90f1fcb4e0
- Parent:
- 44:60008ebffdd4
- Child:
- 46:319a3f1e8ba9
--- a/Wnc.cpp Wed Oct 26 18:40:40 2016 +0000 +++ b/Wnc.cpp Wed Nov 30 14:50:16 2016 +0000 @@ -1,7 +1,6 @@ #include "Wnc.h" #include "mbed.h" #include <cctype> -#include <string> #include "config_me.h" #include "SerialBuffered.h" @@ -24,7 +23,7 @@ int t3412Timer = 4*60*60; int t3324Timer = 20; bool powerSave = false; -bool firstWake = false; + Wnc::Wnc(void) { @@ -117,6 +116,7 @@ { static char response[3200]; int len = 0; + char c; if(timeout_ms > 0) // read until timeout or OK { @@ -124,21 +124,27 @@ timer.start(); while ((len < (3200-1)) && (timer.read_ms() < timeout_ms)) { if (mdm.readable()) { - response[len++] = mdm.getc(); + c = mdm.getc(); + // replace \r\n to make debug messages more compact + if(c == '\r') c = ' '; + if(c == '\n') c = ' '; + + response[len++] = c; if(len>1 && response[len-2] == 'O' && response[len-1] == 'K') break; + } } } response[len] = (char)NULL; - pc.printf("{%s}\r\n",response); + pc.printf("{%d %s}\r\n",len,response); return response; } char* Wnc::send(const char *cmd, int timeout_ms) { - char* reply; + char *reply; while (mdm.readable()) { mdm.getc(); @@ -184,7 +190,7 @@ mdm_wakeup_in = 0; } -int Wnc::init(void) { +bool Wnc::init(void) { uart1Rts = 0; mdm_wakeup_in.output(); // disable signal level translator (necessary @@ -320,7 +326,7 @@ mdm_wakeup_in = 0; //allow power sleep mode powerSave = true; char cmd[32]; - sprintf(cmd,"AT+CPSMS=1,,,%d,%d",tau,activity); + snprintf(cmd,sizeof(cmd),"AT+CPSMS=1,,,%d,%d",tau,activity); send(cmd, WNC_WAIT_TIME_MS); } else @@ -363,83 +369,98 @@ void Wnc::wakeFromPowerSave() { - char *reply; mdm_wakeup_in = 1; pc.printf("wake from power save\r\n"); - firstWake = true; - // reply = send("AT+CFUN=1", WNC_WAIT_TIME_MS); - // reply = send("AT%CMATT=1", WNC_WAIT_TIME_MS); - // wait(5); // wait to attach - // reply = send("AT+CREG?", WNC_WAIT_TIME_MS); - // reply = send("AT@INTERNET=1", WNC_WAIT_TIME_MS); // Internet services enabled - // reply = send("AT@SOCKDIAL=1", WNC_WAIT_TIME_MS); - - } -void Wnc::startInternet() +bool Wnc::cmdFailed(char* reply,char* msg) +{ + if(strstr(reply,"OK") > 0) + return false; + pc.printf("%s\r\n",msg); + return true; +} + +bool Wnc::startInternet() { char *reply; reply = send("ATE1",WNC_WAIT_TIME_MS); // Echo ON char apn [32]; - sprintf(apn,"AT%%PDNSET=1,%s,IP",MY_APN_STR); + snprintf(apn,sizeof(apn),"AT%%PDNSET=1,%s,IP",MY_APN_STR); reply = send(apn, 2*WNC_WAIT_TIME_MS); // Set APN, cmd seems to take a little longer sometimes - reply = send("AT+CREG?", WNC_WAIT_TIME_MS); + if(cmdFailed(reply,"Failed to set APN")) return false; + + reply = send("AT%PDNSET?", WNC_WAIT_TIME_MS); + + // pc.printf("Wiating ...\r\n"); + // wait(10); + reply = send("AT@INTERNET=1", WNC_WAIT_TIME_MS); // Internet services enabled + if(cmdFailed(reply,"Failed to start INTERNET")) + { + return false; + } reply = send("AT@SOCKDIAL=1", WNC_WAIT_TIME_MS); + if(cmdFailed(reply,"SOCKDIAL Failed")) + { + // passthrough(); + return false; + } + return true; } char* Wnc::ping(char* ip) { char cmd[32]; - sprintf(cmd,"AT@PINGREQ=\"%s\"",ip); + snprintf(cmd,sizeof(cmd),"AT@PINGREQ=\"%s\"",ip); return send(cmd,WNC_WAIT_TIME_MS); } -// AT@SOCKCONN=1,"108.244.165.22",5005 + bool Wnc::connect(char* ip, int port) { char *reply; + for(int i = 0;i<2;i++) + { + if(isModemResponding()) + break; + wait(0.5); + } + if(isModemResponding()) { reply = send("AT@SOCKCREAT=1", WNC_WAIT_TIME_MS); - if(strlen(reply) == 0 || strstr(reply,"OK") ==0) - return false; + if(cmdFailed(reply,"Socket Create Failed")) return false; + } + else + { + pc.printf("Error Modem not responding\r\n"); + return false; } - char cmd[32]; - if(isModemResponding()) + char cmd[64]; + + snprintf(cmd,sizeof(cmd),"AT@SOCKCONN=1,\"%s\",%d",ip,port); + reply = send(cmd,12*WNC_WAIT_TIME_MS); + if(cmdFailed(reply,"Socket Connect Failed")) return false; + + for(int i = 0;i<10;i++) { - sprintf(cmd,"AT@SOCKCONN=1,\"%s\",%d",ip,port); - reply = send(cmd,WNC_WAIT_TIME_MS); - if(firstWake) + reply = send("AT+CREG?",WNC_WAIT_TIME_MS); + if(strlen(reply) > 0 && strstr(reply,"2,1") != 0) { - for(int i = 0;i<10;i++) - { - pc.printf("%d",i); - send("AT", WNC_WAIT_TIME_MS); - reply = send("AT+CREG?",WNC_WAIT_TIME_MS); - if(strlen(reply) > 0 && strstr(reply,"2,1") != 0) - { - pc.printf("connected %s",reply); - break; - } - else - { - pc.printf("Unconnected %s",reply); - } - wait(1); - } + pc.printf("Connected %s\r\n",reply); + return true; } - firstWake = false; - reply = send(cmd,WNC_WAIT_TIME_MS); - - if(strlen(reply) == 0 || strstr(reply,"OK") ==0) - return false; + else + { + pc.printf("Unconnected %s\r\n",reply); + } + wait(1); } - return true; + return false; } void Wnc::disconnect() @@ -477,19 +498,16 @@ return result; } -char* Wnc::writeSocket(const char * s) +bool Wnc::writeSocket(const char * s) { - char *reply; char num2str[6]; size_t sLen = strlen(s); if (sLen <= 99999) { + char cmd[sLen*2+32]; + int index = snprintf(cmd,sizeof(cmd),"AT@SOCKWRITE=1,%d,\"",sLen); - string cmd_str("AT@SOCKWRITE=1,"); - encode(sLen, num2str, 10); - cmd_str += num2str; - cmd_str += ",\""; while(*s != '\0') { encode((int)*s++, num2str, 16); @@ -500,30 +518,31 @@ num2str[1] = num2str[0]; num2str[0] = '0'; } - cmd_str += num2str; + cmd[index++] = num2str[0]; + cmd[index++] = num2str[1]; } - cmd_str += "\""; - reply = send(cmd_str.c_str(), WNC_WAIT_TIME_MS); + cmd[index++] = '"'; + cmd[index] = '\0'; + char* reply = send(cmd, WNC_WAIT_TIME_MS); + if(cmdFailed(reply,"Send Failed")) return false; + return true; } else + { pc.puts("sockwrite Err, string to long\r\n"); - return NULL; + return false; + } + } -int Wnc::hex_to_int(char c){ - if(c >=97) - c=c-32; - int first = c / 16 - 3; - int second = c % 16; - int result = first*10 + second; - if(result > 9) result--; - return result; +int Wnc::hex_to_int(char A) +{ + return (A > '9')? (A &~ 0x20) - 'A' + 10: (A - '0'); } -int Wnc::hex_to_ascii(char h, char l){ - int high = hex_to_int(h) * 16; - int low = hex_to_int(l); - return high+low; +int Wnc::hex_to_ascii(char h, char l) +{ + return hex_to_int(h) * 16 + hex_to_int(l); } int Wnc::indexOf(char* str, char c) @@ -572,4 +591,37 @@ } data[i] = NULL; return data; +} + +char* Wnc::resolveDn(const char* name) +{ + char cmd[64]; + + snprintf(cmd,sizeof(cmd),"AT@DNSRESVDON=\"%s\"",name); + char* reply = send(cmd,12*WNC_WAIT_TIME_MS); + static char ipBuf[32]; + ipBuf[0] = NULL; + int index = 0; + int begin = -1; + int i = 0; + + while (reply[index]) { // While there are more characters to process... + if (begin == -1 && isdigit(reply[index])) { // Upon finding a digit, ... + begin = index; + } + if(begin != -1) + { + if(isdigit(reply[index]) || reply[index] == '.') + { + ipBuf[i++] = reply[index]; + } + else + { + ipBuf[i++] = NULL; + return ipBuf; + } + } + index++; + } + return ipBuf; } \ No newline at end of file