반응형
임베디드 환경에서 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;
}
반응형