📄 sms.h
字号:
//const prog_uchar cshcg[]={"初始化成功"};
//const prog_uchar cshsb[]={"初始化失败"};
//const prog_uchar xdhhmcg[]={"写电话号码成功"};
//const prog_uchar xdhhmsb[]={"写电话号码失败"};
//const prog_uchar send_error[]={"发送错误"};
//const prog_uchar unknow[]={"未知错误"};
//const prog_uchar qqfs[]={"请求发送"};
//const prog_uchar sdzqdx[]={"收到正确短信"};
//const prog_uchar sdljdx[]={"收到垃圾短信"};
//const prog_uchar nyxddxx[]={"你有新的短消息"};
const prog_uchar shouwei_mima[]={"1234"};
const prog_uchar botelv[]={"botelv"};
const prog_uchar zhujihaoma[]={"zhujihaoma"};
const prog_uchar duanxinzhongxin[]={"duanxinzhongxin"};
const prog_uchar ATZ_r[]={"ATZ\r"};
const prog_uchar ATE0_r[]={"ATE0\r"};
const prog_uchar AT_CMGF_0_r[]={"AT+CMGF=0\r"};
const prog_uchar AT_CMEE_1_r[]={"AT+CMEE=1\r"};
const prog_uchar AT_CPBS_SM_r[]={"AT+CPBS=\"SM\"\r"};
const prog_uchar ATV0_r[]={"ATV0\r"};
const prog_uchar AT_CPBW[]={"AT+CPBW="};
const prog_uchar d_y[]={",\""};
const prog_uchar y_d_129_d_y[]={"\",129,\""};
const prog_uchar y_r[]={"\"\r"};
const prog_uchar AT_CPBR[]={"AT+CPBR="};
const prog_uchar _r[]={"\r"};
const prog_uchar AT_CMGD[]={"AT+CMGD="};
const prog_uchar AT_CMGS[]={"AT+CMGS="};
const prog_uchar AT_CMGL_r[]={"AT+CMGL=4\r"};
#define mima_weishu 4 //密码长度
#define phone_number_weishu 13 //电话号码长度
#define baud_rate_weishu 4//波特率设置的长度
char mima[6] __attribute__((section(".eeprom")))={"123400"};//密码的EEPROM变量
char baud_rate[6] __attribute__((section(".eeprom")))={"9600"};//波特率的EEPROM变量
char phone_number[16] __attribute__((section(".eeprom")))={"8613930193305"};//回复的电话号码的EEPROM变量
char center_number[16] __attribute__((section(".eeprom")))={"8613800311500"};//短信中心号码
//15832126493
// 短消息参数结构,编码/解码共用
// 其中,字符串以0结尾
typedef struct {
char SCA[16]; // 短消息服务中心号码(SMSC地址)
char TPA[16]; // 目标号码或回复号码(TP-DA或TP-RA)
char TP_PID; // 用户信息协议标识(TP-PID)
char TP_DCS; // 用户信息编码方式(TP-DCS)
char TP_SCTS[16]; // 服务时间戳字符串(TP_SCTS), 接收时用到
char TP_UD[161]; // 原始用户信息(编码前或解码后的TP-UD)
char index; // 短消息序号,在读取时用到
} SM_PARAM;
// 电话号码参数结构,编码/解码共用
// 其中,字符串以0结尾
typedef struct {
char NUM[16]; // 电话号码
char NAME[16]; // 电话姓名
char index; // 电话号码序号
} SM_PHON;
/**************************************************************
功能:初始化GSM状态
参数:pData目标字符串指针
返回: 目标字符串长度
编写人:王志辉
时间:2007年8月7日
是否测试:是
****************************************************************/
uchar gsmInit(void)
{
char ans[32];//应答串
int nLength=0;
WriteCommRam(ATZ_r, 4);//恢复默认设置
nLength = ReadComm(ans);
if (nLength==0||strstr(ans, "OK")== NULL)//如果无返回信息或者返回信息中无OK则设置错误
return 0xff;//返回错误代码0xff
WriteCommRam(ATE0_r, 5);//不回显字符
nLength = ReadComm(ans);
if (nLength==0||strstr(ans, "OK")== NULL)
return 0xff;// ECHO OFF
WriteCommRam(AT_CMGF_0_r, 10);//设置PDU模式
nLength = ReadComm(ans);
if (nLength==0||strstr(ans, "OK")== NULL)
return 0xff;// ECHO OFF
WriteCommRam(AT_CMEE_1_r, 10);//设置错误返回格式
nLength = ReadComm(ans);
if (nLength==0||strstr(ans, "OK")== NULL)
return 0xff;// ECHO OFF
WriteCommRam(AT_CPBS_SM_r, 13);//电话号码选择
nLength = ReadComm(ans);
if (nLength==0||strstr(ans, "OK")== NULL)
return 0xff;// ECHO OFF
WriteCommRam(ATV0_r, 5);//设置DCF响应格式
nLength = ReadComm(ans);
if (nLength==0||strncmp(ans, "0\r",2)!=0)
return 0xff;// ECHO OFF
return 0;
}
/**************************************************************
功能:读取短消息 用+CMGL代替+CMGR,可一次性读出全部短消息
参数:pMsg: 短消息缓冲区,必须足够大
返回: 短消息条数
编写人:王志辉
时间:2007年8月7日
是否测试:是
****************************************************************/
int gsmReadMessage(SM_PARAM* pMsg)
{
int nLength; // 串口收到的数据长度
int nMsg; // 短消息计数值
char* ptr; // 内部用的数据指针
char cmd[16]={0}; // 命令串
//char ans[256]; // 应答串
nMsg = 0;
ptr = smsinput_buf;
strcpy_P(cmd,AT_CMGL_r);// 生成命令
WriteComm(cmd, strlen(cmd)); // 输出命令串
nLength = ReadCommd(); // 读应答数据
// 根据能否找到"+CMS ERROR"决定成功与否
if(nLength > 0 && strncmp(smsinput_buf, "+CMS ERROR",10) != 0)
{
// 循环读取每一条短消息, 以"+CMGL:"开头
while((ptr = strstr(ptr, "+CMGL:")) != NULL)
{
ptr += 6; // 跳过"+CMGL:"
sscanf(ptr, "%d", &pMsg->index); // 读取序号
//TRACE(" index=%d\n",pMsg->index);
ptr = strstr(ptr, "\r\n"); // 找下一行
ptr += 2; // 跳过"\r\n"
gsmDecodePdu(ptr, pMsg); // PDU串解码
pMsg++; // 准备读下一条短消息
nMsg++; // 短消息计数加1
}
}
smsinput_Length=0;//清零smsinput_Length
read_ustart1_ok=0;//清零read_ustart1_ok
return nMsg;
}
/**************************************************************
功能:发送短消息
参数:pMsg: 源PDU参数指针
返回: 发送是否成功
编写人:王志辉
时间:2007年8月7日
是否测试:是
****************************************************************/
uchar gsmSendMessage(SM_PARAM* pSrc)
{
int nPduLength;//PDU串长度
unsigned char nSmscLength; // SMSC串长度
int nLength; // 串口收到的数据长度
char cmd[16]; // 命令串
//char pdu[256]; // PDU串
char ans[32]; // 应答串
nPduLength = gsmEncodePdu(pSrc, smsinput_buf); // 根据PDU参数,编码PDU串
strcat(smsinput_buf, "\x01a"); // 以Ctrl-Z结束
gsmString2Bytes(smsinput_buf, &nSmscLength, 2); // 取PDU串中的SMSC信息长度
nSmscLength++; // 加上长度字节本身
// 命令中的长度,不包括SMSC信息长度,以数据字节计
strcpy_P(cmd,AT_CMGS);
sprintf(cmd+8, "%d",nPduLength / 2 - nSmscLength);//植入电话号码位置
strcat_P(cmd,_r);
WriteComm(cmd, strlen(cmd)); // 先输出命令串
nLength = ReadComm(ans); // 读应答数据
// 根据能否找到"\r\n> "决定成功与否
if(nLength==4&& strncmp(ans, "\r\n> ",4)==0)
{
gsmEncodePdu(pSrc, smsinput_buf);
strcat(smsinput_buf, "\x01a");
WriteComm(smsinput_buf, strlen(smsinput_buf)); // 得到肯定回答,继续输出PDU串
nLength = ReadComm(ans); // 读应答数据
// 根据能否找到"+CMS ERROR"决定成功与否
if(nLength > 0 && strncmp(ans,"+CMS ERROR",10) != 0)
{
return 0;
}
}
return 0xff;
}
// 删除短消息
// index: 短消息序号,从1开始
uchar gsmDeleteMessage(int index)
{
int nLength; // 串口收到的数据长度
char cmd[16]={0}; // 命令串
char ans[32]={0}; // 应答串
strcpy_P(cmd,AT_CMGD);
sprintf(cmd+8, "%d",index);//植入电话号码位置
strcat_P(cmd,_r);
// 输出命令串
WriteComm(cmd, strlen(cmd));
// 读应答数据
nLength = ReadComm(ans);
// 根据能否找到"+CMS ERROR"决定成功与否
if(nLength > 0 && strncmp(ans, "+CMS ERROR", 10) != 0)
{
return 0;
}
return 0xff;
}
/**************************************************************
功能:读取电话本中的内容
参数:phon:电话号码指针
返回: 是否成功
编写人:王志辉
时间:2007年8月10日
是否测试:是
****************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -