Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: main.cpp
- Revision:
- 1:0d7ba45f12b1
- Parent:
- 0:5cd6077e0a8e
- Child:
- 2:7e018d5751b1
diff -r 5cd6077e0a8e -r 0d7ba45f12b1 main.cpp
--- 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);
}