短信相关的AT指令以及信令_短信发送失败信令-程序员宅基地

技术标签: SMS  

此次的短信AT指令和信令从以下几个方面介绍:

一 . 短信AT指令的格式
二 . 短信AT指令的使用(超级终端)
三 . 短信AT指令在log中的查看
四 . 短信modem相关信令
五 . 超级终端的使用(hyper_terminal)
六 . 其他短信AT指令
七 . CMC ERROR 错误码

一 . 短信AT指令的格式

短信的编码方式有两种:text模式,pdu模式。因此短信的AT指令执行格式也有两种,分别对应text模式和pdu模式。
1 . Text模式
纯文本模式,支持不同的字符集,从技术上说也可用于发送中文短消息,但国内手机基本上不支持,主要用于欧美地区。
2 . Pdu模式
这个是手机默认的编码方式,可以使用任何字符集,其包括三种编码方式:7bit编码,8bit编码,UCS2编码。
7bit编码:ASCⅡ码就是7bit编码。
8bit编码:ASCⅡ字符可以使用7位二进制表示,但是由于计算机的基本处理单位是字节(1byte=8bit),所以一般在高位补0,用一个字节表示一个ASCⅡ字符。这就是8bit编码。
UCS2编码:处理Unicode字符,使用2个字节来表示一个字符,可以表示世界上所有的字符。发送中文就是使用此编码方式。

二 . 短信AT指令的使用(超级终端)

1 . 查看目前的短信编码模式
AT+CMGF?

2 . 切换编码模式
AT+CMGF=0//PDU
AT+CMGF=1//TEXT

3 . 当模式为text时,发送格式如下

AT+CMGS=”18579853304”

dddddd…. (此处为发送内容)
0X1A (此处表示内容结尾,必须)

结果:
+CMGS: 211
OK

4 . 当模式为pdu时,发送格式如下

AT+CMGS=19, “0001000b818125514688f4000006c8329bfd0601” 或者
AT+CMGS=20, “0001000b818175893503f4000008d3ba3a1d76ebcb”

19和20为:pdu约定固定长度15+发送的报文的长度(16进制数)

00 服务号码信息长度为0
01 没有多余信息的发送,即不包括服务号码信息
00 消息基准值(TP-MR) 0
0b 发送号码的信息长度
81 国际号码格式即”+”
8125514688f4 目的号码,即18521564884(算法:末尾加f后奇偶位调换)
00 协议标识是普通GSM 类型,点到点方式
00 编码方式,08–USC2,00–7-bit
00 有效期
06 信息长度
c8329bfd0601 信息内容/Hello

三 . 短信AT指令在log中的查看

1 . 正常发送短信

RILJ    : [4194]> SEND_SMS [SUB0]     //从RIL.java中发出SEND_SMS消息
AT      : AT send on RIL_CMD_READER_3, tid:548282602560
AT      : AT>AT+CMGS=19,"0001000b818175893503f4000006c8329bfd0e03"
AT      : AT< +CMGS: 218  //modem返回的结果,返回CMGS说明发送成功
AT      : response received on RIL_CMD_READER_3, tid:548282602560
RILJ    : [4194]< SEND_SMS { mMessageRef = 218, mErrorCode = 0, mAckPdu = null} [SUB0]    //AT向RIL.java报告发送情况
 
 
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2 . 发送短信失败

RILJ    : [4838]> SEND_SMS [SUB0]
AT      : AT send on RIL_CMD_READER_3, tid:548305933376
AT      : AT>AT+CMGS=20,"0001000b818175893503f4000008d3ba3a1d76ebcb"
AT      : AT< ERROR
 
 
  
  • 1
  • 2
  • 3
  • 4

以上例子失败原因:
设置编码为Text模式,但是手机默认的编码为pdu模式,以上AT+CMGS命令执行时参数为pdu码。因此报AT< ERROR。

以上例子不具有代表性,实际上,发送短信失败,最终AT的返回结果为:
AT< +CMS ERROR: 111。
111代表的意思为:Protocol error, unspecified
每个错误码对应响应的失败原因,CMS ERROR的错误码见文档最后。

3 . 正常接收短信

AT      : AT< +CMT: ,25       
AT      : SMS Urc Received!
AT      : AT< 0891683110501905F0040BA18175893503F400006101809103242306F732681C7603
AT      : RIL_URC_READER:line1:+CMT:,25,line2:0891683110501905F0040BA18175893503F400006101809103242306F732681C7603
RILJ    : [UNSL]< UNSOL_RESPONSE_NEW_SMS [SUB0] //向RIL.java上报新消息
RILJ    : [4223]> SMS_ACKNOWLEDGE true 0 [SUB0]  //RIL.java确认新消息已收到
AT      : AT send on RIL_CMD_READER_2, tid:548283642944
AT      : AT> AT+CNMA=1, 2, "0000"  //AT向服务器反馈消息已收到
AT      : AT< OK   //基站服务器响应ok
AT      : response received on RIL_CMD_READER_2, tid:548283642944
RILJ    : [4223]< SMS_ACKNOWLEDGE  [SUB0]  //AT向RIL.java响应ok
 
 
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

4 . 接收短信失败

AT      : AT< +EIMSCMT: ,22
AT      : SMS Urc Received!
AT      : AT< 0891683109520000F0000A11620010861400006190032180958004D4F29C0E
AT      : RIL_URC_READER: line1:+EIMSCMT: ,22,line2:0891683109520000F0000A11620010861400006190032180958004D4F29C0E
RILJ    : [UNSL]< UNSOL_RESPONSE_NEW_SMS [SUB0]SmsMessage: SMS PDU parsing failed:
         .......
RILJ    : [3892]> SMS_ACKNOWLEDGE false 255 [SUB0] //RIL.java确认新消息已收到,但是新消息存在问题,返回255错误码
AT      : AT send on RIL_CMD_READER_2, tid:547637703744
AT      : AT> AT+EIMSCNMA=2, 3, "00FF00" //AT向服务器反馈消息已收到
AT      : AT< OK
AT      : response received on RIL_CMD_READER_2, tid:547637703744
RILJ    : [3892]< SMS_ACKNOWLEDGE  [SUB0]
 
 
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

以上例子:
客户使用一台样机向另一台样机发送短信,发送方发送短信成功,但是接收方接收不到短信。
从以上log可以看出,RIL.java在对pdu码解析的过程中发生了错误,但是实际上AT已经收到了新短信,因此也需要向服务器反馈结果,AT的整个流程是没有问题的。因为pdu解析出错,新短信自然不能保存并显示,我们看到的现象就是接收不到新短信。
解析pdu出错的详细信息如下:

SmsMessage: java.lang.RuntimeException: Invalid TOA - high bit must be set. toa = 17 (at offset 11)
SmsMessage:     at com.android.internal.telephony.gsm.SmsMessage$PduParser.getAddress(SmsMessage.java:609)
SmsMessage:     at com.android.internal.telephony.gsm.SmsMessage.parseSmsDeliver(SmsMessage.java:1041)
SmsMessage:     at com.android.internal.telephony.gsm.SmsMessage.parsePdu(SmsMessage.java:968)
SmsMessage:     at com.android.internal.telephony.gsm.SmsMessage.newFromCMT(SmsMessage.java:163)
SmsMessage:     at android.telephony.SmsMessage.newFromCMT(SmsMessage.java:257)
SmsMessage:     at com.android.internal.telephony.RIL.processUnsolicited(RIL.java:3832)
SmsMessage:     at com.android.internal.telephony.RIL.processResponse(RIL.java:2930)
SmsMessage:     at com.android.internal.telephony.RIL.-wrap6(RIL.java)
SmsMessage:     at com.android.internal.telephony.RIL$RILReceiver.run(RIL.java:848)
SmsMessage:     at java.lang.Thread.run(Thread.java:818)
 
 
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

从RuntimeException信息中看到, code 会做SMS OA address type 的检查。log 中 的号码为0A116200108614 ,address type 栏位是0x11,但spec要求 最高bit是1,因此抛出了异常。
解决办法:一是我们去掉SMS OA address type的检查,但是会存在不确定性,二是看看运营商在发送短信时检查下OA address type的最高一个bit 是否为1。

四 . 短信modem相关信令

在GSM中,SMS在协议上分为三层(RP/CP/TP),每层传输使用的protocol不一样,RP和CP分别代表在SM-RL与CM-sublayer上的数据,定义在TS 24.011。RP是处于CP的上层,因此发送SMS数据时RP数据单元要在CM-sublayer层上打包为CP数据单元,接收的CP则要在SM-RL解包为RP。详细的SMS分层参考3GPP TS24.011第2.1节。

发送短信:

(UE –> NW) CP-DATA[包含SMS的文本内容;包含RP-DATA]
(UE <– NW) CP-ACK [简单响应收到上一个CP-DATA;不包含RP]
(UE <– NW) CP-DATA[如果短信有什么异常或网络拒绝等异常cause会携带在里面;包含RP-ACK或者是RP-ERROR,响应上面的RP-DATA]
(UE –> NW) CP-ACK [简单响应NW收到了上一个CP-DATA;不包含RP]

接收短信:

(UE <– NW) CP-DATA[包含SMS的文本内容;包含RP-DATA]
(UE –> NW) CP-ACK [简单响应收到上一个CP-DATA;不包含RP]
(UE –> NW) CP-DATA[如果短信有什么异常或手机拒绝等异常cause会携带在里面;包含RP-ACK或者是RP-ERROR,响应上面的RP-DATA]
(UE <– NW) CP-ACK [简单响应手机收到上一个CP-DATA;不包含RP]

ERROR cause是携带在第三个流程中,具体的cause可以查TS 24.011附件 Annex E

五 . 超级终端的使用(hyper_terminal)

1.安装超级终端。

2.获取串口(COM1,2,3,4)。
由于手机在Normal Mode下,PC需要通过Kernel VCOM Port向手机发送AT Command;而手机默认在Normal Mode下并没有打开Kernel VCOM Port。此时需要通过向手机发送ADB Command去让手机枚举Kernel VCOM Port。

  对于ICS及以上版本,手机枚举Kernel VCOM的命令为:在adb shell下,输入setprop persist.sys.usb.config mass_storage,adb,acm
  对于MT6572 GB3版本,手机枚举Kernel VCOM的命令为:在adb shell下,输入echo 1 > /sys/class/usb_composite/acm/enable

 
 
  
  • 1
  • 2

3.测试

AT 确认串口正常
ok

六 . 其他短信AT指令

1.AT+CPMS
命令解释:选择短信存储载体
1.1 设置短信存储载体
命令格式:AT+CPMS=[,][,]
命令返回:+CPMS:,,,,, OK/ERROR
测试结果:

1.2 显示当前短信存储载体设置
命令格式:AT+CPMS?
命令返回:+CPMS:,,,,,,,, OK/ERROR
测试结果:

1.3 显示本命令支持的参数
命令格式:AT+CPMS=?
命令返回:+CPMS: (list of supporteds),(list of supporteds),(list of supporteds) OK/ERROR
测试结果:
命令内容:AT+CPMS=?
命令返回:+CPMS: (“ME”,”SM”),(“ME”,”SM”),(“ME”,”SM”) OK

2.AT+CMGF
命令解释:设置短信格式
2.1 设置短信格式
命令格式:AT+CMGF=//0:PDU格式 1:文本格式
命令返回:OK/ERROR
2.2 显示本命令支持的参数
命令格式:AT+CMGF=?
命令返回:OK/ERROR
2.3 显示当前短信格式
命令格式:AT+CMGF?
命令返回:OK/ERROR
测试结果:

3.AT+CMGS
命令解释:发送短信
命令格式:AT+CMGS=[,]
Text is entered

七 . CMC ERROR 错误码

Error Description
CMS ERROR: 1 Unassigned number
CMS ERROR: 8 Operator determined barring
CMS ERROR: 10 Call bared
CMS ERROR: 21 Short message transfer rejected
CMS ERROR: 27 Destination out of service
CMS ERROR: 28 Unindentified subscriber
CMS ERROR: 29 Facility rejected
CMS ERROR: 30 Unknown subscriber
CMS ERROR: 38 Network out of order
CMS ERROR: 41 Temporary failure
CMS ERROR: 42 Congestion
CMS ERROR: 47 Recources unavailable
CMS ERROR: 50 Requested facility not subscribed
CMS ERROR: 69 Requested facility not implemented
CMS ERROR: 81 Invalid short message transfer reference value
CMS ERROR: 95 Invalid message unspecified
CMS ERROR: 96 Invalid mandatory information
CMS ERROR: 97 Message type non existent or not implemented
CMS ERROR: 98 Message not compatible with short message protocol
CMS ERROR: 99 Information element non-existent or not implemente
CMS ERROR: 111 Protocol error, unspecified
CMS ERROR: 127 Internetworking , unspecified
CMS ERROR: 128 Telematic internetworking not supported
CMS ERROR: 129 Short message type 0 not supported
CMS ERROR: 130 Cannot replace short message
CMS ERROR: 143 Unspecified TP-PID error
CMS ERROR: 144 Data code scheme not supported
CMS ERROR: 145 Message class not supported
CMS ERROR: 159 Unspecified TP-DCS error
CMS ERROR: 160 Command cannot be actioned
CMS ERROR: 161 Command unsupported
CMS ERROR: 175 Unspecified TP-Command error
CMS ERROR: 176 TPDU not supported
CMS ERROR: 192 SC busy
CMS ERROR: 193 No SC subscription
CMS ERROR: 194 SC System failure
CMS ERROR: 195 Invalid SME address
CMS ERROR: 196 Destination SME barred
CMS ERROR: 197 SM Rejected-Duplicate SM
CMS ERROR: 198 TP-VPF not supported
CMS ERROR: 199 TP-VP not supported
CMS ERROR: 208 D0 SIM SMS Storage full
CMS ERROR: 209 No SMS Storage capability in SIM
CMS ERROR: 210 Error in MS
CMS ERROR: 211 Memory capacity exceeded
CMS ERROR: 212 Sim application toolkit busy
CMS ERROR: 213 SIM data download error
CMS ERROR: 255 Unspecified error cause
CMS ERROR: 300 ME Failure
CMS ERROR: 301 SMS service of ME reserved
CMS ERROR: 302 Operation not allowed
CMS ERROR: 303 Operation not supported
CMS ERROR: 304 Invalid PDU mode parameter
CMS ERROR: 305 Invalid Text mode parameter
CMS ERROR: 310 SIM not inserted
CMS ERROR: 311 SIM PIN required
CMS ERROR: 312 PH-SIM PIN required
CMS ERROR: 313 SIM failure
CMS ERROR: 314 SIM busy
CMS ERROR: 315 SIM wrong
CMS ERROR: 316 SIM PUK required
CMS ERROR: 317 SIM PIN2 required
CMS ERROR: 318 SIM PUK2 required
CMS ERROR: 320 Memory failure
CMS ERROR: 321 Invalid memory index
CMS ERROR: 322 Memory full
CMS ERROR: 330 SMSC address unknown
CMS ERROR: 331 No network service
CMS ERROR: 332 Network timeout
CMS ERROR: 340 No +CNMA expected
CMS ERROR: 500 Unknown error
CMS ERROR: 512 User abort
CMS ERROR: 513 Unable to store
CMS ERROR: 514 Invalid Status
CMS ERROR: 515 Device busy or Invalid Character in string
CMS ERROR: 516 Invalid length
CMS ERROR: 517 Invalid character in PDU
CMS ERROR: 518 Invalid parameter
CMS ERROR: 519 Invalid length or character
CMS ERROR: 520 Invalid character in text
CMS ERROR: 521 Timer expired
CMS ERROR: 522 Operation temporary not allowed
CMS ERROR: 532 SIM not ready
CMS ERROR: 534 Cell Broadcast error unknown
CMS ERROR: 535 Protocol stack busy
CMS ERROR: 538 Invalid parameter

参考:http://blog.sina.com.cn/s/blog_4c8b0d600100dlt7.html
http://www.cppblog.com/zhangyq/archive/2009/07/04/89245.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ZhongGuoRenMei/article/details/103350549

智能推荐

pythoncsv按内容切分_使用Python根据特定列拆分CSV文件-程序员宅基地

I'm a Python beginner, and have made a few basic scripts. My latest challenge is to take a very large csv file (10gb+) and split it into a number of smaller files, based on the value of a particular v...

qt for android mysql数据库_Qt For Android 数据库操作-程序员宅基地

Qt For Android 数据库操作作者:qyvlikQt 中的数据库操作,由于内嵌了一个 sqlite 数据库驱动,在普通应用中可以较为轻松地应付一些需求。Qt Quick Local StorageQML 提供了一个 QtQuick.LocalStorage 模块,用以操作 sqlite 数据库。不支持异步。由于Web SQL Database规范已经被废弃,原因说的很清楚,当前的 SQL..._qt for android 远程数据库项目

ZYNQ--存储器-程序员宅基地

ZYNQ:L1高速缓存(包括指令和数据)对于程序员来说是“隐藏的“,称其为SRAM。位于CPU和主存储器之间。CPU的运行速度比存储器外部总线速度高出好几个量级(比DRAM快)。OCM包含256KRAM和128K的ROM,其中128KROM对应BOOTROM,专门用于启动,对用户来说不可见。ROM和RAM指的都是半导体存储器,ROM在系统停止供电的时候仍然可

PHP Laraval系列之文件结构、Artisan、路由、控制器-程序员宅基地

一、文件结构打开项目代码之后,我们就可以在 Sublime的左侧边栏里清楚的看到 Laravel源码的结构:下面简单介绍一下 Laravel源码里每个文件夹都是用来做什么的,了解结构才能更好地进行后续的开发。文件夹介绍app网站的业务逻辑代码,例如:控制器/模型/路由等boots

AVL-平衡二叉树的原理和实现-程序员宅基地

一、简介  本文将通过图解和代码详细讲解AVL平衡二叉树的性质及失衡和再平衡的内容。在看本文之前希望大家具备二分搜索树的相关知识。或移步《二分搜索树》了解二分搜索树。二、平衡二叉树  前面关于二分搜索树的文章,最后分析了在极端情况下,二分搜索树会退化为一个链表,那为了避免这种情况的发生,AVL平衡二叉树应运而生。  平衡二叉树的定义:1 平衡二叉树是一颗二分...

CenterNet:Objects as Points代码解析(七): CenterNet\src\lib\trains\base_trainer.py_set_device(self, gpus, chunk_sizes, device) 函数-程序员宅基地

# – coding:utf-8 –from __future__ import absolute_importfrom __future__ import divisionfrom __future__ import print_functionimport timeimport torchfrom progress.bar import Barfrom models.data_parallel import DataParallelfrom utils.utils import Ave_set_device(self, gpus, chunk_sizes, device) 函数

随便推点

android manifest 多个application,Android开发之在library的manifest中使用 ${applicationId}-程序员宅基地

简单描述下场景。有个Core library Module作为公用库,里面也集成了其他第三方 比如高德地图,比如拍照时候需要的FileProvider配置。有多个app module在同一个工程,都调用core module。为了会打包成不同的app。这样问题就来了。实际是每个app的applicationid与第三方的key都是不同的因为包名就不同。一.对于类似FileProvider的配置正常..._${applicationid}

用VisualSVN Server创建版本库,以及TortoiseSVN的使用_svn建立版本库-程序员宅基地

http://blog.csdn.net/liulunxu/article/details/8618802转至上一篇介绍了VisualSVN Server和TortoiseSVN的下载,安装,汉化.这篇介绍一下如何使用VisualSVN Server建立版本库,以及TortoiseSVN的使用.首先打开VisualSVN Server Manager,如图:_svn建立版本库

element联级选择器(获取省市地区)后台动态获取_element地址选择,需要读取数据库中存放的地区吗-程序员宅基地

如何根据后台接口数据动态展示联级选择器,本文章以获取省市地区为例进行说明通过点击省地区动态获取市地区首先,看一下element联级选择器长啥样:<el-cascader :options="options" v-model="value" clearable></el-cascader><script> export default { ..._element地址选择,需要读取数据库中存放的地区吗

IDEA创建gradle项目犹如乌龟爬行(缓慢)解决方案_idea gradle 慢-程序员宅基地

使用IDEA创建gradle之时,时长感到缓慢无比,上网搜索良久,终于找到解决方法,特于此分享,经本人亲测,确实有光速提升。1,缓慢之由一:下载gradle包缓慢,首次创建项目皆要下载gradle***.zip(gradle包)。解决办法:使用迅雷下载把包下载(几秒),后设置IDEA的gradle路径,过程如下。 (1)使用迅雷下载gradle包,地址为:https://downloads.gradle-dn.com/distributions/gradle-6.6.1-bin.zip。..._idea gradle 慢

添加字段的sql语句_增加表字段的sql语句-程序员宅基地

添加字段,比如我在数据表中添加一个 age 字段,类型为int(11)ALTER TABLE player ADD (age int(11));更多MySQL - SQL语句增加字段/修改字段/修改类型/修改默认值_william_n的博客-程序员宅基地_mysql添加字段sql语句..._增加表字段的sql语句

struts2的 2.3.16.3版本的至少要的jar-程序员宅基地

commons-fileupload-1.3.1.jar: 实现文件上传的jar commons-io-2.2.jar : 文件读取和复制,拷贝等要用到的 commons-lang3-3.1.jar : 字符串处理工具类 freemarker-2.3.19.jar:一个模板引擎。因为Struts2是基于它开发的 javassist-3.11.0.GA.ja..._struts2 2.3.16

推荐文章

热门文章

相关标签