AT指令发送TEXT格式和PDU格式短信,以及linux c编程实现3G模块发送短信

本文详细介绍了如何使用AT指令在Linux环境下通过C编程实现3G模块发送TEXT和PDU格式的短信。TEXT模式简单但不支持中文,而PDU模式支持中文并涉及复杂的编码转换。发送短信流程包括设置发送模式、格式化短信中心号码、收信方手机号码和内容,最后组合发送。文章提供了完整的步骤和代码示例。
摘要由CSDN通过智能技术生成

发送短消息常用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

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值