发送短消息常用Text和PDU(Protocol Data Unit,协议数据单元)模式。使用Text模式收发短信代码简单,实现起来十分容易,但最大的缺点是不能收发中文短信;而PDU模式不仅支持中文短信,也能发送英文短信。PDU模式收发短信可以使用3种编码:7-bit、8-bit和UCS2编码。7-bit编码用于发送普通的ASCII字符,8-bit编码通常用于发送数据消息,UCS2编码用于发送Unicode字符。
发送短息流程:
发送TEXT格式与PDU格式的短信都是这个流程,不过发送短信AT+CMGS这里会有不同,发送TEXT格式短信AT+CMGS=”${手机号码}”,而发送PDU格式的短信AT+CMGS=${信息长度},后面也大致相同,只是发送的内容PDU格式的数据需要进行比较复杂的转换,下面慢慢说
发送TEXT格式短信:
(1)首先先设置发送模式为TEXT格式
AT+CMGF=1
OK
查看当前发送模式
AT+CMGF?
+CMGF: 1
OK
(2)发送短信
发送TEXT格式短信是AT+CMGS=”${手机号码}”,出现”>”之后输入短信内容
AT+CMGS="86189349355xx"
> Hello World
+CMGS: 116
OK
在最后结束输入是按Ctrl+z结束输入,对应的ASCII码为0x1A
发送英文短信到这里就完成了
发送TEXT格式短信代码:
/***************************************
* 描述:发TEXT格式短信
*
* 返回值:
* 成功返回0, 失败返回负数
* ***************************************/
int send_mess(const char *name,const char *phone_num,const char *sms)
{
int rv = 0 ;
char rbuf[1024] ;
char mess[512] ;
char at_cmgs[128] ;
st_comport *comport = NULL ;
comport = comport_init(name, 115200,8,'N',1,'N') ;
if(!comport)
{
printf("comport_init() failed\n") ;
rv = -1 ;
goto cleanup;
}
comport->fd = open_comport(comport) ;
if(comport->fd < 0)
{
printf("Open_comport() Failed\n") ;
rv = -1 ;
goto cleanup ;
}
if((!phone_num) || (!sms))
{
printf("Invail input paremeter in %s\n",__FUNCTION__) ;
rv = -2 ;
goto cleanup ;
}
/* 设置信息格式为TEXT方式 */
rv = send_cmd(comport, "AT+CMGF=1\r", rbuf, sizeof(rbuf), 800);
if(rv < 0 )
{
printf("AT+CMGS FAILED\n");
rv = -3 ;
goto cleanup;
}
memset(at_cmgs,0,sizeof(at_cmgs)) ;
snprintf(at_cmgs, sizeof(at_cmgs),"AT+CMGS=\"%s\"\r", phone_num) ;
rv = send_cmd(comport, at_cmgs, rbuf, sizeof(rbuf), 1200);
if(rv < 0)
{
printf("AT+CMGS FAILED\n");
rv = -4 ;
goto cleanup;
}
if(strstr(rbuf,">") == NULL)
{
printf("Can't receive \">\"\n") ;
rv = -5 ;
goto cleanup ;
}
memset(mess, 0, sizeof(mess));
snprintf(mess, sizeof(mess), "%s",sms) ;
strcat(mess,"\x1a");
rv = send_cmd(comport, mess, rbuf, sizeof(rbuf), 3500);
if(rv < 0 )
{
printf("send message FAILED\n");
rv = -5 ;
goto cleanup;
}
if(!strstr(rbuf, "OK"))
{
printf("Send Message Failed\n") ;
rv = -6 ;
goto cleanup ;
}
rv = 0 ;
cleanup:
comport_term(comport) ;
return rv ;
}
发送PDU格式的中文短信:
参考:https://blog.csdn.net/a_tu_/article/details/47808017
(1)设置发送模式为PDU格式
AT+CMGF=0
OK
查看当前发送模式
AT+CMGF?
+CMGF: 0
OK
(2)发送短信
这里和发送TEXT格式短信不同,TEXT格式后面跟的手机号码,而这里跟的是长度AT+CMGS=${长度},在发送这个AT指令之前先不要着急,需要先做准备工作,而最复杂的也就是再这了
首先得先知道短信中心号码
使用AT指令AT+CSCA?查询短信中心号码,如果查不到,可以百度当地的短信中心号码
AT+CSCA?
+CSCA: "+8613010710500",145
这里得到的短信中心号码是+8613010710500我百度了一下,嗯是湖北武汉地区联通的短信中心的号码,都可以百度得到
发送对方的手机号码也得需要知道,假设发送的手机号码为:+8618934935552
发送的内容:测试发中文短信
列出来看得清楚一点
短信中心号码:+8613010710500
发送手机号码:+8618934935552
发送短信内容:测试发中文短信
第一步——格式化短信中心号码
1 - 要去掉“+”号,然后看看长度要是奇数的话就在末尾追加一个“F”。
+8613010710500 ——> 8613010710500F
2 - 将奇数位和偶数位交换位置。
8613010710500F ——> 683110700105F0
3 - 在前面加上“91”,是国际化的意思。
683110700105F0 ——> 91683110700105F0
4 - 最后算一算它有多长了,把长度除于2,再把结果转换为2位的16进制数,加在最前面。
91683110700105F0长16,16/2=8,8的16进制“08” 一定要注意是2位
91683110700105F0 ——> 0891683110700105F0
短信中心号码就处理完了,处理完的短信中心号码:0891683110700105F0