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.
Revision 1:bdb1c9f07d06, committed 2019-03-20
- Comitter:
- hkjung
- Date:
- Wed Mar 20 05:36:45 2019 +0000
- Parent:
- 0:5cd6077e0a8e
- Commit message:
- Initial Release
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- 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;
+}
+
+