Remote I/O Sensor bus with AT&T flow and M2X cloud

Dependencies:   DHT11 FXOS8700CQ MODSERIAL mbed

Fork of Avnet_ATT_Cellular_IOT by Avnet

Revision:
73:da723fedfdd2
Parent:
68:6e311c747045
Child:
75:8cc98a3b9c62
--- a/wnc_control.cpp	Thu Aug 11 17:04:09 2016 +0000
+++ b/wnc_control.cpp	Fri Aug 12 19:47:29 2016 +0000
@@ -37,7 +37,8 @@
     WNC_OK =0,
     WNC_CMD_ERR = -1,
     WNC_NO_RESPONSE = -2,
-    WNC_CELL_LINK_DOWN = -3
+    WNC_CELL_LINK_DOWN = -3,
+    WNC_EXTERR = -4
 };
 
 // Contains result of last call to send_wnc_cmd(..)
@@ -58,12 +59,12 @@
     cmd_str += MY_APN_STR;
     cmd_str += ",IP";
     at_send_wnc_cmd(cmd_str.c_str(), &pRespStr, 4*WNC_TIMEOUT_MS); // Set APN, cmd seems to take a little longer sometimes
-    PUTS(cmd_str.c_str());
  }   
 
   static bool reportStatus = true;
   do
   {
+      PUTS("------------ software_init_mdm! --------->\r\n");
       if (check_wnc_ready() == 0)
       {
           if (reportStatus == false)
@@ -157,6 +158,13 @@
         PUTS("Socket Write fail!!!\r\n");
         software_init_mdm();
       }
+      else if (WNC_MDM_ERR == WNC_EXTERR)
+      {
+        pc.puts("Socket Disconnected (broken) !!!\r\n");
+        sockclose_mdm();
+        sockopen_mdm();
+        //software_init_mdm();
+      }
     } while (WNC_MDM_ERR != WNC_OK);
     }
     else
@@ -283,6 +291,8 @@
   
     // SIM card OK, now check for signal and cellular network registration
     cmdRes1 = at_send_wnc_cmd("AT+CREG?", &pRespStr, WNC_TIMEOUT_MS);      // Check if registered on network
+    if (pRespStr->size() > 0)
+    {
     pos = pRespStr->find("CREG: ");
     if (pos != string::npos)
     {
@@ -295,6 +305,7 @@
 #ifdef WNC_CMD_DEBUG_ON_VERBOSE
             PUTS("------------ WNC Cell Link Down! ------>\r\n");
 #endif
+            wait_ms(3000);
             return (-2);
         }
     }
@@ -302,7 +313,15 @@
 #ifdef WNC_CMD_DEBUG_ON_VERBOSE
     PUTS("------------ WNC Ready ---------------->\r\n");
 #endif
-  
+    }
+    else
+    {
+#ifdef WNC_CMD_DEBUG_ON_VERBOSE
+        PUTS("------------ CREG No Reply !----------->\r\n");
+#endif
+        return (-2);
+    }
+
     return (0);
 }
 
@@ -319,6 +338,7 @@
      PUTS("FAIL send cmd: ");
      #ifdef WNC_CMD_DEBUG_ON_VERBOSE
      PUTS(s);
+
      #else
      string truncStr(s, 50);
      truncStr += "\r\n";
@@ -354,7 +374,10 @@
   if (cmdRes == -2)
      WNC_MDM_ERR = WNC_NO_RESPONSE;
 
-  if (cmdRes == 0)
+  if (cmdRes == -3)
+     WNC_MDM_ERR = WNC_EXTERR;
+
+ if (cmdRes == 0)
      WNC_MDM_ERR = WNC_OK;
   
   return (cmdRes);
@@ -362,7 +385,7 @@
 
 int at_send_wnc_cmd(const char * s, string ** r, int ms_timeout)
 {
-  static const char * rsp_lst[] = { "OK", "ERROR", NULL };
+  static const char * rsp_lst[] = { "OK", "ERROR", "@EXTERR", NULL };
   int len;
 
 #ifdef WNC_CMD_DEBUG_ON
@@ -403,10 +426,14 @@
       #endif
 #endif
 
-      if (res > 0)
+      if (res == 0) {
+          /* OK */
+          return 0;
+      } else if (res == 2) {
+          /* @EXTERR */
+          return -3;
+      } else
           return -1;
-      else
-          return 0;
   }
   else
   {
@@ -496,7 +523,11 @@
   cmd_str += "\",";
   cmd_str += port;
   cmd_str += ",30";
-  send_wnc_cmd(cmd_str.c_str(), &pRespStr, 31000);
+  int cmd = send_wnc_cmd(cmd_str.c_str(), &pRespStr, 31000);
+  if (cmd != WNC_OK) {
+      // Per WNC: re-close even if open fails!
+      at_sockclose_wnc();
+  }
 }
 
 void at_sockclose_wnc(void)
@@ -541,6 +572,7 @@
   string * pRespStr;
   char num2str[6];
   size_t sLen = strlen(s);
+  int res;
   if (sLen <= 1500)
   {
     string cmd_str("AT@SOCKWRITE=1,");
@@ -560,7 +592,9 @@
       cmd_str += num2str;
     }
     cmd_str += "\"";
-    send_wnc_cmd(cmd_str.c_str(), &pRespStr, 120000);
+    res = send_wnc_cmd(cmd_str.c_str(), &pRespStr, 120000);
+    if (res == -3)
+        PUTS("sockwrite is disconnect \r\n");
   }
   else
     PUTS("sockwrite Err, string to long\r\n");
@@ -589,29 +623,35 @@
       // between each retry.
       wait_ms(10);
       
-      send_wnc_cmd(cmd_str.c_str(), &pRespStr, WNC_TIMEOUT_MS);
-      
-      size_t pos_start = pRespStr->find("\"")  + 1;
-      size_t pos_end   = pRespStr->rfind("\"") - 1;
+      if (send_wnc_cmd(cmd_str.c_str(), &pRespStr, WNC_TIMEOUT_MS) == 0)
+      {
+        size_t pos_start = pRespStr->find("\"")  + 1;
+        size_t pos_end   = pRespStr->rfind("\"") - 1;
       
-      // Make sure search finds what it's looking for!
-      if (pos_start != string::npos && pos_end != string::npos)
+        // Make sure search finds what it's looking for!
+        if (pos_start != string::npos && pos_end != string::npos)
           i = (pos_end - pos_start + 1);  // Num hex chars, 2 per byte
-      else
+        else
           i = 0;
           
-      if (i > 0)
+        if (i > 0)
+        {
+            retries = 1;  // If any data found retry 1 more time to catch data that might be in another
+                          //  WNC payload
+            string byte;
+            while (pos_start < pos_end)
+            {
+              byte = pRespStr->substr(pos_start, 2);
+              *pS += (char)strtol(byte.c_str(), NULL, 16);
+              pos_start += 2;
+            }
+            numBytes += i/2;
+        }
+      }
+      else
       {
-        retries = 1;  // If any data found retry 1 more time to catch data that might be in another
-                      //  WNC payload
-        string byte;
-        while (pos_start < pos_end)
-        {
-          byte = pRespStr->substr(pos_start, 2);
-          *pS += (char)strtol(byte.c_str(), NULL, 16);
-          pos_start += 2;
-        }
-        numBytes += i/2;
+          PUTS("no readsock reply!\r\n");
+          return (0);
       }
     }
   }