GSMA version

Dependencies:   FXOS8700CQ mbed sfh7779

Fork of StarterKit by Rick McConney

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