중국시가넷 - 공익 문자 - AT 명령을 사용하여 문자 메시지를 보내는 방법
AT 명령을 사용하여 문자 메시지를 보내는 방법
# include & ltstdlib.h & gt
# include & ltunistd.h & gt
# include & ltsys/types.h >
# include & ltsys/stat.h >
# include & ltfcntl.h & gt
# include & lttermios.h & gt
# include & lt 오류 번호>
# include & lticonv.h & gt? //코드 변환
# 정의? STTY_DEV? "/dev/ttyS0"
# 정의? BUFF_SIZE? 5 12
# 정의? MSG_SIZE? 140// 단문 메시지 용량
샤일? 전화 [20] = "+8613476090094"; //문자 메시지를 보낼 대상 휴대폰 번호를 정의합니다.
샤일? Sms _ number [20] = "+8613800200500"; //단문 메시지 서비스 센터 수를 정의합니다.
샤일? Sms_gb23 12[MSG_SIZE]= "최고? 인사! \ "; -응? //문자 메시지의 내용 정의
샤일? Sms _ utf8 [msg _ size];
샤일? * SMS _ in = SMS _ gb2312; //입력된 gb23 12 코드를 유니코드 코드로 변환합니다.
샤일? * SMS _ out = SMS _ utf8
Int? Gb23 12_len,? Utf8 _ len
Int? SetOption(int? Fd); -응? //직렬 통신을 위한 매개변수 설정
무효화? Transphone (); -응? //휴대폰 번호 형식 변환
무효화? Transmsc (); //SMSC 번호 변환
Int? Transmsg (); -응? //문자 메시지 내용 변환
Int? 주 ()
{
Int? Stty_fd, n;
샤일? Buffer [buff _ size];
//직렬 포트 열기
Stty_fd=open(STTY_DEV, o _ rdwr);
If(- 1==stty_fd){
퍼러 ("켬?" ? 장비);
반환? 0;
}
Printf ("열림? 장비? 성공! \ n ");
//직렬 포트 매개변수 설정
만약 (0! =SetOption(stty_fd)){
닫기 (stty _ FD);
반환? 0;
}
Printf("Set? 연쇄? 옵션? 성공! \ n ");
Transphone ();
Transmsc ();
만약 (1! =TransMsg()){
퍼러 ("개종?" Short msg ");
닫기 (stty _ FD);
반환? 0;
}
Printf ("메시지? 개종? 성공! \ n ");
//PDU 모드를 설정합니다.
Strcpy(buffer, "at+cmgf = 0 \ n"); //0 은 PDU 모드, 1 은 텍스트 모드를 나타냅니다.
Write(stty_fd, buffer, strlen(buffer));); //쓰기 구성 명령
N=read(stty_fd, buffer, buff _ size); //직렬 포트에 AT+CMGF=0 을 쓴 후 시스템이 PDU 모드를 지원하는 경우 return 은 직렬 포트에' OK' 를 반환합니다.
(n & lt=0){
Perror ("세트"? Pdu? 모드);
닫기 (stty _ FD);
반환? 0;
}
만약 (0! =strncmp(buffer, "OK", 2)){
Perror ("세트"? Pdu? 모드);
닫기 (stty _ FD);
반환? 0;
}
//메시지 보내기
스프린트 (buffer, "AT+CMGS=%d\n", utf8 _ len); //메시지 보내기 명령 작성
Write(stty_fd, buffer, strlen(buffer)););
Write(stty_fd, sms_utf8, utf8 _ len); //메시지 내용 쓰기
Printf ("전송"? 메시지? 좋아! \ n ");
닫기 (stty _ FD);
}
Int? SetOption(int? Fd) 를 참조하십시오
{
Struct? Termios? Opt
//현재 직렬 포트 구성 가져오기
Tcgetattr(FD & amp;; Opt);
Tcflush(fd, tcioflush) :
//전송 속도 설정
Cfsetispeed(& amp;; Opt, b19200);
Cfsetospeed(& amp;; Opt, b19200);
//데이터 비트 설정-데이터 비트 8 개
Opt.c_cflag? & amp=? ~ CSIZE
Opt.c_cflag? | =? CS8;;
//패리티 비트 설정-패리티 없음.
Opt.c_cflag? & amp=? ~ PARENB
Opt.c_iflag? & amp=? ~ INPCK
//정지 비트 설정-1 정지 비트
Opt.c_cflag? & amp=? ~ CSTOPB
//설정 제한 시간-15 초
Opt.c _ cc [vtime] =150;
Opt.c _ cc [vmin] = 0;
//쓰기 장치 설정
만약 (0! =tcsetattr(fd, TCSANOW, & ampopt)){
Perror ("세트"? 포드라트);
반환? -1;
}
Tcflush(fd, tcioflush) :
반환? 0;
}
무효화? 송화기 ()
{
Int? I, str_len, tmp
If(phone[0]='+'){// 삭제 번호 시작 부분의'+'.
For(I = 0;; 나 & ltstrlen (전화)-1; I++)//strlen 함수는 문자 배열의 실제 길이를 가져옵니다. 뒤에 오는' \0' 은 포함되지 않습니다.
전화 [I]= 전화 [I+1];
Phone[I]=' \ 0 ';';
}
Str_len=strlen (전화); -응? //숫자 ('+'제외) 가 홀수인 경우 끝에' f' 를 추가합니다.
If((strlen(phone)%2)! =0){
Phone [str _ len] =' f';
Phone [str _ len+1] =' \ 0';
}
For(I = 0;; 나 & ltstrlen (전화); I+=2){// 교환 숫자의 홀수 및 짝수 자리.
Tmp = phone [I];
전화 [I]= 전화 [I+1];
전화 [I+1] = tmp;
}
}
무효화? TransSmsc ()
{
Int? I, str_len, tmp
Transphone (SMS _ number);
Str _ len = strlen (SMS _ number); -응? //모든 문자가 2 바이트 뒤로 이동합니다.
For (I = strlen (SMS _ number)+2; 나! =0; 나-)
문자번호 [I]= 문자번호 [I-2];
Sms _ number [str _ len+3] =' \ 0';
Strncpy(sms_number, "9 1", 2); -응? //는 "9 1" 으로 시작합니다.
Tmp = strlen (SMS _ number)/2;
Str _ len = strlen (SMS _ number); -응? //모든 문자가 2 바이트 뒤로 이동합니다.
For (I = strlen (SMS _ number)+2; 나! =0; 나-)
문자번호 [I]= 문자번호 [I-2];
Sms _ number [str _ len+3] =' \ 0';
Sms _ number [0] = (char) (tmp/10)+0x30; -응? //문자열 길이 값을 플라스틱에서 문자로 변환하고 문자 문자열의 시작 부분에 씁니다.
Sms _ number [1] = (char) (tmp%10)+0x30;
}
Int? TransMsg ()
{
Iconv_t? Cd=iconv_open("utf-8 ","gb2312 "); //유형 변환 설정 gb2312 = = > Utf-8
If(0==cd){
Perror ("생성? Iconv? 손잡이! );
반환? 0;
}
Gb2312 _ len = strlen (SMS _ gb2312);
Utf8 _ len = MSG _ SIZE
If(- 1==iconv(cd,& 문자 입력 & ampgb2312 _ len & SMS _ out & amp;; Utf8_len)){
퍼러 ("개종?" 코드);
반환? 0;
}
Iconv _ close (CD);
반환? 1;
}