📄 sms.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 + -