WIZnet-IoTShield-AMM592-SMS example

Revision:
1:bdb1c9f07d06
Parent:
0:5cd6077e0a8e
Child:
2:b69c69a16fd2
--- a/main.cpp	Tue Mar 19 00:25:29 2019 +0000
+++ b/main.cpp	Wed Mar 20 05:36:45 2019 +0000
@@ -55,9 +55,9 @@
 // Cat.M1
 #define MBED_CONF_IOTSHIELD_CATM1_TX                D8
 #define MBED_CONF_IOTSHIELD_CATM1_RX                D2
-#define MBED_CONF_IOTSHIELD_CATM1_RESET             D6
+#define MBED_CONF_IOTSHIELD_CATM1_RESET             D7
 #define MBED_CONF_IOTSHIELD_CATM1_PWRKEY            D9
-#define MBED_CONF_IOTSHIELD_CATM1_WAKE              NC
+
 // Sensors
 #define MBED_CONF_IOTSHIELD_SENSOR_CDS              A0
 #define MBED_CONF_IOTSHIELD_SENSOR_TEMP             A1
@@ -66,6 +66,14 @@
 #define BG96_PARSER_DEBUG           DEBUG_DISABLE
 #define CATM1_DEVICE_DEBUG          DEBUG_ENABLE 
 
+/* SMS */
+#define SMS_EOF                                     0x1A
+#define MAX_SMS_SIZE                                100
+
+char phone_number[] = "010xxxxxxxx";
+char send_message[] = "WIZnet Cat.M1 IoT shield is powered on";
+
+
 // Functions: Module Status
 void waitCatM1Ready(void);
 int8_t setEchoStatus_BG96(bool onoff);
@@ -74,12 +82,13 @@
 int8_t checknSetApn_BG96(const char * apn);
 int8_t getFirmwareVersion_BG96(char * version);
 
-// Functions: PDP context
-int8_t setContextActivate_BG96(void);   // Activate a PDP Context
-int8_t setContextDeactivate_BG96(void); // Deactivate a PDP Context
-
-// Functions: Ping test
-void pingToHost_BG96(char * host, int timeout, int pingnum);
+// Functions: SMS
+int8_t initSMS_BG96(void);
+int8_t sendSMS_BG96(char * da, char * msg, int len);
+int checkRecvSMS_BG96(void);
+int8_t recvSMS_BG96(int msg_idx, char * msg, char * da, char * datetime);
+int8_t deleteSMS_BG96(int msg_idx);
+int8_t deleteAllSMS_BG96(int delflag);
 
 
 Serial pc(USBTX, USBRX);    // USB debug
@@ -87,6 +96,8 @@
 UARTSerial *_serial;        // Cat.M1 module    
 ATCmdParser *_parser;
 
+DigitalOut _RESET_BG96(MBED_CONF_IOTSHIELD_CATM1_RESET);
+DigitalOut _PWRKEY_BG96(MBED_CONF_IOTSHIELD_CATM1_PWRKEY);
 
 void serialPcInit(void)
 {
@@ -117,35 +128,25 @@
                         BG96_PARSER_DEBUG);
 }
 
-void printPingToHost_BG96(char * host, int timeout, int pingnum)
-{   
-    int i;
-    char resp_str[50] = {0, };
-    
-    if((timeout < 1) || (timeout > 255)) {
-        devlog("Ping timeout range is 1-255, and the default value is 4 (unit: sec)\r\n");
-        return;
-    }
+void catm1DeviceReset_BG96(void)
+{
+    _RESET_BG96 = 1;
+    _PWRKEY_BG96 = 1;
+    wait_ms(300);
     
-    if((pingnum < 1) || (pingnum > 10)) {
-        devlog("The maximum number of sending Ping request range is 1-10, and the default value is 4\r\n");
-        return;
-    }
-       
-    _parser->set_timeout((1000 * timeout) + 2000);
+    _RESET_BG96 = 0;
+    _PWRKEY_BG96 = 0;
+    wait_ms(400);
     
-    if(_parser->send("AT+QPING=%d,\"%s\",%d,%d", 1, host, timeout, pingnum) && _parser->recv("OK")) {        
-        for(i = 0; i < (pingnum); i++) {            
-            _parser->recv("+QPING: %s\n", resp_str);
-            devlog("%s: %s\r\n", host, resp_str);
-        }
-        
-    }
-    
-    _parser->set_timeout(BG96_DEFAULT_TIMEOUT);
-    _parser->flush();
+    _RESET_BG96 = 1;    
+    wait_ms(1000);
 }
 
+
+// ----------------------------------------------------------------
+// Main routine
+// ----------------------------------------------------------------
+
 int main()
 {
     serialPcInit();    
@@ -153,9 +154,11 @@
     
     myprintf("Waiting for Cat.M1 Module Ready...\r\n");
     
-    // Todo: BG96 Hardware Init (hardware reset & pwrkey act)
+    catm1DeviceReset_BG96();
     
     waitCatM1Ready();
+    
+    wait_ms(5000);
             
     myprintf("System Init Complete\r\n");
         
@@ -163,7 +166,7 @@
     myprintf("LTE Cat.M1 Version");
     myprintf("=================================================");
     myprintf(">> Target Board: WIoT-QC01 (Quectel BG96)");
-    myprintf(">> Sample Code: Ping Test");
+    myprintf(">> Sample Code: SMS Send & Recv");
     myprintf("=================================================\r\n");
     
     setEchoStatus_BG96(OFF);
@@ -174,22 +177,52 @@
     
     checknSetApn_BG96(CATM1_APN_SKT);
     
-    char ping_dest_1st[] = "8.8.8.8";
-    char ping_dest_2nd[] = "www.google.com";
+    // SMS configuration
+    if(initSMS_BG96() != RET_OK) {   
+        myprintf("[SMS Init] failed\r\n");
+        while(1){;}
+    }
+    
+    // Send a message 
+    if(sendSMS_BG96(phone_number, send_message, strlen(send_message)) == RET_OK) {
+        myprintf("[SMS Send] to %s, \"%s\"\r\n", phone_number, send_message);
+    }
     
-    setContextActivate_BG96();  
+#if 0    
+    // Delete messages
+    deleteAllSMS_BG96(3);
+#endif
     
-    myprintf("[Ping] Host: %s\r\n", ping_dest_1st);
-    printPingToHost_BG96(ping_dest_1st, 2, 4);    
+    int msg_idx;
+    char recv_message[MAX_SMS_SIZE] = {0, };
+    char dest_addr[20] = {0, };
+    char date_time[25] = {0, };
+    
+    _parser->debug_on(DEBUG_DISABLE);
     
-    wait_ms(2000);
-    
-    myprintf("[Ping] Host: %s\r\n", ping_dest_2nd);
-    printPingToHost_BG96(ping_dest_2nd, 2, 4);
+    while(1)
+    {        
+        // SMS receive check
+        msg_idx = checkRecvSMS_BG96();
         
-    setContextDeactivate_BG96(); 
+        if(msg_idx > RET_NOK) { // SMS received
+            _parser->debug_on(BG96_PARSER_DEBUG);
+            
+            // Receive a message
+            if(recvSMS_BG96(msg_idx, recv_message, dest_addr, date_time) == RET_OK) {
+                myprintf("[SMS Recv] from %s, %s, \"%s\"\r\n", dest_addr, date_time, recv_message);
+            }
+                        
+            _parser->debug_on(DEBUG_DISABLE);
+        }     
+    }
 }
 
+
+// ----------------------------------------------------------------
+// Functions: Cat.M1 Status
+// ----------------------------------------------------------------
+
 void waitCatM1Ready(void)
 {
     while(1) 
@@ -286,8 +319,8 @@
             return RET_NOK; // failed
         }
     }    
-    devlog("APN Check Done\r\n");    
-    
+    devlog("APN Check Done\r\n");
+        
     return RET_OK;
 }
 
@@ -313,6 +346,11 @@
     return ret;
 }
 
+// ----------------------------------------------------------------
+// Functions: Cat.M1 DNS
+// ----------------------------------------------------------------
+
+
 int8_t getIpAddressByName_BG96(const char * name, char * ipstr)
 {
     char buf2[50];
@@ -338,152 +376,144 @@
     return ret;           
 }
 
-int8_t getIpAddress_BG96(char * ipstr) // IPv4 or IPv6
-{
-    int8_t ret = RET_NOK;    
-    int id, state, type; // not used    
 
-    _parser->send("AT+QIACT?");
-    if(_parser->recv("+QIACT: %d,%d,%d,\"%[^\"]\"", &id, &state, &type, ipstr)
-        && _parser->recv("OK")) {        
-        ret = RET_OK;
-    } 
-    return ret;
-}
+// ----------------------------------------------------------------
+// Functions: Cat.M1 SMS
+// ----------------------------------------------------------------
 
-int8_t setContextActivate_BG96(void) // Activate a PDP Context
+int8_t initSMS_BG96(void)
 {
     int8_t ret = RET_NOK;
+    bool msgformat = false, charset = false;
     
-    _parser->send("AT+QIACT=1");    
-    if(_parser->recv("OK")) {
-        devlog("Activate a PDP Context\r\n");
+    // 0 = PDU mode / 1 = Text mode
+    if(_parser->send("AT+CMGF=1") && _parser->recv("OK")) {         // Set SMS message format as text mode
+        devlog("SMS message format: Text mode\r\n");
+        msgformat = true;
+    }    
+    
+    // "GSM" / "IRA" / "USC2"
+    if(_parser->send("AT+CSCS=\"GSM\"") && _parser->recv("OK")) {   // Set character set as GSM
+        devlog("SMS character set: GSM\r\n");
+        charset = true;
+    }
+    
+    if(msgformat && charset) {
         ret = RET_OK;
-    } else { 
-        devlog("PDP Context Activation failed\r\n");        
-    }    
-    return ret;
+    }
+    
+    return ret;    
 }
 
-int8_t setContextDeactivate_BG96(void) // Deactivate a PDP Context
+int8_t sendSMS_BG96(char * da, char * msg, int len)
 {
     int8_t ret = RET_NOK;
-    
-    _parser->send("AT+QIDEACT=1");    
-    if(_parser->recv("OK")) {
-        devlog("Deactivate a PDP Context\r\n");
-        ret = RET_OK;
-    } else { 
-        devlog("PDP Context Deactivation failed\r\n");        
-    }
-    return ret;
-}
-
-int8_t sockOpenConnect_BG96(const char * type, const char * addr, int port)
-{
-    int8_t ret = RET_NOK;  
-    int err = 1;
-    int id = 0;
-    
+    int msg_idx = 0;    
     bool done = false;
-    Timer t;
     
     _parser->set_timeout(BG96_CONNECT_TIMEOUT);
     
-    if((strcmp(type, "TCP") != 0) && (strcmp(type, "UDP") != 0)) {        
-        return RET_NOK;
-    }
-
-    t.start();
+    _parser->send("AT+CMGS=\"%s\"", da); // DA(Destination address, Phone number)
+    if( !done && _parser->recv(">") )
+        done = (_parser->write(msg, len) <= 0) & _parser->send("%c", SMS_EOF);
     
-    _parser->send("AT+QIOPEN=1,%d,\"%s\",\"%s\",%d", id, type, addr, port);
-    do {        
-        done = (_parser->recv("+QIOPEN: %d,%d", &id, &err) && (err == 0));        
-    } while(!done && t.read_ms() < BG96_CONNECT_TIMEOUT);
-
-    if(done) ret = RET_OK;
-
-    _parser->set_timeout(BG96_DEFAULT_TIMEOUT);    
-    _parser->flush();
-    
-    return ret;
-}
-
-int8_t sockClose_BG96(void)
-{
-    int8_t ret = RET_NOK;
-    int id = 0;
-    
-    _parser->set_timeout(BG96_CONNECT_TIMEOUT);
-    
-    if(_parser->send("AT+QICLOSE=%d", id) && _parser->recv("OK")) {
-        ret = RET_OK;        
+    if( !done ) {        
+        done = (_parser->recv("+CMGS: %d", &msg_idx) && _parser->recv("OK"));        
+        if(done) {
+            devlog(">> SMS send success: index %d\r\n", msg_idx);
+            ret = RET_OK;
+        }
     }
     _parser->set_timeout(BG96_DEFAULT_TIMEOUT);
     
     return ret;
 }
 
-int8_t dataSend_BG96(char * data, int len)
-{
-    int8_t ret = RET_NOK;
-    int id = 0;
-    bool done = false;
-    
-    _parser->set_timeout(BG96_SEND_TIMEOUT);
+int checkRecvSMS_BG96(void)
+{    
+    int ret = RET_NOK;
+    int msg_idx = 0;    
     
-    _parser->send("AT+QISEND=%d,%ld", id, len);
-    if( !done && _parser->recv(">") )
-        done = (_parser->write(data, len) <= 0);
-
-    if( !done )
-        done = _parser->recv("SEND OK");    
+    bool received = false;
     
+    _parser->set_timeout(1);
+    received = _parser->recv("+CMTI: \"ME\",%d", &msg_idx);    
     _parser->set_timeout(BG96_DEFAULT_TIMEOUT);
     
+    if(received) {        
+        ret = msg_idx; 
+        devlog("<< SMS received: index %d\r\n", msg_idx);
+    }
     return ret;
 }
 
-int8_t checkDataRecv_BG96(void)
+int8_t recvSMS_BG96(int msg_idx, char * msg, char * da, char * datetime)
 {
-    int8_t ret = RET_NOK;
-    int id = 0;
-    char cmd[20];
+    int8_t ret = RET_NOK;    
+    char type[15] = {0, };
+    
+    int i = 0;
+    bool done = false;    
+    char recv_msg[MAX_SMS_SIZE] = {0, };
+    char * search_pt;    
+    Timer t;
+    
+    memset(recv_msg, 0x00, MAX_SMS_SIZE);
+        
+    _parser->set_timeout(BG96_RECV_TIMEOUT);   
     
-    bool received = false;
-
-    sprintf(cmd, "+QIURC: \"recv\",%d", id);
-    _parser->set_timeout(1);
-    received = _parser->recv(cmd);
-    _parser->set_timeout(BG96_DEFAULT_TIMEOUT);
-    
-    if(received) ret = RET_OK;    
+    if( _parser->send("AT+CMGR=%d", msg_idx)        
+        && _parser->recv("+CMGR: \"%[^\"]\",\"%[^\"]\",,\"%[^\"]\"", type, da, datetime))
+    {        
+        // timer start
+        t.start();
+        
+        while( !done && (t.read_ms() < BG96_DEFAULT_TIMEOUT)) {        
+            _parser->read(&recv_msg[i++], 1);        
+            search_pt = strstr(recv_msg, "OK");
+            if (search_pt != 0) {
+                done = true; // break;
+            }
+        }        
+        if(i > 8) {
+            memcpy(msg, recv_msg+2, i-8);            
+            devlog("<< SMS receive success: index %d\r\n", msg_idx);        
+            ret = RET_OK;
+        }
+    }    
+    _parser->set_timeout(BG96_DEFAULT_TIMEOUT);    
+    _parser->flush();
+            
     return ret;
 }
 
-int8_t dataRecv_BG96(char * data, int * len)
+int8_t deleteSMS_BG96(int msg_idx)
 {
     int8_t ret = RET_NOK;
-    int id = 0;
-    int recvCount = 0;
     
-    _parser->set_timeout(BG96_RECV_TIMEOUT);   
-     
-    if( _parser->send("AT+QIRD=%d", id) && _parser->recv("+QIRD:%d\r\n",&recvCount) ) {
-        if(recvCount > 0) {
-            _parser->getc();
-            _parser->read(data, recvCount);
-            if(_parser->recv("OK")) {
-                ret = RET_OK;
-            } else {
-                recvCount = 0;
-            }
-        }        
-    }
-    _parser->set_timeout(BG96_DEFAULT_TIMEOUT);    
-    _parser->flush();
-    
-    *len = recvCount;
-        
+    if(_parser->send("AT+CMGD=%d", msg_idx) && _parser->recv("OK"))
+    {
+        devlog("Message index[%d] has been deleted\r\n", msg_idx);           
+        ret = RET_OK;
+    } 
     return ret;
 }
+
+int8_t deleteAllSMS_BG96(int delflag)
+{
+    int8_t ret = RET_NOK;    
+    
+    //delflag == 1; // Delete all read messages from storage
+    //delflag == 2; // Delete all read messages from storage and sent mobile originated messages
+    //delflag == 3; // Delete all read messages from storage, sent and unsent mobile originated messages
+    //delflag == 4; // Delete all messages from storage
+    
+    if(_parser->send("AT+CMGD=0,%d", delflag) && _parser->recv("OK"))
+    {
+        devlog("All messages has been deleted (delflag: %d)\r\n", delflag);           
+        ret = RET_OK;
+    } 
+    return ret;
+}
+
+