一、前言
在上一篇:(二)树莓派Linux环境串口通信编程–AT指令集的发送和接收,已经实现了串口通信编程,可发AT指令集,例如查SIM卡信号等指令,但是还是存在一个问题就是不能发送短信,这是因为涉及到编码的问题了,因为SIM卡发送短信,并不是简单的发送字符串,而是发送一个完整的Text格式或者PDU编码(包括已处理的中心号码、本SIM卡号码、数据Unicode码、号码长度、数据长度等信息)。现在我们需要了解Text格式和PDU格式的组成结构和用到的AT指令,以及后面如何用代码实现封装它。
二、需要掌握的知识
2.1 检查穿串口和SIM卡
在发送短信之前,我们需要保证几点是正常的,不然就可能造成发送短信失败:
(1)确保串口可用
AT
若返回OK则说明串口可用。
(2)确保能检测出SIM卡,串口可通信不代表能检测出SIM卡
AT+CPIN?
若返回READY,则说明能检测出SIM卡
(3)检测SIM卡是否已经注册
AT+CREG?
若返回0,1 或者返回0,3 则说明SIM卡已注册
(4)检测SIM卡信号
AT+CSQ
命令解释:检查网络信号强度
命令格式:AT+CSQ
命令返回:+CSQ: ** ,##
其中**应在 10 到 31 之间,数值越大表明信号质量越好,##为误码率,值在 0 到 99 之间。
2.2 Text格式
设置短信格式为Text格式
AT+CMGF=1
需要发送的号码,注意是英文双引号
AT+CMGS="135xxxx4414"
在出现>号后输入英文即可发送
下面是我用Linux下的AT指令软件microcom进行指令的收发,因为我前面写的程序还没有实现发短信功能。
下面是目标号码收到的短信
可以看出,发送英文的短信所需要的处理的流程是非常简单的,这是因为没有涉及到转码。
2.3 PDU格式
(1)PDU编码规则
PDU编码协议简单说明
例1发送:SMSC号码是+8613800250500,对方号码是1369309203,消息内容是“Hello!”。从手机发出的PDU串可以是
08 91 683108200505F0 11 00 0D 91 683196032930F0 00 00 00 06 C8329BFDOE 01
对照规范,具体分析:分段含义说明
- 08 短信中心号码地址信息的长度共8个八位字节(包括91)
- 91 短信中心号码地址格式(TON/NPI)用国际格式号码(在前面加’+’)
- 68 31 08 20 05 05 F0 SMSC地址8613800250500,补F’凑成偶数个
- 11基本参数(TP-MTI/VFP)发送,TP-VP用相对格式
- 00消息基准值(TP-MR)
- OD目标地址数字个数共13个十进制数(不包括91和’F’)
- 91目标地址格式(TON/NPI)用国际格式号码(在前面加’+’)
- 68 31 96 03 29 30 F0目标地址(TP-DA)8613693092030,补F’凑成偶数个
- 00协议标识(TP-PID)是普通GSM类型,点到点方式
- 00用户信息编码方式(TP-DCS)7-bit编码
- 00有效期(TP-VP)5分钟
- 06用户信息长度(TP-UDL)实际长度6个字节
- C8 32 9B FD OE01用户信息(TP-UD)“Hello!”
(2)短信中心号码
在上面PDU编码中使用到了短信中心号码,没听说过的人可能会一头雾水。下面解释一下:
信息中心号码是一种短信息服务器,如果填错了,短消息是无法发送成功的,各个地区都有自己的信息中心号码,具体号码可以询问当地的网络运营商。
也可以用下面AT指令获取中心号码:
AT+CSCA?
(1)介绍
信息中心号码,即短信服务中心,SMSC(Short Message Service Center),负责在基站和移动台(ME)间中继、储存或转发短消息;ME到SMSC的协议能传输来自移动台或朝向移动台的短消息,协议名遵从GMS 03.40协议。
GSM手机需要设置短信服务中心号码。
CDMA手机不需要设置短信服务中心号码。
(2)格式
中国移动,短消息中心号码以+861380开头,紧接的4位数号码所在的地区码(电话区号),比方0571(杭州),最后一般是500。对于区号小于四位的地区,地区码则在第四位补0,例如北京0100。
中国联通,短消息中心号码为+8613010开头,紧接的3位数号码是各省分公司分配的短消息中心序列号),最后一般是500。