중국시가넷 - 공익 문자 - AT 명령을 사용하여 문자 메시지를 보내는 방법

AT 명령을 사용하여 문자 메시지를 보내는 방법

# include & ltstdio.h & gt

# 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;

}