2016년 5월 30일 월요일

아두이노 3G 모듈 (Particle Electron) - SMS 받기

SMS 도 잘 보내지는데, '그럼 받을때는 어떻게 받지?' 라는 의문이 들었다. 역시나 궁금하면 community 로 가서 검색을 해야 한다.

커뮤니티에서 찾은 아래 예제는 문자가 들어오면 발신자가 누구인지 찍어 주는 코드이다.
이것을 응용하면 원하는 시나리오를 만들 수 있다.
#define TIMEOUT                     10000
#define CMD_NONE                    0
#define CMD_DELETE_ALL              1
#define LED_PIN                     D7
// Replace with a phone number, the application will only process
// the SMS received from this number
#define AUTHORIZED_PHONE_NUMBNER    "8210xxxxxxxx"
void riInterrupt(void);
int state = LOW;
bool isCallRecognized = false;
char szReturn[32] = "";
int maxIndex = 1;
int ledState = LOW;
int command = CMD_NONE;
int phoneCallback(int type, const char* buf, int len, char* param){
    Serial.print("Phone Callback: ");
   
    if(strncmp(&buf[2], "+CMGR:", 6) == 0){
        Serial.write((const uint8_t*)&buf[2], len - 2);
        Serial.println();
       
        char szState[32];
        char szPhoneNumber[18];
        sscanf(&buf[9], "%[^/','],%[^/','],%s", szState, szPhoneNumber);
       
        maxIndex++;
       
        strcpy(szPhoneNumber, &szPhoneNumber[1]);      
        szPhoneNumber[strlen(szPhoneNumber) - 1] = 0;
       
        if(strcmp(AUTHORIZED_PHONE_NUMBNER, szPhoneNumber) == 0){
            Serial.println("SMS detected");
           
            isCallRecognized = true;  
        }
       
        Serial.print("Phone Number ");
        Serial.print(szPhoneNumber);
        Serial.print(", ");
        Serial.print(szState);
        Serial.println();
    }
    else if(strncmp(&buf[2], "+CPMS:", 6) == 0){
        char szData[13];
       
        Serial.write((const uint8_t*)&buf[2], len - 2);
        Serial.println();
        sscanf(&buf[9], "%[^/','], %d", szData, &maxIndex);
       
        maxIndex++;
        Serial.print("Current Index ");
        Serial.print(maxIndex);
        Serial.print(", ");
        Serial.print(szData);
        Serial.println();
    }
    else{
        Serial.write((const uint8_t*)buf, len - 2);
        Serial.println();
       
        if(isCallRecognized){
            isCallRecognized = false;
           
            if(strncmpi(buf, "deleteall", 9) == 0){
                Serial.println("Delete all command received.");
               
                command = CMD_DELETE_ALL;
            }
            else{
                char szPin[3];
                char szState[5];
               
                sscanf(buf, "%[^/'=']=%s", szPin, szState);
               
                Serial.println();
                Serial.print(szPin);
                Serial.print("=");
                Serial.print(szState);
                Serial.println();
               
                if(strcmpi(szPin, "D7") == 0){
                    if(strcmpi(szState, "HIGH") == 0){
                        ledState = HIGH;
                    }
                    else if(strcmpi(szState, "LOW") == 0){
                        ledState = LOW;
                    }
                }
            }
        }
    }
   
    state = LOW;
   
    return WAIT;
}
void setup(){
    Serial.begin(115200);
   
    pinMode(LED_PIN, OUTPUT);
    pinMode(RI_UC, INPUT_PULLUP);
   
    attachInterrupt(RI_UC, riInterrupt, CHANGE);
   
    Cellular.command(phoneCallback, szReturn, TIMEOUT, "AT+CMGF=1\r\n");
    Cellular.command(phoneCallback, szReturn, TIMEOUT, "AT+CPMS?\r\n");
}
void loop(){
    digitalWrite(LED_PIN, ledState);
   
    if(CMD_DELETE_ALL == command){
        Cellular.command(phoneCallback, szReturn, TIMEOUT, "AT+CMGD=1,4\r\n");
        command = CMD_NONE;
    }
    else if(state == HIGH){
        char szCommand[32];
       
        sprintf(szCommand, "AT+CMGR=%d\r\n", maxIndex);
       
        Serial.println();
        Serial.print("Sending command: ");
        Serial.print(szCommand);
        Serial.println();
       
        Cellular.command(phoneCallback, szReturn, TIMEOUT, szCommand);
    }
}
void riInterrupt(){
    state = digitalRead(RI_UC);
}

댓글 없음: