Viktor Shin
/
WIZnet-IoTShield-AMM592-SMS
WIZnet-IoTShield-AMM592-SMS example
Diff: main.cpp
- 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; +} + +