⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sms.h

📁 中文短信的编解码
💻 H
字号:

#ifndef _INC_SMS_H_
 #define _INC_SMS_H_

#include "include/types.h"
#include "include/at.h"

/* 短信设置选项 */
enum SMS_PDU_PARA {
	SMS_PDU_CPY	    =0,	/* 短信头拷贝 */
	SMS_PDU_SMSC	  ,	/* 服务中心号码 */
	SMS_PDU_OCTET     ,	/* 文件头字节 */
	SMS_PDU_MR	      ,	/* 信息类型 */
	SMS_PDU_DA	      ,	/* 发送目标地址 */
	SMS_PDU_PID	      ,	/* 协议标识 */
	SMS_PDU_DCS	      ,	/* 数据编码方案 */
	SMS_PDU_VP	      ,	/* 有效期 */
	SMS_NULL      	
};

/* 短信的对象信息结构 */
typedef	struct _SMS_Info {
	AT_MODEM * modem;			/* 模块指针 */
	int max_no;					/* 短信的最大序号 */
	int len_pdu;				/* 短信PDU长度 */
	int len_head;				/* 短信PDU头长度 */
	unsigned char pdu_buf[320];	/* 短信PDU头 */
} SMS_INFO;

/* 接收短信信息的结构 */
typedef	struct _SMS_RECV_DATA {
	unsigned char SMSC[16];		/* 服务中心号码 */
	unsigned char Octet;		/* 文件头字节 */
	unsigned char OA[16];		/* 发送地址 */
	unsigned char PID;			/* 协议标识 */
	unsigned char DCS;			/* 数据编码方案 */
	unsigned char SCTS[21];		/* 服务中心时间戳 */
	unsigned char UDL;			/* 用户数据长度 */
	unsigned char UD[140];		/* 用户数据长度 */
} SMS_RECV_DATA;


/*
 *	短信的对象信息结构的初始化函数
 *	输入与短信modem连接通信的端口描述符fd_com,
 *	初始化modem后,进行一些at设置,
 *	返回短信的对象信息结构指针,NULL失败
*/
extern SMS_INFO * SMS_Init(int fd_com);

/*
 *	短信接收函数
 *	输入短信对象指针和短信接收结构指针,和短信起始标号
 *	从短信起始标号开始尝试读取短信,成功后把结果存入短信接收结构中
 *	返回OK,ERRPR(到短信的最大序号都没有读取短信成功)
*/
extern int SMS_Recv(SMS_INFO * sms, SMS_RECV_DATA * msg, int index);

/*
 *	短信的对象销毁函数
 *	输入短信对象指针,释放相关内存
 *	返回OK
*/
extern int SMS_Exit(SMS_INFO * sms);

/*
 *	短信参数设置函数
 *	输入短信对象指针和短信参数关键字,设置字符串指针
 *	返回OK,ERRPR
*/
extern int SMS_pdu_ctl(SMS_INFO * sm, int pdu_key, char * para);

/*
 *	检测modem内短信数目函数
 *	输入短信对象指针
 *	返回短信数目
*/
extern int SMS_check_recv(SMS_INFO * sm);

/*
 *	完成十六进制字符串二转一
 *	输入转换源和存指针
 *	返回转换后的长度
*/
extern int strHexTowforOne(unsigned char * scr, unsigned char * dst);

/*
 *	发送中文短信函数函数
 *	输入短信对象指针和目标地址指针,短信内容指针
 *	返回OK,ERRPR
*/
extern int SMS_Send_gb2312(SMS_INFO * sms, char * da, char * s_gb);

/*
 *	发送英文短信函数函数
 *	输入短信对象指针和目标地址指针,短信内容指针
 *	返回OK,ERRPR
*/
extern int SMS_Send_text(SMS_INFO * sms, char * da, char * text);

/*
 *	发送字节数据流短信函数函数
 *	输入短信对象指针和目标地址指针,短信内容指针
 *	返回OK,ERRPR
*/
extern int SMS_Send_data(SMS_INFO * sms, char * da, char * src, int len);

#if 0
/* 以下用于测试,也可作调用相关函数参考 */
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <termio.h>
#include <fcntl.h>
#include <linux/ipc.h>
#include <errno.h>

#include "include/sms.h"

static SMS_INFO * m_wavecom = NULL;

int sms_open_uart(void)
{
	int fd;
	struct termio 	New_Term_IO;

	if(0 > (fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NONBLOCK)))
	{
		printf("dbg_Open_UART: ERROR, errno %08x\r\n", errno);
		return fd;
	}

#if 1
	ioctl(fd, TCGETA, &New_Term_IO);

	//newtio.c_cflag = B115200 | CS8 | CREAD|HUPCL|CLOCAL;// | CLOCAL		
	//New_Term_IO.c_cflag 		=  B115200 | CRTSCTS | CS8 | CREAD;
	New_Term_IO.c_cflag 		=  B115200 | CS8 | CREAD;
	New_Term_IO.c_iflag 		= 1;
	New_Term_IO.c_oflag 		= 0;
	New_Term_IO.c_lflag 		= 0;
	New_Term_IO.c_cc[VMIN]		= 1;
	New_Term_IO.c_cc[VTIME]		= 0;

	ioctl(fd, TCSETAF, &New_Term_IO);
#endif
	return fd;
}

int main(int argc, char ** argv)
{
	int fd;
	
	sg_dbg("sms: Entry! para-%d\n",argc);
	fd = sms_open_uart();
	if(0 > fd)
	{
		return ERROR;
	}
	m_wavecom = SMS_Init(fd);
	if(m_wavecom == NULL)
	{
		return ERROR;
	}
	sg_dbg("modem OK!\n");
	while(1)
	{
		char s[1024];

		printf("\n/** SMS MENU **/\n");		
		printf("AT command for modem\n");		
		printf("P--set sms Para->\n");		
		printf("S--Send sms->\n");		
		printf("R.XX--Read sms(XX:index)\n");		
		printf("X--eXit sms entry\n>");
		scanf("%s",s);
		switch(s[0])
		{
		case 'a':
		case 'A':
			{
				AT_CMD 	at_send = {
					3,100000,NULL,(ATR_OK)
				};
				int len;
				
				at_send.at_str = &s[0];
				len = strlen(s);
				s[len++] = 0x0D;
				s[len] = 0;
				at_set(m_wavecom->modem,&at_send);
			}
			break;
		case 'P':
			{
				printf("\n/** SET SMS PARA **/\n");
				printf("X.XX   string for set(X:0-9,A-F)\n");
				printf("0.copy 1.SMSC 2.Octet 3.MR 4.DA 5.PID 6.DCS 7.VP\n>");
				scanf("%s",s);
				if((s[0]>='0') && (s[0]<='7'))
				{
					int key;

					key = (int)s[0]&0x0f;
					SMS_pdu_ctl(m_wavecom,(s[0]-'0'),&s[2]);
				}
			}
			break;
		case 'S':
			{
				int retval;
				
				retval = ERROR;
				printf("\n/** SEND SMS **/\n");
				printf("X.string   string for set(X:0-2)\n");
				printf("0.english 1.bytes 2.bg2312\n>");
				scanf("%s",s);
				if(s[0]=='0')
				{
					retval = SMS_Send_text(m_wavecom,NULL,&s[2]);
				}
				else if(s[0]=='1')
				{
					retval = SMS_Send_data(m_wavecom,NULL,&s[2],strlen(&s[2]));
				}
				else if(s[0]=='2')
				{
					retval = SMS_Send_gb2312(m_wavecom,NULL,&s[2]);
				}
				if(OK == retval)
				{
					printf("Send sms OK!");
				}
				else
				{
					printf("Send sms ERROR!");
				}
			}
			break;
		case 'R':
			if(SMS_check_recv(m_wavecom))
			{
				SMS_RECV_DATA msg;
				int len;
				
				len = atoi(&s[2]);
				if(OK == SMS_Recv(m_wavecom,&msg,len))
				{
					printf("\nget sms content:");
					printf("\nSMSC:");
					fwrite(msg.SMSC,strlen(msg.SMSC),1,stdout);
					printf("\nOA:");
					fwrite(msg.OA,strlen(msg.OA),1,stdout);
					printf("\nSCTS:");
					fwrite(msg.SCTS,strlen(msg.SCTS),1,stdout);
					printf("\nUD:");
					fwrite(msg.UD,msg.UDL,1,stdout);
				}
			}
			else
			{
				printf("\nno sms!\n");
			}
			break;
		case 'X':
			return OK;
		default:
			break;
		}
	}
	
	SMS_Exit(m_wavecom);
	return OK;
}
#endif

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -