SUNGTAE KIM
/
WIZnet-IoTShield-SENSOR_TEMP
WIoT-Shield-SENSOR-TEMP
Diff: main.cpp
- Revision:
- 1:0d7ba45f12b1
- Parent:
- 0:5cd6077e0a8e
- Child:
- 2:d7c5df056a3b
--- 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); }