一、短信相关AT指令集
二、短信发送流程
三、实现代码
#include "shortmessage.h"
#include <at.h>
#include <stdio.h>
#include <string.h>
#include <at_device.h>
#include <finsh.h>
#include <at_log.h>
#include <rtthread.h>
#include <rtdevice.h>
#include <rthw.h>
/***************发送短信流程******************
* ATE //ENABLE ECHO mode
* AT+CMGF=1 //set text mode
* AT+CSMP=17,167,0,0 //set sms parameter for text mode
* AT+CSCS="GSM" //set character type
* AT+CMGS="1233321111" //the phone number
* 当发送完电话号码后,会返回一个>,在后面输入所要传输的短信信息,发送完之后发送0x1a即可发送短信
*********************************************/
#define ATE1 "ATE0"
#define ATCMGF "AT+CMGF=1" //0设置短消息为PDU模式, 1设置短消息为txet模式
#define ATCSMP "AT+CSMP=17,167,0,0"
#define ATCSCS "AT+CSCS=\"%s\""
#define ATCPMS "AT+CPMS="ME","ME","ME"" //设置短信的存储位置
#define ATCMGS "AT+CMGS=\"%s\"" //发送手机号
#define ATCMGSDATA "\%s" //发送的消息
#define ATCMGR "AT+CMGR=\"%s\"" //读取消息 (AT+CMGR=index (读取命令从消息存储<mem1>向TE返回位置值为<index>的SMS消息)
#define ATCMGD "AT+CMGD=\"%s\"" //删除消息 (AT+CMGD=index (删除index位置的短信))
#define ATCMGL "AT+CMGL" //获取短信列表 (会回复收到的未读消息列表)
/*********************************************************
* @function sms_ec200_text_send
* @role 向指定的手机发送text短信
* @input phone 手机号指针,pmsg 短消息指针, parameter AT client device name
* @output None
* @return 成功返回:_ATOK,失败返回:_ATERROR,超时返回:_ATOTIME
*
********************************************************/
int sms_textsend(void* parameter, char*phone, char*pmsg)
{
#define RESP_SIZE 128
int liv_temp = 500;
char atphone[50] = "";
int ret = RT_EOK;
char atpmsg[140] = "";
int pmsglen=0;
at_response_t resp = RT_NULL;
at_client_t client = RT_NULL;
resp = at_create_resp(RESP_SIZE, 0, rt_tick_from_millisecond(300));
if (resp == RT_NULL)
{
LOG_E("no memory for resp create.");
ret = -RT_ERROR;
goto __exit;
}
client = at_client_get(parameter);
if(strlen(phone) != 11)
return RT_ERROR;
rt_thread_mdelay(liv_temp);
if(RT_EOK != at_obj_exec_cmd(client, RT_NULL, ATE1))
{
ret = -RT_ERROR;
goto __exit;
}
rt_thread_mdelay(liv_temp);
if(RT_EOK != at_obj_exec_cmd(client, RT_NULL, ATCMGF))
{
ret = -RT_ERROR;
goto __exit;
}
rt_thread_mdelay(liv_temp);
if(RT_EOK != at_obj_exec_cmd(client, RT_NULL, ATCSMP))
{
ret = -RT_ERROR;
goto __exit;
}
rt_thread_mdelay(liv_temp);
if(RT_EOK != at_obj_exec_cmd(client, RT_NULL, ATCSCS,"GSM"))
{
ret = -RT_ERROR;
goto __exit;
}
rt_thread_mdelay(liv_temp);
sprintf(atphone,ATCMGS,phone);
if(RT_EOK != at_obj_exec_cmd(client, RT_NULL, atphone))
{
ret = -RT_ERROR;
goto __exit;
}
rt_thread_mdelay(liv_temp);
sprintf(atpmsg,ATCMGSDATA,pmsg);
pmsglen = strlen(atpmsg);
atpmsg[pmsglen]= 0x1a;
if(RT_EOK != at_obj_exec_cmd(client, RT_NULL, atpmsg))
{
ret = -RT_ERROR;
goto __exit;
}
__exit:
if (resp)
{
at_delete_resp(resp);
}
return ret;
}
四、实验结果