这段代码时很久之前写的 今天发出来 时回想当时的情景 非常的好玩,尤其在汉字转换为Unicode码的时候 好好玩
/*
* mess.c
*
* Created on: 2013-3-5
* Author: root
*/
#include <termios.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <iostream>
#include<cstring>
using namespace std;
/*****************************汉字内容转换***********************************************/
const int MAXN=5;
char num[MAXN];
char digit[16]={ '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };
int k;
void toHex( int n )
{
if( !n ) return;
num[k--]=digit[n%16];
toHex( n/16 );
}
/*******************************短信内容******************************************************/
struct message_info{
char cnnu[16];
char phnu[16];
char message[256];//128
};
/********************************号码的翻转************************************************/
struct pdu_info {
char cnswap[32];
char phswap[32];
};
/********************************串口初始化******************************************************/
void serial_init(int fd)
{
struct termios options;
tcgetattr(fd, &options);
options.c_cflag |= ( CLOCAL | CREAD );
options.c_cflag &= ~CSIZE;
options.c_cflag &= ~CRTSCTS;
options.c_cflag |= CS8;
options.c_cflag &= ~CSTOPB;
options.c_iflag |= IGNPAR;
options.c_oflag = 0;
options.c_lflag = 0;
cfsetispeed(&options, B9600);
cfsetospeed(&options, B9600);
tcsetattr(fd,TCSANOW,&options);
}
/****************************翻转函数****************************************************/
void swap(char number[],char swap[])
{
char ch1[] = "86";
char tmp[16];
int i;
memset(swap,0,32);
memset(tmp,0,16);
strcpy(swap,number);
strcat(swap,"f");
strcat(ch1,swap);
strcpy(swap,ch1);
for(i = 0;i <= int(strlen(swap)) - 1;i += 2){
tmp[i + 1] = swap[i];
tmp[i] = swap[i + 1];
}
strcpy(swap,tmp);
}
/******************************短信推送专用函数********************************/
int send(int fd,char *cmgf,char *cmgs,char *message)
{
int nread,nwrite;
char buff[128];
char reply[128];
memset(buff,0,sizeof(buff));
strcpy(buff,"at\r");
nwrite = write(fd,buff,strlen(buff));
printf("nwrite=%d,%s\n",nwrite,buff);
memset(reply,0,sizeof(reply));
sleep(1);
nread = read(fd,reply,sizeof(reply));
printf("nread=%d,%s\n",nread,reply);
memset(buff,0,sizeof(buff));
strcpy(buff,"AT+CMGF=");
strcat(buff,cmgf);
strcat(buff,"\r");
nwrite = write(fd,buff,strlen(buff));
printf("nwrite=%d,%s\n",nwrite,buff);
memset(reply,0,sizeof(reply));
sleep(1);
nread = read(fd,reply,sizeof(reply));
printf("nread=%d,%s\n",nread,reply);
memset(buff,0,sizeof(buff));
strcpy(buff,"AT+CMGS=");
strcat(buff,cmgs);
strcat(buff,"\r");
nwrite = write(fd,buff,strlen(buff));
printf("nwrite=%d,%s\n",nwrite,buff);
memset(reply,0,sizeof(reply));
sleep(1);
nread = read(fd,reply,sizeof(reply));
printf("nread=%d,%s\n",nread,reply);
memset(buff,0,sizeof(buff));
strcpy(buff,message);
nwrite = write(fd,buff,strlen(buff));
printf("nwrite=%d,%s\n",nwrite,buff);
memset(reply,0,sizeof(reply));
sleep(1);
nread = read(fd,reply,sizeof(reply));
printf("nread=%d,%s\n",nread,reply);
return 0;
}
/***********************英文短信的发送*************************************/
int send_en_message(int fd,char phonenum[],struct message_info info,char MESSAGE[])
{
getchar();
char cmgf[] = "1";
char HM='"'; ///重要 要在号码的两边加上冒号
char cmgs[16] = {'\0'};
strcpy(info.phnu,phonenum);//短信发送的目的号码
strcpy(info.message,MESSAGE);
strcat(info.message,"\x1a");
cmgs[0]=HM;
strcat(cmgs,info.phnu);
cmgs[12]=HM;
send(fd,cmgf,cmgs,info.message);
return 0;
}
/************************************中文短信的推送*********************************/
int send_zh_message(int fd,char phonenum[],struct message_info info,wchar_t *a[])
{
//wchar_t *a[20]= {L"我",L"爱",L"你",L"你",L"好"};
//char phonenum[]="13518159011";//
char phonecenter[]="13800280500";//短信中心号码 成都移动 动感地带
char cmgf[] = "0";//这个时设置PDU 格式
char cmgs[4] = {'\0'};
char ch2[] = "0891";
char ch3[] = "1100";
char ch4[] = "000800";//0008:表示8bit 的方式 , 00:表示允许时间
char ch5[] = "0d91"; //目标号码长度和国际码
char final[256];
int len;
struct pdu_info pdu;//电话号码的翻转
memset(final,0,80);
strcpy(info.cnnu,phonecenter);//短信中心号码
strcpy(info.phnu,phonenum);//短信发送的目的号码
swap(info.phnu,pdu.phswap);
swap(info.cnnu,pdu.cnswap);
strcpy(final,ch2);
strcat(final,pdu.cnswap);
strcat(final,ch3);
strcat(final,ch5);
strcat(final,pdu.phswap);
strcat(final,ch4);
/*************************加入短信内容*************************************/
unsigned int n;
int i=0;
int M=0;
int ME=0;//这个代表短信字段的长度,包括汉字译码后的长度 和 短信内容头部的字节数目
/************************计算短信的长度************************************/
while(a[i]!='\0')
{
M++;i++;
}
ME=M*4+2;//这个表示短信字节的长度,一个汉字译码之后变成四个字节的字符数目,再加上 短信的头部的两个字节的汉字书目
M=2*M;//短信内容的头 表示字符的占用的字节数目,比如 两个汉字 就是4个字节 变为十六进制 04
memset( num,'0',sizeof(num) );
k=2;
num[k]='\0';
k=k-1;
toHex(M);
strcat(final,num);
i=0;//将i值复回
/*****************************汉字译码******************************************/
while(a[i]!='\0') //转换短信内容为unicode码
{
wstring strTemp(a[i++]);
n=(unsigned int)strTemp[0];
memset( num,'0',sizeof(num) );
k=MAXN-1;
num[k]='\0';
k=k-1;
toHex(n);
strcat(final,num);
}
/*******************************************************************************/
strcat(final,"\x1a");
len = strlen(ch3)+ strlen(ch4)+ strlen(ch5)+strlen(pdu.phswap)+ME;
puts(final);
sprintf(cmgs,"%d",len/2);
puts(final);
send(fd,cmgf,cmgs,final);
return 0;
}
/**********************************打电话**************************************/
int send_GSM_GPRS_cmd(int fd, char *send_buf)
{
ssize_t ret;
ret = write(fd,send_buf,strlen(send_buf));
if (ret == -1)
{
perror("write");
return -1;
}
return 1;
}
void Make_Call(int fd,char CALL_NUM[])
{
char call_num[20]="ATD";
char call_f[]= ";\r";
strcat(call_num,CALL_NUM);
strcat(call_num,call_f);
char send_cmd_VTS[]="AT+VTS=1\r";
send_GSM_GPRS_cmd(fd,call_num);
send_GSM_GPRS_cmd(fd,send_cmd_VTS);
}
/***************************主函数******************************************************/
int main()
{
int fd;
char choice;
struct message_info info;
/*************短信发送目的号码,和中文短信内容 英文内容**************************************/
char phonenum[]="13518159011";//13518159011"13618042653";//目的号码
wchar_t *ch_message[20]= {L"我",L"爱",L"你",L"你",L"好"};
char en_message[]="ABCDEFRDDDDE";
/*****************************串口打开和初始化*********************************************/
fd = open( "/dev/ttyUSB0", O_RDWR|O_NOCTTY|O_NDELAY);
if (-1 == fd){
perror("Can't Open Serial Port");
}
serial_init(fd);
//Make_Call(fd,phonenum);
/****************************************************************************************/
printf("1.send english message.\n");
printf("2.send chinese message.\n");
printf("3.make a call.\n");
printf("4.exit.\n");
choice = getchar();
switch(choice)
{
case '1': send_en_message(fd,phonenum,info,en_message);
break;
case '2': send_zh_message(fd,phonenum,info,ch_message);
break;
case '3':Make_Call(fd,phonenum);
break;
case '4': break;
default : break;
}
/******************************************************************************/
close(fd);
return 0;
}