當前位置:名人名言大全網 - 短信平臺 - 如何用AT命令發送短信

如何用AT命令發送短信

#include<stdio.h>

#include<stdlib.h>

#include<unistd.h>

#include<sys/types.h>

#include<sys/stat.h>

#include<fcntl.h>

#include<termios.h>

#include<errno.h>

#include<iconv.h>?//編碼轉換

#define?STTY_DEV?"/dev/ttyS0"

#define?BUFF_SIZE?512

#define?MSG_SIZE?140//壹條短信的容量

char?phone[20]="+8613476090094";//定義短信發送的目標手機號碼

char?sms_number[20]="+8613800200500";//定義短消息服務中心號碼

char?sms_gb2312[MSG_SIZE]="Best?Regards!";?//定義短消息內容

char?sms_utf8[MSG_SIZE];

char?*sms_in=sms_gb2312;//要把輸入的gb2312編碼轉換成unicode編碼

char?*sms_out=sms_utf8;

int?gb2312_len,?utf8_len;

int?SetOption(int?fd);?//設置串口通信的參數

void?TransPhone();?//轉換手機號碼格式

void?TransSmsc();//轉換SMSC號碼

int?TransMsg();?//轉換短信消息內容

int?main()

{

int?stty_fd,n;

char?buffer[BUFF_SIZE];

//打開串口

stty_fd=open(STTY_DEV,O_RDWR);

if(-1==stty_fd){

perror("open?device");

return?0;

}

printf("Open?device?success!\n");

//設置串口參數

if(0!=SetOption(stty_fd)){

close(stty_fd);

return?0;

}

printf("Set?Serial?option?success!\n");

TransPhone();

TransSmsc();

if(1!=TransMsg()){

perror("Convert?ShortMsg");

close(stty_fd);

return?0;

}

printf("Message?convert?success!\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模式,返回向串口返回“OK"

if(n<=0){

perror("set?pdu?mode");

close(stty_fd);

return?0;

}

if(0!=strncmp(buffer,"OK",2)){

perror("set?pdu?mode");

close(stty_fd);

return?0;

}

//發送消息

sprintf(buffer,"AT+CMGS=%d\n",utf8_len);//寫入發送消息命令

write(stty_fd,buffer,strlen(buffer));

write(stty_fd,sms_utf8,utf8_len);//寫入消息內容

printf("Send?message?OK!\n");

close(stty_fd);

}

int?SetOption(int?fd)

{

struct?termios?opt;

//獲取當前串口配置

tcgetattr(fd,&opt);

tcflush(fd,TCIOFLUSH);

//設置波特率

cfsetispeed(&opt,B19200);

cfsetospeed(&opt,B19200);

//設置數據位--8位數據位

opt.c_cflag?&=?~CSIZE;

opt.c_cflag?|=?CS8;

//設置奇偶位--無奇偶校驗

opt.c_cflag?&=?~PARENB;

opt.c_iflag?&=?~INPCK;

//設置停止位--1位停止位

opt.c_cflag?&=?~CSTOPB;

//設置超時時間--15秒

opt.c_cc[VTIME]=150;

opt.c_cc[VMIN]=0;

//設置寫入設備

if(0!=tcsetattr(fd,TCSANOW,&opt)){

perror("set?baudrate");

return?-1;

}

tcflush(fd,TCIOFLUSH);

return?0;

}

void?TransPhone()

{

int?i,str_len,tmp;

if(phone[0]='+'){//去掉號碼開頭的‘+’

for(i=0;i<strlen(phone)-1;i++)//strlen函數得到的是字符數組的真實長度,不包括後面的'\0'

phone[i]=phone[i+1];

phone[i]='\0';

}

str_len=strlen(phone);?//如果號碼(不包括‘+’)是奇數,在最後加'F'

if((strlen(phone)%2)!=0){

phone[str_len]='F';

phone[str_len+1]='\0';

}

for(i=0;i<strlen(phone);i+=2){//把號碼的奇偶位掉換

tmp=phone[i];

phone[i]=phone[i+1];

phone[i+1]=tmp;

}

}

void?TransSmsc()

{

int?i,str_len,tmp;

TransPhone(sms_number);

str_len=strlen(sms_number);?//所有字符向後移動兩個字節

for(i=strlen(sms_number)+2;i!=0;i--)

sms_number[i]=sms_number[i-2];

sms_number[str_len+3]='\0';

strncpy(sms_number,"91",2);?//開頭寫入字符“91”

tmp=strlen(sms_number)/2;

str_len=strlen(sms_number);?//所有字符向後移動兩個字節

for(i=strlen(sms_number)+2;i!=0;i--)

sms_number[i]=sms_number[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("create?iconv?handle!");

return?0;

}

gb2312_len=strlen(sms_gb2312);

utf8_len=MSG_SIZE;

if(-1==iconv(cd,&sms_in,&gb2312_len,&sms_out,&utf8_len)){

perror("convert?code");

return?0;

}

iconv_close(cd);

return?1;

}