您的位置:首页 > 其它

PDU 实现发送短信源程序

2010-04-12 17:44 281 查看
//发送短信
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include<termios.h>
#include<string.h>
#include<iconv.h>

int init_device(int portfd);
int build_pdu(const char * phone,const unsigned char * msg,unsigned char * pdu);
int code_convert(const char * srccode,const char * dstcode,const unsigned char * inbuf,unsigned char * outbuf);

int main()
{
int portfd,n,len;
char cmd[255],msg[255],pdu[255];
char ctrlz=26;
portfd=open("/dev/ttyS1",O_RDWR);
init_device(portfd);
sprintf(cmd,"AT+CMGF=0/r");
sleep(1);
write(portfd,cmd,strlen(cmd));
sleep(1);
len=build_pdu("8613824798167","黄林武",pdu);
sprintf(cmd,"AT+CMGS= %d/r",len);
write(portfd,cmd,strlen(cmd));
sleep(1);
write (portfd,pdu,strlen(pdu));
write (portfd,&ctrlz,1);
sleep(1);
close(portfd);
}

int init_device(int portfd)
{
struct termios tty;
tcgetattr(portfd,&tty);
cfsetospeed(&tty,B115200);
cfsetospeed(&tty,B115200);
tty.c_cflag&=~CSIZE;
tty.c_cflag|= CS8;
tty.c_lflag&=~(ICANON | ECHO | ECHOE);
tty.c_cflag|= CREAD;
tty.c_cflag&=~(PARENB | CSTOPB);
tty.c_iflag|=IXON;
tty.c_iflag|=IXOFF;
tty.c_iflag|=IXANY;
tty.c_cflag&=~CRTSCTS;
tty.c_cc[VMIN] = 0;
tty.c_cc[VTIME] = 10;
tcsetattr(portfd,TCSANOW,&tty);
return 0;
}

int build_pdu(const char * phone,const unsigned char * msg,unsigned char * pdu)
{
unsigned char pdu_phone[128],temp_phone[128],buf[255],pdu_msg[255];
int i,n;
sprintf(pdu,"001100");
sprintf(temp_phone,"%sF",phone);
for(i=0;i<strlen(temp_phone);i+=2)
{
pdu_phone[i]=temp_phone[i+1];
pdu_phone[i+1]=temp_phone[i];
}
strcat(pdu,"0D91");
strcat(pdu,pdu_phone);
strcat(pdu,"0010AA");
n=code_convert("UTF8","UNICODE",msg,buf)-2;
printf("n=%d,msg=%s/n",n,msg);
sprintf(pdu_msg,"%.2X",n);
strcat(pdu,pdu_msg);
for(i=0;i<n;i+=2)
{
sprintf(pdu_msg+i*2,"%.2X",buf[i+3]);
sprintf(pdu_msg+i*2+2,"%.2X",buf[i+2]);
}
strcat(pdu,pdu_msg);
printf("%s/n",(pdu));
return strlen(pdu)/2-1;
}

int code_convert(const char * srccode,const char * dstcode,const unsigned char * inbuf,unsigned char * outbuf)
{
int n=0;
unsigned int inbytesleft=strlen(inbuf);
unsigned int outbytesleft=255;
iconv_t cd_d = iconv_open(dstcode,srccode);
iconv(cd_d,(char **)&inbuf,&inbytesleft,(char **)&outbuf,&outbytesleft);
iconv_close(cd_d);
return 255-outbytesleft;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: