SW 개발

[C] at 커맨드로 sms 보내기 (예제코드)

. . . 2020. 12. 18. 10:25
반응형

임베디드 환경에서 at cmd 로 sms 를 보내는 예제이다. 직접작성해서 사용중인 코드

cmgs 커맨드를 통해서 sms를 보내는예제코드이다.

예제코드

예제코드...

#define AT_DEV_FILE "/dev/smd17"
// #define AT_DEV_FILE "/dev/tty18"

int send_sms_cmgs(const char* dest_num, const char* msg, const int retry_cnt) 
{
  int ret = -1;
  int fd = 0;

  int write_cnt1 = 0;
  int write_cnt2 = 0;

  int write_buf[AT_MAX_BUFF_SIZE] = {0,};

  int write_cmd = 1;
  int retry = 0;

  char *p_ret_cmd = NULL;

  fd = open(AT_DEV_FILE, O_RDWR | O_NONBLOCK);

  if ( fd <= 0 )
    return -1;

  // 커맨드를 만든다.
  sprintf(write_buf, "AT+CMGS=%s\r\n", dest_num);
  write_cnt1 = at_strlen_with_cr(write_buf);

  // 커맨드를 보내기 시작.
  while(retry++ < retry_cnt)
  {
    // 1. 커맨드를 보낸다.
    if ( write_cmd )
      write_cnt2 == write(fd, write_buf, write_cnt1);

    if ( write_cnt2 != write_cnt1 )
      continue;

    // 2. 커맨드 리턴될때 까지 기다림.
    memset(buffer, 0, sizeof(buffer));
    if(_wait_read(fd, buffer, AT_MAX_BUFF_SIZE, AT_MAX_WAIT_READ_SEC) < 0)
      continue;

    // 3. 리턴된 커맨드를 체크한다. CMGS 명령어는 ">" 가 리턴된다.
    p_ret_cmd = strstr(buffer, ">");
    if (p_ret_cmd == NULL)
    {
      // 만약, echo 로 보낸 커맨드가 다시 나오면 커맨드를 쓰지 않고, 다시 기다림.
      if ( strstr(buffer,cmd) != NULL)
      write_cmd = 0;
      continue;
    }

    // 여기까지 왔으면 정상적으로 응답까지 찾았다.
    // sms 를 보낸다.
    sprintf(write_buf, "%s%c", dest_num, CTRL(z));
    break;
  }

  close(fd);
  return ret;
}
반응형