贡献一段 GSM 发送汉字短信的 完整代码 其中包括了汉字转Unicode码转换函数

这段代码时很久之前写的 今天发出来 时回想当时的情景 非常的好玩,尤其在汉字转换为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;
}


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值