AT指令之收发短信

    技术2022-07-16  82

    收发短信

    1.Text模式和PDU模式2.英文短信3.中文短信4.注意: 在上一篇分析了一些常用的AT指令后,我们就可以用这些AT指令来打电话或者发短信,那么短信又分为英文短信和中文短信,英文短信比较简单,输入要发的信息就好了,但是中文短信的话就比较复杂了。

    注意:在有些时候输入的AT指令是不显示的,需要用‘ate1’来显示命令。

    1.Text模式和PDU模式

    AT指令收发短信主要有两种模式:Text模式和PDU(Protocol data Unit,协议数据单元)模式。使用Text模式收发短信代码非常简单,很容易实现,最大的缺点就是不支持中文短信。但是PDU模式不仅能发英文短信,还可以发送中文短信。PDU收发短信一共有3种编码可以用:7-bit、8-bit和UCS2编码。7-bit编码用于普通的ASCII码,即英文短信,最大可发送160字符;8-bit编码用于发送数据消息;UCS2编码用于发送Unicode字符,可发送中文字符,最多可发送70字符。下面是常用命令:

    设置短信格式为Text模式: AT+CMGF=1 OK

    设置短信格式为PDU模式: AT+CMGF=0 OK

    发送短消息 命令格式:AT+CMGS=“xxxxxxxxxxxx”,里面为对方的电话号码。

    设置短信存储载体 命令格式:AT+CPMS

    读取短信 命令格式:AT+CMGR

    删除短信 命令格式:AT+CMGD

    获取短信中心号码 命令格式:AT+CSCA?

    2.英文短信

    英文短信相比中文的要简单很多,因为英文直接就可以转ASCII码发送,但是中文就要转换一下才可以。

    首先,需要利用AT+CMGF=1 ,将其设置为Text模式,然后,利用AT+CMGS=“xxxxxxxxxxxx”命令指定对方号码,然后就可以发消息了。 发:AT (检测Module与串口是否连通,能否接收AT命令) 收:OK 发:AT+CMGF=1(设为Text模式) 收:OK 发:AT+CMGS=“+86xxxxxxxxxxxx”(指定号码,+86可以选择加) 收:>(收到这个箭头后就可以发送消息了,但是要发送的信息输入完成后需要加ctrl+z或十六进制0x1A结束) 收:+CMGS: 54 OK (发送成功)

    3.中文短信

    在使用AT指令发送中文指令的时候,首先要设置为PDU模式,然后这个会有一个中心号码。发送之前要对接收号码、短信内容、短信中心号码进行处理。假如发送的内容是: 接收号码:+8618585761900 短信内容:工作愉快! 短信中心号码:+316540942000,这里中心号码可以用上面的命令获取,也可以百度。

    接收号码处理:用字符串pho表示

    将接收号码去掉+号,看看长度是否为偶数,如果不是,最后添加F,即pho= “+8618585761900” =>pho = “8618585761900F”将奇数位和偶数位交换。 =>pho=“688185751609F0”

    短信中心号码处理:用字符串atr

    将短信中心号码去掉+号,看看长度是否为偶数,如果不是,最后添加F atr="+316540942000" => atr=“3165409442000”

    将奇数位和偶数位交换。 atr=“13560449240200”

    将短信息中心号码前面加上字符91,91是国际化的意思 atr=“9113560449240200”

    算出 atr 长度,结果除2,格式化成2位的16进制字符串,16 / 2 = 8 => “08” atr=“089113560449240200”

    短信息部分处理:用字符串 msg 表示

    转字符串转换为Unicode代码,例如“工作愉快!”的unicode代码为 5DE54F5C61095FEBFF01,(转换在linux里可用iconv函数实现,这里不是很懂,下来再研究一下iconv函数)

    将 msg 长度除2,保留两位16进制数,即 5DE54F5C61095FEBFF01 = 20 / 2 => “0A”,再加上 msg => msg = “0A5DE54F5C61095FEBFF01”

    组合:

    手机号码前加上字符串 11000D91(1100:固定,0D:手机号码的长度,不算+号,十六进制表示,91:发送到手机为91,发送到小灵通为81) 即 pho = “11000D91” + pho => 11000D91688185751609F0

    手机号码后加上 000800 和刚才的短信息内容,000800也写死就可以了 即 pho = pho + “000800” + msg

    即 11000D91688185751609F0 + 000800 + 0A5DE54F5C61095FEBFF01 => pho = 11000D91688185751609F00008000A5DE54F5C61095FEBFF01

    phone 长度除以2,格式化成2位的十进制数 即 11000D91683109423346F90008000A5DE54F5C61095FEBFF01 => 50位 / 2 => 25

    发送: 发:AT 收:OK 发:AT+CMGF=0 收:OK 发:AT+CMGS=25 收:> 发:atr+pho→ //→为发送符(ctrl+z,十六进制0x1A) 08911356044924020011000D91688185751609F00008000A5DE54F5C61095FEBFF01 收:+CMGS: 54 OK

    4.注意:

    发送的指令用0x0D结尾,注意不是通常认为的0x0D,0x0A。特别是在发送PDU短信的AT+CMGS=25命令时,一定只能以0x0D结尾。在发送短信内容时,以0x1A(代表ctrl+Z的虚拟键值)结尾。用AT+CMEE=1命令,可以在短信猫返回ERROR时带上原因,这样方便调试。
    Processed: 0.028, SQL: 10