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