SKT Cat.M1(BG96) ThingPlug Example

Revision:
1:0d7ba45f12b1
Parent:
0:5cd6077e0a8e
Child:
2:7e018d5751b1
--- a/main.cpp	Tue Mar 19 00:25:29 2019 +0000
+++ b/main.cpp	Wed Mar 20 07:26:32 2019 +0000
@@ -55,17 +55,24 @@
 // 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
 
 /* Debug message settings */
-#define BG96_PARSER_DEBUG           DEBUG_DISABLE
+#define BG96_PARSER_DEBUG           DEBUG_ENABLE
 #define CATM1_DEVICE_DEBUG          DEBUG_ENABLE 
 
+/* HTTP */
+#define HTTP_STATUS_CODE_OK                         200
+
+// Sample HTTP URL: Weather info by Korea Meteorological Administration
+char request_url[] = "http://www.kma.go.kr/wid/queryDFSRSS.jsp?zone=4113552000";
+
+
 // Functions: Module Status
 void waitCatM1Ready(void);
 int8_t setEchoStatus_BG96(bool onoff);
@@ -74,19 +81,19 @@
 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: HTTP send & recv
+int8_t setHttpRequest_BG96(char * req, int len);
+int8_t sendHttpRequest_BG96(int timeout, int * rsp_code, int * content_len);
+int8_t getHttpResponse_BG96(int timeout, char * buf, int len);
+void dumpHttpRespones_BG96(char * buf);
 
 Serial pc(USBTX, USBRX);    // USB debug
 
 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 +124,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 +150,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 +162,7 @@
     myprintf("LTE Cat.M1 Version");
     myprintf("=================================================");
     myprintf(">> Target Board: WIoT-QC01 (Quectel BG96)");
-    myprintf(">> Sample Code: Ping Test");
+    myprintf(">> Sample Code: HTTP Send & Recv");
     myprintf("=================================================\r\n");
     
     setEchoStatus_BG96(OFF);
@@ -174,22 +173,40 @@
     
     checknSetApn_BG96(CATM1_APN_SKT);
     
-    char ping_dest_1st[] = "8.8.8.8";
-    char ping_dest_2nd[] = "www.google.com";
+    // Set HTTP request URL
+    if(setHttpRequest_BG96(request_url, strlen(request_url)-1) != RET_OK) {   
+        myprintf("[HTTP] setHttpRequest failed\r\n");
+        while(1){;}
+    }
     
-    setContextActivate_BG96();  
-    
-    myprintf("[Ping] Host: %s\r\n", ping_dest_1st);
-    printPingToHost_BG96(ping_dest_1st, 2, 4);    
+    int http_response_code = 0;
+    int http_response_len = 0;
     
-    wait_ms(2000);
-    
-    myprintf("[Ping] Host: %s\r\n", ping_dest_2nd);
-    printPingToHost_BG96(ping_dest_2nd, 2, 4);
-        
-    setContextDeactivate_BG96(); 
+    if(sendHttpRequest_BG96(20, &http_response_code, &http_response_len)) {
+        if(http_response_code == HTTP_STATUS_CODE_OK) {
+            myprintf("[HTTP] 200 OK, Response content length: %d\r\n", http_response_len);
+            
+            char * http_buf;
+            http_buf = (char*)calloc(http_response_len+2, sizeof(char)); // memory allocation
+                        
+            if(getHttpResponse_BG96(20, http_buf, http_response_len+2)) {
+                dumpHttpRespones_BG96(http_buf);        
+            }
+            
+            free(http_buf); // release
+            
+            myprintf("[HTTP] getHttpResponse success\r\n");
+        } else {
+            myprintf("[HTTP] sendHttpRequest failed - HTTP response code: %d\r\n", http_response_code);
+        }
+    }
 }
 
+
+// ----------------------------------------------------------------
+// Functions: Cat.M1 Status
+// ----------------------------------------------------------------
+
 void waitCatM1Ready(void)
 {
     while(1) 
@@ -286,8 +303,8 @@
             return RET_NOK; // failed
         }
     }    
-    devlog("APN Check Done\r\n");    
-    
+    devlog("APN Check Done\r\n");
+        
     return RET_OK;
 }
 
@@ -313,177 +330,72 @@
     return ret;
 }
 
-int8_t getIpAddressByName_BG96(const char * name, char * ipstr)
-{
-    char buf2[50];
-    bool ok;
-    int  err, ipcount, dnsttl;
-
-    int8_t ret = RET_NOK;
+// ----------------------------------------------------------------
+// Functions: Cat.M1 HTTP send & recv
+// ----------------------------------------------------------------
 
-    ok = ( _parser->send("AT+QIDNSGIP=1,\"%s\"", name)
-            && _parser->recv("OK") 
-            && _parser->recv("+QIURC: \"dnsgip\",%d,%d,%d", &err, &ipcount, &dnsttl) 
-            && err==0 
-            && ipcount > 0
-        ); 
-
-    if( ok ) {        
-        _parser->recv("+QIURC: \"dnsgip\",\"%[^\"]\"", ipstr);       //use the first DNS value
-        for( int i=0; i<ipcount-1; i++ )
-            _parser->recv("+QIURC: \"dnsgip\",\"%[^\"]\"", buf2);   //and discrard the rest  if >1 
-            
-        ret = RET_OK;    
-    }        
-    return ret;           
-}
-
-int8_t getIpAddress_BG96(char * ipstr) // IPv4 or IPv6
+int8_t setHttpRequest_BG96(char * req, int len)
 {
     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;
-}
-
-int8_t setContextActivate_BG96(void) // Activate a PDP Context
-{
-    int8_t ret = RET_NOK;
-    
-    _parser->send("AT+QIACT=1");    
-    if(_parser->recv("OK")) {
-        devlog("Activate a PDP Context\r\n");
-        ret = RET_OK;
-    } else { 
-        devlog("PDP Context Activation failed\r\n");        
-    }    
-    return ret;
-}
-
-int8_t setContextDeactivate_BG96(void) // Deactivate a PDP Context
-{
-    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;
-    
     bool done = false;
-    Timer t;
     
     _parser->set_timeout(BG96_CONNECT_TIMEOUT);
     
-    if((strcmp(type, "TCP") != 0) && (strcmp(type, "UDP") != 0)) {        
-        return RET_NOK;
+    _parser->send("AT+QHTTPURL=%d,%d", len, 5);    
+    if( !done && _parser->recv("CONNECT\r\n") )
+        done = (_parser->write(req, len) <= 0);
+        
+        if( !done ) {        
+        done = (_parser->recv("OK"));        
+        if(done) {
+            devlog("Set HTTP request URL success: %s\r\n", req);
+            ret = RET_OK;
+        }
     }
-
-    t.start();
-    
-    _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();
+    _parser->set_timeout(BG96_DEFAULT_TIMEOUT); 
     
     return ret;
 }
 
-int8_t sockClose_BG96(void)
+
+int8_t sendHttpRequest_BG96(int timeout, int * rsp_code, int * content_len)
 {
     int8_t ret = RET_NOK;
-    int id = 0;
-    
-    _parser->set_timeout(BG96_CONNECT_TIMEOUT);
+    int err;
     
-    if(_parser->send("AT+QICLOSE=%d", id) && _parser->recv("OK")) {
-        ret = RET_OK;        
-    }
-    _parser->set_timeout(BG96_DEFAULT_TIMEOUT);
+    _parser->set_timeout(BG96_DEFAULT_TIMEOUT + (timeout * 1000));
     
-    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);
-    
-    _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");    
-    
-    _parser->set_timeout(BG96_DEFAULT_TIMEOUT);
+    if( _parser->send("AT+QHTTPGET=%d", timeout) 
+        && _parser->recv("+QHTTPGET: %d,%d,%d\r\n", &err, rsp_code, content_len)
+        && (err == 0)) 
+    {        
+        devlog("The HTTP request is sent and the response is successful\r\n");        
+        ret = RET_OK;            
+    }    
+    _parser->set_timeout(BG96_DEFAULT_TIMEOUT); 
     
     return ret;
 }
 
-int8_t checkDataRecv_BG96(void)
+
+int8_t getHttpResponse_BG96(int timeout, char * buf, int len)
 {
     int8_t ret = RET_NOK;
-    int id = 0;
-    char cmd[20];
+    bool done = false;
+    
+    if( _parser->send("AT+QHTTPREAD=%d", timeout) && _parser->recv("CONNECT\r\n")) {
+        done = _parser->read(buf, len);
+    }
     
-    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(done) {
+        if( _parser->recv("OK") && _parser->recv("+QHTTPREAD: 0")) {
+            ret = RET_OK;
+        }
+    }            
     return ret;
 }
 
-int8_t dataRecv_BG96(char * data, int * len)
+void dumpHttpRespones_BG96(char * buf)
 {
-    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;
-        
-    return ret;
+    myprintf("%s", buf);   
 }