# SMS
***Copyright © Quectel Wireless Solutions Co., Ltd. 2026. All rights reserved.***
---
# 功能概述
SMS(Short Message Service,短信服务)是用户通过移动终端直接发送和接收文字或数字信息的通信服务。每条SMS消息由多个字段组成,包括短信中心地址、目标地址、协议标识、数据编码及用户数据等,通常以二进制形式编码并通过GSM网络的信令信道传输。
## 基本要素
1. **短信实体**(SME):生成或接收短信的终端(如手机)或应用服务器(如短信网关)。
2. **短信服务中心**(SMSC):网络核心单元,负责存储、转发和路由短信,确保消息在接收方不可达时能够暂存并重试发送。
3. **短信内容**:标准单条短信的最大长度为140字节,使用7-bit编码时可容纳160个英文/数字字符,使用UCS2编码时可容纳70个中文字符。超长内容可通过拼接多条短信(Concatenated SMS)实现。
4. **信令信道**:短信通过控制信道传输,无需建立专用的语音或数据业务信道即可工作。
## 端到端收发流程
SMS的端到端传递主要依赖于短信服务中心进行消息的中转和路由,核心在于信令交互。
1. **消息提交**
发送方设备将编辑好的短信通过基站子系统(BSS)转发至移动交换中心(MSC),再由移动交换中心通过标准协议(如MAP)提交至短信服务中心,并赋予时间戳、服务中心地址等元数据。
2. **消息存储与路由**
短信服务中心接收到消息后,将消息存入内部队列并根据接收方的号码查询归属位置寄存器(HLR)或拜访位置寄存器(VLR),以确定接收方当前的位置和状态。若接收方不可达(如关机或不在服务区),短信服务中心将保留消息并稍后重试。
3. **消息传递**
接收方设备可用时,短信服务中心通过移动交换中心和基站子系统将消息推送至接收方设备。
4. **消息通知与确认**
接收方设备接收到消息后,通常会向网络回传确认,短信服务中心随即清除队列内已投递消息。若因存储空间不足等原因导致消息无法传递,网络会向发送方返回状态报告(Status Report),指示消息的送达状态(如“已送达”或“发送失败”)。发送方和接收方设备均会生成本地通知(如提示音或图标),告知用户消息的发送或接收状态。
5. **消息删除或重试**
若消息在设定时间内无法传递,短信服务中心判定消息过期并删除,或根据配置策略进行重试,直至投递成功。
## 常用收发模式
### 文本模式
1. **基本概念**:对用户和开发者友好的简化模式,底层复杂的编码和协议数据包构建由设备自动完成。
2. **工作原理**:
- **发送**:用户直接填写号码和明文内容,模块内部自动编码发送;
- **接收**:模块直接返回可读文本、发送号码、时间,无需手动解析二进制。
3. **优点**:开发简单易上手,英文场景调试便捷,无需掌握TPDU结构与编码算法。
4. **缺点**:编码方式由模块自动选择,用户控制力弱;难以发送二进制信息(如WAP Push)。
### PDU模式
1. **基本概念**:面向协议的底层操作模式,开发者需直接构造和解析完整的十六进制字符串协议数据单元,提供对SMS协议的完全控制。
2. **工作原理**:
- **发送**:开发者手动构建包含短信服务中心信息、TPDU头和用户数据的PDU字符串并发送至模块;
- **接收**:模块返回PDU字符串,开发者需自行编写代码解析字符串以提取发送方号码、时间戳和解码内容。
3. **优点**:可精确控制编码方案(7-bit/8-bit/UCS2);支持长短信(通过UDH头);可发送二进制短信和特殊功能短信(如闪信、WAP Push)。
4. **缺点**:开发复杂,需深入理解SMS PDU格式及编解码算法;十六进制字符串肉眼难以阅读,调试困难。
## 消息结构
一条PDU消息分为两大段:SCA短信中心前缀段 + TPDU传输协议数据单元段
| **分段** | **字段** | **位置** | **
长度(字节)
** | **名称** | **说明** |
| --- | --- | --- | --- | --- | --- |
| SCA前缀 | SCA长度 | P1 |
1
| 短信中心地址长度 | 后面SCA字段的字节数 |
| SCA前缀 | SCA类型 | P2 |
0~1
| 短信中心地址类型 | 通常“91”代表国际格式 |
| SCA前缀 | SCA地址 | P3 |
0~10
| 短信中心号码 | BCD编码短信中心号码 |
| TPDU | FO | P4 |
1
| 第一个字节 | 包含TP-MTI等报文类型标志位 |
| TPDU | MR | P5 |
1
| 消息参考 | 发送方分配的消息ID |
| TPDU | DA长度 | P6 |
1
| 目标地址长度 | 目标号码的数字位数 |
| TPDU | DA类型 | P7 |
1
| 目标地址类型 | 通常“91”代表国际格式 |
| TPDU | DA地址 | P8 |
0~10
| 目的地址 | BCD编码接收手机号 |
| TPDU | PID | P9 |
1
| 协议标识 | 协议类型,通常为“00” |
| TPDU | DCS | P10 |
1
| 数据编码方案 | 编码方案(7-bit/8-bit/UCS2);详见 [数据编码方案说明](#数据编码方案说明) |
| TPDU | VP | P11 |
1
| 有效期 | 短信在SMSC最大留存时长 |
| TPDU | UDL | P12 |
1
| 用户数据长度 | 用户数据的字节长度 |
| TPDU | UD | P13 |
0~140
| 用户数据 | 实际短信内容 |
### 数据编码方案说明
| **编码类型** | **比特数/字符** | **字符集** | **单条短信最大字符数** | **典型使用场景** |
| --- | --- | --- | --- | --- |
| 7-bit | 7 bit | GSM默认字母表(英文、数字、基础符号) | 160 | 纯英文、数字、简单符号短信 |
| 8-bit | 8 bit (1 byte) | 二进制/ASCII扩展数据 | 140 | 二进制数据(如WAP Push) |
| UCS2 | 16 bit (2 bytes) | Unicode全语种 | 70 | 中文、多语言、emoji、特殊符号 |
# SMS API
## 头文件
*qosa_sms.h*
## 函数概览
| **函数** | **说明** |
| --- | --- |
| *qosa_sms_send_pdu_async()* | 异步模式下发送PDU格式短信 |
| *qosa_sms_read_pdu_async()* | 异步模式下读取PDU格式短信 |
| *qosa_sms_delete_async()* | 异步删除短信 |
| *qosa_sms_get_stor_info()* | 查询SIM卡的短信存储信息 |
| *qosa_sms_get_config()* | 获取 *3GPP TS 27.005* 中定义的短信相关AT指令配置参数 |
| *qosa_sms_set_config()* | 设置 *3GPP TS 27.005* 中定义的短信相关AT指令配置参数 |
| *qosa_sms_get_sca()* | 获取短信中心号码 |
| *qosa_sms_set_sca()* | 设置短信中心号码 |
| *qosa_sms_text_to_pdu()* | 将文本格式短信转换为PDU格式短信 |
| *qosa_sms_text_to_address()* | 转换文本格式地址为二进制格式地址 |
| *qosa_sms_address_to_text()* | 转换二进制格式地址为文本格式地址 |
## 函数详解
### qosa_sms_send_pdu_async
- **功能描述**
异步模式下发送PDU格式短信,无需提前将报文写入短信存储器。
- **函数原型**
```c
qosa_sms_err_e qosa_sms_send_pdu_async(qosa_uint8_t simid, qosa_sms_send_param_t *send, sms_callback_t cb, void *ctx);
```
- **参数说明**
| **参数名** | **输入/输出** | **类型** | **说明** |
| --- | --- | --- | --- |
| *simid* | 输入 | qosa_uint8_t | SIM ID
*0*:SIM卡1
*1*:SIM卡2 |
| *send* | 输入 | *qosa_sms_send_param_t* * | PDU格式短信参数;详见 [*qosa_sms_send_param_t*](#qosasmssendparamt) |
| *cb* | 输入 | *sms_callback_t* | 发送结果回调函数;详见 [*sms_callback_t*](#smscallbackt) |
| *ctx* | 输入 | void * | 用户自定义上下文 |
- **返回值说明**
*QOSA_SMS_SUCCESS*:函数执行成功
其他值:函数执行失败;详见 [*qosa_sms_err_e*](#qosasmserr_e)
```{note}
必须在PDU数据内正确填充目标地址DA字段,否则短信无法正常发送。
```
#### sms_callback_t
- **函数原型**
```c
typedef void (*sms_callback_t)(void *ctx, void *argv);
```
- **参数说明**
| **参数名** | **输入/输出** | **类型** | **说明** |
| --- | --- | --- | --- |
| *ctx* | 输入 | void * | 用户上下文指针 |
| *argv* | 输入 | void * | 回调参数指针 |
### qosa_sms_read_pdu_async
- **功能描述**
异步模式下读取PDU格式短信。
- **函数原型**
```c
qosa_sms_err_e qosa_sms_read_pdu_async(qosa_uint8_t simid, qosa_sms_read_param_t *read, sms_callback_t cb, void *ctx);
```
- **参数说明**
| **参数名** | **输入/输出** | **类型** | **说明** |
| --- | --- | --- | --- |
| *simid* | 输入 | qosa_uint8_t | SIM ID
*0*:SIM卡1
*1*:SIM卡2 |
| *read* | 输入 | *qosa_sms_read_param_t ** | PDU格式短信参数;详见 [*qosa_sms_read_param_t*](#qosasmsreadparamt) |
| *cb* | 输入 | *sms_callback_t* | 读取结果回调函数;详见 [*sms_callback_t*](#smscallbackt) |
| *ctx* | 输入 | void * | 用户自定义上下文 |
- **返回值说明**
*QOSA_SMS_SUCCESS*:函数执行成功
其他值:函数执行失败;详见 [*qosa_sms_err_e*](#qosasmserr_e)
```{note}
此函数为异步接口,原始PDU格式短信数据通过回调函数返回,需自行解析。
```
### qosa_sms_delete_async
- **功能描述**
异步模式下删除短信,支持按单条索引精准删除,也支持按规则批量删除。
- **函数原型**
```c
qosa_sms_err_e qosa_sms_delete_async(qosa_uint8_t simid, qosa_sms_delete_param_t *delete, sms_callback_t cb, void *ctx);
```
- **参数说明**
| **参数名** | **输入/输出** | **类型** | **说明** |
| --- | --- | --- | --- |
| *simid* | 输入 | qosa_uint8_t | SIM ID
*0*:SIM卡1
*1*:SIM卡2 |
| *delete* | 输入 | *qosa_sms_delete_param_t* * | 删除短信的配置;详见 [*qosa_sms_delete_param_t*](#qosasmsdeleteparamt) |
| *cb* | 输入 | *sms_callback_t* | 删除结果回调函数;详见 [*sms_callback_t*](#smscallbackt) |
| *ctx* | 输入 | void * | 用户自定义上下文 |
- **返回值说明**
*QOSA_SMS_SUCCESS*:函数执行成功
其他值:函数执行失败;详见 [*qosa_sms_err_e*](#qosasmserr_e)
```{note}
1. 若按索引删除,需将 *index_or_stat* 配置为 *QOSA_SMS_SELECT_BY_INDEX*,并赋值 *index* 索引号。
2. 若按规则批量删除,需将 *index_or_stat* 配置为 *QOSA_SMS_SELECT_BY_STATUS*,并配置 *delflag* 删除规则。
```
### qosa_sms_get_stor_info
- **功能描述**
查询SIM卡的短信存储信息。
- **函数原型**
```c
qosa_sms_err_e qosa_sms_get_stor_info(qosa_uint8_t simid, qosa_sms_stor_info_t *info);
```
- **参数说明**
| **参数名** | **输入/输出** | **类型** | **说明** |
| --- | --- | --- | --- |
| *simid* | 输入 | qosa_uint8_t | SIM ID
*0*:SIM卡1
*1*:SIM卡2 |
| *info* | 输出 | *qosa_sms_stor_info_t ** | 短信存储信息;详见 [*qosa_sms_stor_info_t*](#qosasmsstorinfot) |
- **返回值说明**
*QOSA_SMS_SUCCESS*:函数执行成功
其他值:函数执行失败;详见 [*qosa_sms_err_e*](#qosasmserr_e)
### qosa_sms_get_config
- **功能描述**
获取 *3GPP TS 27.005* 中定义的短信相关AT指令配置参数。
- **函数原型**
```c
qosa_sms_err_e qosa_sms_get_config(qosa_uint8_t simid, qosa_sms_cfg_t *cfg);
```
- **参数说明**
| **参数名** | **输入/输出** | **类型** | **说明** |
| --- | --- | --- | --- |
| *simid* | 输入 | qosa_uint8_t | SIM ID
*0*:SIM卡1
*1*:SIM卡2 |
| *cfg* | 输出 | *qosa_sms_cfg_t ** | 短信配置参数信息;详见 ***q******osa_sms_cfg******_t*** |
- **返回值说明**
*QOSA_SMS_SUCCESS*
其他值:函数执行失败;详见 [*qosa_sms_err_e*](#qosasmserr_e)
### qosa_sms_set_config
- **功能描述**
设置 *3GPP TS 27.005* 中定义的短信相关AT指令配置参数。
- **函数原型**
```c
qosa_sms_err_e qosa_sms_set_config(qosa_uint8_t simid, qosa_sms_cfg_t *cfg);
```
- **参数说明**
| **参数名** | **输入/输出** | **类型** | **说明** |
| --- | --- | --- | --- |
| *simid* | 输入 | qosa_uint8_t | SIM ID
*0*:SIM卡1
*1*:SIM卡2 |
| *cfg* | 输入 | *qosa_sms_cfg_t ** | 短信配置参数信息;详见 ***q******osa_sms_cfg******_t*** |
- **返回值说明**
*QOSA_SMS_SUCCESS*:函数执行成功
其他值:函数执行失败;详见 [*qosa_sms_err_e*](#qosasmserr_e)
### qosa_sms_get_sca
- **功能描述**
获取短信中心号码。
- **函数原型**
```c
qosa_sms_err_e qosa_sms_get_sca(qosa_uint8_t simid, qosa_sms_address_info_t *sca);
```
- **参数说明**
| **参数名** | **输入/输出** | **类型** | **说明** |
| --- | --- | --- | --- |
| *simid* | 输入 | qosa_uint8_t | SIM ID
*0*:SIM卡1
*1*:SIM卡2 |
| *sca* | 输出 | *qosa_sms_address_info_t ** | 短信中心号码;详见 [*qosa_sms_address_info_t*](#qosasmsaddressinfot) |
- **返回值说明**
*QOSA_SMS_SUCCESS*:函数执行成功
其他值:函数执行失败;详见 [*qosa_sms_err_e*](#qosasmserr_e)
### qosa_sms_set_sca
- **功能描述**
设置短信中心号码。
- **函数原型**
```c
qosa_sms_err_e qosa_sms_set_sca(qosa_uint8_t simid, qosa_sms_address_info_t *sca);
```
- **参数说明**
| **参数名** | **输入/输出** | **类型** | **说明** |
| --- | --- | --- | --- |
| *simid* | 输入 | qosa_uint8_t | SIM ID
*0*:SIM卡1
*1*:SIM卡2 |
| *sca* | 输入 | *qosa_sms_address_info_t ** | 短信中心号码;详见 [*qosa_sms_address_info_t*](#qosasmsaddressinfot) |
- **返回值说明**
*QOSA_SMS_SUCCESS*:函数执行成功
其他值:函数执行失败;详见 [*qosa_sms_err_e*](#qosasmserr_e)
### qosa_sms_text_to_pdu
- **功能描述**
将文本格式短信转换为PDU格式短信。
- **函数原型**
```c
qosa_sms_err_e qosa_sms_text_to_pdu(qosa_sms_msg_t *msg, qosa_sms_record_t *record);
```
- **参数说明**
| **参数名** | **输入/输出** | **类型** | **说明** |
| --- | --- | --- | --- |
| *msg* | 输入 | *qosa_sms_msg_t ** | 文本格式短信;详见 [*qosa_sms_msg_t*](#qosasmsmsg_t) |
| *record* | 输出 | *qosa_sms_record_t ** | PDU格式短信;详见 [*qosa_sms_record_t*](#qosasmsrecord_t) |
- **返回值说明**
*QOSA_SMS_SUCCESS*:函数执行成功
其他值:函数执行失败;详见 [*qosa_sms_err_e*](#qosasmserr_e)
```{note}
在上行短信场景下,需要预先在 *qosa_sms_msg_t* 结构体中手动填充 *fo*、*pid*、*dcs*、*vp* 字段。
```
### qosa_sms_text_to_address
- **功能描述**
转换文本格式地址为二进制格式地址。
- **函数原型**
```c
qosa_sms_err_e qosa_sms_text_to_address(char *text, qosa_uint16_t len, qosa_uint8_t address_type, qosa_sms_address_info_t *address);
```
- **参数说明**
| **参数名** | **输入/输出** | **类型** | **说明** |
| --- | --- | --- | --- |
| *text* | 输入 | char * | 文本格式地址 |
| *len* | 输入 | qosa_uint16_t | 地址长度 |
| *address_type* | 输入 | qosa_uint8_t | 地址类型
*129*:未知/普通号码
*145*:国际号码,号码前带 “+”
*161*:国内号码
*177*:网络特定号码
*193*:用户号码
*209*:字母数字号码
*225*:缩位号码
*241*:保留 |
| *address* | 输出 | *qosa_sms_address_info_t ** | 二进制格式地址;详见 [*qosa_sms_address_info_t*](#qosasmsaddressinfot) |
- **返回值说明**
*QOSA_SMS_SUCCESS*:函数执行成功
其他值:函数执行失败;详见 [*qosa_sms_err_e*](#qosasmserr_e)
### qosa_sms_address_to_text
- **功能描述**
转换二进制格式地址为文本格式地址。
- **函数原型**
```c
qosa_sms_err_e qosa_sms_address_to_text(qosa_sms_address_info_t *address, char *text, qosa_uint16_t len);
```
- **参数说明**
| **参数名** | **输入/输出** | **类型** | **说明** |
| --- | --- | --- | --- |
| *address* | 输入 | *qosa_sms_address_info_t ** | 二进制格式地址;详见 [*qosa_sms_address_info_t*](#qosasmsaddressinfot) |
| *text* | 输出 | char * | 文本格式地址 |
| *len* | 输入 | qosa_uint16_t | 地址长度 |
- **返回值说明**
*QOSA_SMS_SUCCESS*:函数执行成功
其他值:函数执行失败;详见 [*qosa_sms_err_e*](#qosasmserr_e)
## 结构体定义
### qosa_sms_send_param_t
PDU格式短信参数结构体定义如下:
```c
typedef struct{
qosa_sms_pdu_t pdu;
} qosa_sms_send_param_t;
```
| **参数** | **类型** | **说明** |
| --- | --- | --- |
| *pdu* | *qosa_sms_pdu_t* | PDU数据;详见 [*qosa_sms_pdu_t*](#qosasmspdu_t) |
### qosa_sms_pdu_t
PDU数据结构体定义如下:
```c
typedef struct{
qosa_uint8_t data_len;
qosa_uint8_t data[QOSA_SMS_PDU_MAX_LEN];
} qosa_sms_pdu_t;
```
| **参数** | **类型** | **说明** |
| --- | --- | --- |
| *data_len* | qosa_uint8_t | TPDU总字节长度(区分SCA前缀) |
| *data* | qosa_uint8_t | 包含SCA前缀的完整PDU字节数组;最大长度:176字节 |
### qosa_sms_read_param_t
读取PDU格式短信的配置结构体定义如下:
```c
typedef struct{
qosa_sms_stor_e stor;
qosa_uint16_t index;
} qosa_sms_read_param_t;
```
| **参数** | **类型** | **说明** |
| --- | --- | --- |
| *stor* | *qosa_sms_stor_e* | 待读取的短信存储器;详见 [*qosa_sms_stor_e*](#qosasmsstor_e) |
| *index* | qosa_uint16_t | 待读取的短信索引,从0开始计数 |
### qosa_sms_delete_param_t
删除短信的配置结构体定义如下:
```c
typedef struct
{
qosa_sms_stor_e stor;
qosa_sms_select_type_e index_or_stat;
qosa_uint16_t index;
qosa_sms_delflag_e delflag;
} qosa_sms_delete_param_t;
```
| **参数** | **类型** | **说明** |
| --- | --- | --- |
| *stor* | *qosa_sms_stor_e* | 短信存储器;详见 [*qosa_sms_stor_e*](#qosasmsstor_e) |
| *index_or_stat* | *qosa_sms_select_type_e* | 删除模式;详见 [*qosa_sms_select_type_e*](#qosasmsselecttypee) |
| *index* | qosa_uint16_t | 短信索引 |
| *delflag* | *qosa_sms_delflag_e* | 短信删除规则;详见 [*qosa_sms_delflag_e*](#qosasmsdelflag_e) |
### qosa_sms_stor_info_t
短信存储信息结构体定义如下:
```c
typedef struct{
qosa_uint16_t used_sm;
qosa_uint16_t total_sm;
qosa_uint16_t used_me;
qosa_uint16_t total_me;
} qosa_sms_stor_info_t;
```
| **参数** | **类型** | **说明** |
| --- | --- | --- |
| *used_sm* | qosa_uint16_t | SIM卡已用存储容量 |
| *total_sm* | qosa_uint16_t | SIM卡总存储容量 |
| *used_me* | qosa_uint16_t | 移动设备(ME)已用存储容量 |
| *total_me* | *qosa_uint16_t* | 移动设备(ME)总存储容量 |
### qosa_sms_cfg_t
短信配置参数信息结构体定义如下:
```c
typedef struct{
qosa_uint8_t mem1;
qosa_uint8_t mem2;
qosa_uint8_t mem3;
qosa_uint8_t nmi_mode;
qosa_uint8_t nmi_mt;
qosa_uint8_t nmi_bm;
qosa_uint8_t nmi_ds;
qosa_uint8_t nmi_bfr;
qosa_uint8_t service_mode;
qosa_uint8_t text_fo;
qosa_uint8_t text_pid;
qosa_uint8_t text_dcs;
qosa_uint8_t text_vp;
} qosa_sms_cfg_t;
```
| **参数** | **类型** | **说明** |
| --- | --- | --- |
| *mem1* | qosa_uint8_t | 存储器1:用于读取和删除短信;范围:0~255;实际根据模块内存分配决定 |
| *mem2* | qosa_uint8_t | 存储器2:用于写入和发送短信;范围:0~255;实际根据模块内存分配决定 |
| *mem3* | qosa_uint8_t | 存储器3:用于存储接收到的短信;范围:0~255;实际根据模块内存分配决定 |
| *nmi_mode* | qosa_uint8_t | 新消息上报总模式;范围:0~255;实际取值请参考 *3GPP TS 27.005* |
| *nmi_mt* | qosa_uint8_t | 新短信消息上报规则;范围:0~255;实际取值请参考 *3GPP TS 27.005* |
| *nmi_bm* | qosa_uint8_t | 小区广播消息上报规则;范围:0~255;实际取值请参考 *3GPP TS 27.005* |
| *nmi_ds* | qosa_uint8_t | 短信送达状态报告上报规则;范围:0~255;实际取值请参考 *3GPP TS 27.005* |
| *nmi_bfr* | qosa_uint8_t | 缓冲区满时新消息处理规则;范围:0~255;实际取值请参考 *3GPP TS 27.005* |
| *service_mode* | qosa_uint8_t | 短信服务运行模式;范围:0~255;实际取值请参考 *3GPP TS 27.005* |
| *text_fo* | qosa_uint8_t | 文本模式下短信PDU首字节;范围:0~255;实际取值请参考 *3GPP TS 27.005* |
| *text_pid* | qosa_uint8_t | 文本模式下的协议标识符;范围:0~255;实际取值请参考 *3GPP TS 27.005* |
| *text_dcs* | qosa_uint8_t | 文本模式下的数据编码方案;范围:0~255;实际取值请参考 *3GPP TS 27.005* |
| *text_vp* | qosa_uint8_t | 文本模式下的短信有效期;范围:0~255;具体计算方式请参考
*3GPP TS 23.040 9.2.3.12.1 TP-VP (Relative format)* |
### qosa_sms_address_info_t
短信地址结构体定义如下:
```c
typedef struct{
qosa_uint8_t address_type;
qosa_uint8_t address_len;
qosa_uint8_t address_number[QOSA_ADDRESS_MAX_LEN];
} qosa_sms_address_info_t;
```
| **参数** | **类型** | **说明** |
| --- | --- | --- |
| *address_type* | qosa_uint8_t | 地址类型
*129*:未知/普通号码
*145*:国际号码,号码前带“+”
*161*:国内号码
*177*:网络特定号码
*193*:用户号码
*209*:字母数字号码
*225*:缩位号码
*241*:保留 |
| *address_len* | qosa_uint8_t | 地址长度,即号码的数字位数 |
| *address_number* | qosa_uint8_t | 地址号码 |
### qosa_sms_msg_t
文本格式短信结构体定义如下:
```c
typedef struct{
qosa_sms_msg_type_e msg_type;
union
{
qosa_sms_send_t send;
qosa_sms_recv_t recv;
qosa_sms_rept_t report;
} text;
qosa_bool_t is_concatenated;
qosa_sms_concat_t concat;
} qosa_sms_msg_t;
```
| **参数** | **类型** | **说明** |
| --- | --- | --- |
| *msg_type* | *qosa_sms_msg_type_e* | 消息类型;详见 [*qosa_sms_msg_type_e*](#qosasmsmsgtypee) |
| *send* | *qosa_sms_send_t* | 发送消息;详见 [*qosa_sms_send_t*](#qosasmssend_t) |
| *recv* | *qosa_sms_recv_t* | 接收消息;详见 [*qosa_sms_recv_t*](#qosasmsrecv_t) |
| *report* | *qosa_sms_rept_t* | 状态报告;详见 [*qosa_sms_rept_t*](#qosasmsrept_t) |
| *is_concatenated* | qosa_bool_t | 当前消息是否为长短信的拼接部分
*QOSA_TRUE*:是
*QOSA_FALSE*:否 |
| *concat* | *qosa_sms_concat_t* | 长短信拼接信息;详见 [*qosa_sms_concat_t*](#qosasmsconcat_t);此参数仅当 *is_concatenated* 为 *QOSA_TRUE* 时生效 |
### qosa_sms_record_t
PDU格式短信结构体定义如下:
```c
typedef struct{
qosa_uint16_t index;
qosa_sms_status_e status;
qosa_sms_msg_type_e msg_type;
qosa_sms_pdu_t pdu;
} qosa_sms_record_t;
```
| **参数** | **类型** | **说明** |
| --- | --- | --- |
| *index* | qosa_uint16_t | 短信索引 |
| *status* | qosa_sms_status_e | 短信状态;详见 [*qosa_sms_status_e*](#qosasmsstatus_e) |
| *msg_type* | qosa_sms_msg_type_e | 消息类型;详见 [*qosa_sms_msg_type_e*](#qosasmsmsgtypee) |
| *pdu* | qosa_sms_pdu_t | PDU数据;详见 [*qosa_sms_pdu_t*](#qosasmspdu_t) |
### qosa_sms_send_t
发送消息结构体定义如下:
```cpp
typedef struct{
qosa_uint16_t index;
qosa_sms_status_e status;
char sca[QOSA_ADDRESS_MAX_LEN * 4 + 1];
qosa_uint8_t tosca;
qosa_uint8_t fo;
char da[QOSA_ADDRESS_MAX_LEN * 4 + 1];
qosa_uint8_t toda;
qosa_uint8_t pid;
qosa_uint8_t dcs;
qosa_uint8_t vp;
qosa_uint16_t data_len;
qosa_uint8_t data[QOSA_SMS_PDU_MAX_LEN * 4 + 1];
qosa_uint8_t data_chset;
} qosa_sms_send_t;
```
| **参数** | **类型** | **说明** |
| --- | --- | --- |
| *index* | qosa_uint16_t | 短信索引 |
| *status* | *qosa_sms_status_e* | 短信状态;详见 [*qosa_sms_status_e*](#qosasmsstatus_e) |
| *sca* | char | 短信中心地址;最大长度:21字节 |
| *tosca* | qosa_uint8_t | 短信中心地址类型
*129*:未知/普通号码
*145*:国际号码,号码前带“+”
*161*:国内号码
*177*:网络特定号码
*193*:用户号码
*209*:字母数字号码
*225*:缩位号码
*241*:保留 |
| *fo* | qosa_uint8_t | PDU首字节;默认值:17 |
| *da* | char | 目的地址,即接收方地址 |
| *toda* | qosa_uint8_t | 目的地址类型
*129*:未知/普通号码
*145*:国际号码,号码前带“+”
*161*:国内号码
*177*:网络特定号码
*193*:用户号码
*209*:字母数字号码
*225*:缩位号码
*241*:保留 |
| *pid* | qosa_uint8_t | 协议标识符
*0*:普通短信
*64*:Type 0短信,接收端通常不显示
*65*~*71*:替换短信,同类型新短信会替换旧短信
*127*:SIM数据下载短信 |
| *dcs* | qosa_uint8_t | 数据编码方案
*0*:GSM 7-bit默认编码
*4*:8-bit数据编码
*8*:UCS2编码,常用于中文短信 |
| *vp* | qosa_uint8_t | 有效期;具体计算方式请参考
*3GPP TS 23.040 9.2.3.12.1 TP-VP (Relative format)* |
| *data_len* | qosa_uint16_t | 数据长度;文本模式下为数据字节数,PDU模式下为TPDU字节长度 |
| *data* | qosa_uint8_t | 数据内容;文本模式下仅包含TP用户数据中的短信内容,PDU模式下包含所有PDU数据;最大长度:176字节 |
| *data_chset* | qosa_uint8_t | 数据字符集;文本模式下为数据字符集,PDU模式下为TPDU字符集 |
### qosa_sms_recv_t
接收消息结构体定义如下:
```cpp
typedef struct{
qosa_uint16_t index;
qosa_sms_status_e status;
char sca[QOSA_ADDRESS_MAX_LEN * 4 + 1];
qosa_uint8_t tosca;
qosa_uint8_t fo;
char oa[QOSA_ADDRESS_MAX_LEN * 4 + 1];
qosa_uint8_t tooa;
qosa_uint8_t pid;
qosa_uint8_t dcs;
qosa_sms_time_stamp_t scts;
qosa_uint16_t data_len;
qosa_uint8_t data[QOSA_SMS_PDU_MAX_LEN * 4 + 1];
qosa_uint8_t data_chset;
} qosa_sms_recv_t;
```
| **参数** | **类型** | **说明** |
| --- | --- | --- |
| *index* | qosa_uint16_t | 短信索引 |
| *status* | *qosa_sms_status_e* | 短信状态;详见 [*qosa_sms_status_e*](#qosasmsstatus_e) |
| *sca* | char | 短信中心地址;最大长度:21字节 |
| *tosca* | qosa_uint8_t | 短信中心地址类型
*129*:未知/普通号码
*145*:国际号码,号码前带“+”
*161*:国内号码
*177*:网络特定号码
*193*:用户号码
*209*:字母数字号码
*225*:缩位号码
*241*:保留 |
| *fo* | qosa_uint8_t | PDU首字节;默认值:17 |
| *oa* | char | 源地址,即发送方地址;最大长度:21字节 |
| *toda* | qosa_uint8_t | 源地址类型
*129*:未知/普通号码
*145*:国际号码,号码前带“+”
*161*:国内号码
*177*:网络特定号码
*193*:用户号码
*209*:字母数字号码
*225*:缩位号码
*241*:保留 |
| *pid* | qosa_uint8_t | 协议标识符
*0*:普通短信
*64*:Type 0短信,接收端通常不显示
*65*~*71*:替换短信,同类型新短信会替换旧短信
*127*:SIM数据下载短信 |
| *dcs* | qosa_uint8_t | 数据编码方案
*0*:GSM 7-bit默认编码
*4*:8-bit数据编码
*8*:UCS2编码,常用于中文短信 |
| *scts* | *qosa_sms_time_stamp_t* | 短信中心时间戳;详见 [*qosa_sms_time_stamp_t*](#qosasmstimestampt) |
| *data_len* | qosa_uint16_t | 数据长度;文本模式下为数据字节数,PDU模式下为TPDU字节长度 |
| *data* | qosa_uint8_t | 数据内容;文本模式下仅包含TP用户数据中的短信内容,PDU模式下包含所有PDU数据;最大长度:176字节 |
| *data_chset* | qosa_uint8_t | 数据字符集;文本模式下为数据字符集,PDU模式下为TPDU字符集 |
### qosa_sms_rept_t
状态报告结构体定义如下:
```cpp
typedef struct{
qosa_uint16_t index;
qosa_sms_status_e status;
char sca[QOSA_ADDRESS_MAX_LEN * 4 + 1];
qosa_uint8_t tosca;
qosa_uint8_t fo;
qosa_uint8_t mr;
char ra[QOSA_ADDRESS_MAX_LEN * 4 + 1];
qosa_uint8_t tora;
qosa_sms_time_stamp_t scts;
qosa_sms_time_stamp_t dt;
qosa_uint8_t st;
} qosa_sms_rept_t;
```
| **参数** | **类型** | **说明** |
| --- | --- | --- |
| *index* | qosa_uint16_t | 短信索引 |
| *status* | *qosa_sms_status_e* | 短信状态;详见 [*qosa_sms_status_e*](#qosasmsstatus_e) |
| *sca* | char | 短信中心地址;最大长度:21字节 |
| *tosca* | qosa_uint8_t | 短信中心地址类型
*129*:未知/普通号码
*145*:国际号码,号码前带“+”
*161*:国内号码
*177*:网络特定号码
*193*:用户号码
*209*:字母数字号码
*225*:缩位号码
*241*:保留 |
| *fo* | qosa_uint8_t | PDU首字节;默认值:17 |
| mr | qosa_uint8_t | 消息参考编号 |
| *ra* | char | 目的地址,即接收方地址;最大长度:21字节 |
| *tora* | qosa_uint8_t | 目的地址类型
*129*:未知/普通号码
*145*:国际号码,号码前带“+”
*161*:国内号码
*177*:网络特定号码
*193*:用户号码
*209*:字母数字号码
*225*:缩位号码
*241*:保留 |
| *scts* | *qosa_sms_time_stamp_t* | 短信中心时间戳,即SMSC最初接收该消息的时间;详见 [*qosa_sms_time_stamp_t*](#qosasmstimestampt) |
| *dt* | *qosa_sms_time_stamp_t* | 放电时间戳,即SMSC完成投递或放弃投递的时间;详见 [*qosa_sms_time_stamp_t*](#qosasmstimestampt) |
| *st* | *qosa_uint8_t* | TP投递状态码
*0x00*:投递成功
*0x20*~*0x3F*:临时错误,短信中心还会重试
*0x40*~*0x5F*:永久错误,不再重试
*0x60*~*0x7F*:临时错误,但不再重试 |
### qosa_sms_time_stamp_t
时间戳结构体定义如下:
```cpp
typedef struct{
qosa_uint8_t year;
qosa_uint8_t month;
qosa_uint8_t day;
qosa_uint8_t hour;
qosa_uint8_t minute;
qosa_uint8_t second;
qosa_int8_t zone;
} qosa_sms_time_stamp_t;
```
| **参数** | **类型** | **说明** |
| --- | --- | --- |
| *year* | qosa_uint8_t | 年 |
| *month* | qosa_uint8_t | 月 |
| *day* | qosa_uint8_t | 日 |
| *hour* | qosa_uint8_t | 小时 |
| *minute* | qosa_uint8_t | 分钟 |
| *second* | qosa_uint8_t | 秒 |
| *zone* | qosa_int8_t | 时区;相对于UTC的时区偏移量,以15分钟为单位,正数为东时区,负数为西时区
例如:*zone* = *32* 时,32 × 15 = 480 分钟,即东八区UTC+8北京时间 |
### qosa_sms_concat_t
长短信拼接信息结构体定义如下:
```cpp
typedef struct{
qosa_uint16_t msg_ref_number;
qosa_uint8_t msg_seg;
qosa_uint8_t msg_total;
} qosa_sms_concat_t;
```
| **参数** | **类型** | **说明** |
| --- | --- | --- |
| *msg_ref_number* | qosa_uint16_t | 消息参考编号 |
| *msg_seg* | qosa_uint8_t | 消息段序号 |
| *msg_total* | qosa_uint8_t | 消息段总数 |
## 枚举定义
### qosa_sms_err_e
SMS结果码枚举定义如下:
```c
typedef enum
{
QOSA_SMS_SUCCESS = 0,
QOSA_SMS_CMS_UNASSIGNED_NUM = 1 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_OPER_DETERM_BARR = 8 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_CALL_BARRED = 10 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_SM_TRANS_REJE = 21 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS), QOSA_SMS_CMS_DEST_OOS = 27 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_UNINDENT_SUB = 28 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_FACILIT_REJE = 29 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_UNKNOWN_SUB = 30 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_NW_OOO = 38 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_TEMP_FAIL = 41 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS), QOSA_SMS_CMS_CONGESTION = 42 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_RES_UNAVAILABLE = 47 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_REQ_FAC_NOT_SUB = 50 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_RFQ_FAC_NOT_IMP = 69 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_INVALID_SM_TRV = 81 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_INVALID_MSG = 95 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_INVALID_MAND_INFO = 96 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS), QOSA_SMS_CMS_MSG_TYPE_ERROR = 97 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_MSG_NOT_COMP = 98 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_INFO_ELEMENT_ERROR = 99 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_PROT_ERROR = 111 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_IW_UNSPEC = 127 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_TEL_IW_NOT_SUPP = 128 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS), QOSA_SMS_CMS_UNSPEC_TP_ERROR = 143 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_DCS_NOT_SUPP = 144 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_MSG_CLASS_NOT_SUPP = 145 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_UNSPEC_TD_ERROR = 159 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_CMD_CANNOT_ACT = 160 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_CMD_UNSUPP = 161 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_UNSPEC_TC_ERROR = 175 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS), QOSA_SMS_CMS_TPDU_NOT_SUPP = 176 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_SC_BUSY = 192 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_NO_SC_SUB = 193 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_SC_SYS_FAIL = 194 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_INVALID_SME_ADDR = 195 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_DEST_SME_BARR = 196 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_SM_RD_SM = 197 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS), QOSA_SMS_CMS_TP_VPF_NOT_SUPP = 198 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_TP_VP_NOT_SUPP = 199 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_D0_SIM_SMS_STO_FULL = 208 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_NO_SMS_STO_IN_SIM = 209 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_ERR_IN_MS = 210 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_MEM_CAP_EXCEEDED = 211 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_SIM_APP_TK_BUSY = 212 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS), QOSA_SMS_CMS_SIM_DATA_DL_ERROR = 213 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_UNSPEC_ERROR_CAUSE = 255 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_ME_FAIL = 300 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_SMS_SERVICE_RESERVED = 301 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_OPER_NOT_ALLOWED = 302 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_OPER_NOT_SUPP = 303 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS), QOSA_SMS_CMS_INVALID_PDU_PARAM = 304 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_INVALID_TXT_PARAM = 305 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_SIM_NOT_INSERT = 310 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_SIM_PIN_REQUIRED = 311 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_PH_SIM_PIN_REQUIRED = 312 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_SIM_FAIL = 313 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_SIM_BUSY = 314 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_SIM_WRONG = 315 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS), QOSA_SMS_CMS_SIM_PUK_REQUIRED = 316 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_SIM_PIN2_REQUIRED = 317 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_SIM_PUK2_REQUIRED = 318 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_MEM_FAIL = 320 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_INVALID_MEM_INDEX = 321 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_MEM_FULL = 322 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_SCA_ADDR_UNKNOWN = 330 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS), QOSA_SMS_CMS_NO_NW_SERVICE = 331 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_NW_TIMEOUT = 332 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_NO_CNMA_ACK_EXPECTED = 340 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_UNKNOWN_ERROR = 500 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_USER_ABORT = 512 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_UNABLE_TO_STORE = 513 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_INVALID_STATUS = 514 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS), QOSA_SMS_CMS_INVALID_ADDR_CHAR = 515 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_INVALID_LEN = 516 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_INVALID_PDU_CHAR = 517 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_INVALID_PARA = 518 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_INVALID_LEN_OR_CHAR = 519 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_INVALID_TXT_CHAR = 520 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_CMS_TIMER_EXPIRED = 521 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS), QOSA_SMS_CMS_SMS_SEND_FAIL = 530 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_CMS_OFS),
QOSA_SMS_ERROR = 1 | (QOSA_ERRCODE_SMS_BASE + QOSA_AT_ERR_OFS),
QOSA_SMS_NOT_INIT_ERR,
QOSA_SMS_NO_MSG_ERR,
} qosa_sms_err_e;
```
| **成员** | **说明** |
| --- | --- |
| *QOSA_SMS_SUCCESS* | 函数执行成功 |
| *QOSA_SMS_CMS_UNASSIGNED_NUM* | 未分配的号码 |
| *QOSA_SMS_CMS_OPER_DETERM_BARR* | 运营商限制 |
| *QOSA_SMS_CMS_CALL_BARRED* | 呼叫限制 |
| *QOSA_SMS_CMS_SM_TRANS_REJE* | 短消息传输拒绝 |
| *QOSA_SMS_CMS_DEST_OOS* | 接收方不在服务区 |
| *QOSA_SMS_CMS_UNINDENT_SUB* | 未识别的订阅者 |
| *QOSA_SMS_CMS_FACILIT_REJE* | 设施拒绝 |
| *QOSA_SMS_CMS_UNKNOWN_SUB* | 未知用户 |
| *QOSA_SMS_CMS_NW_OOO* | 网络脱机 |
| *QOSA_SMS_CMS_TEMP_FAIL* | 临时性网络故障 |
| *QOSA_SMS_CMS_CONGESTION* | 网络拥塞 |
| *QOSA_SMS_CMS_RES_UNAVAILABLE* | 资源不可用 |
| *QOSA_SMS_CMS_REQ_FAC_NOT_SUB* | 请求的设施未订阅 |
| *QOSA_SMS_CMS_RFQ_FAC_NOT_IMP* | 请求的设施未实现 |
| *QOSA_SMS_CMS_INVALID_SM_TRV* | 无效的短消息传输参考 |
| *QOSA_SMS_CMS_INVALID_MSG* | 无效消息 |
| *QOSA_SMS_CMS_INVALID_MAND_INFO* | 无效的必要信息 |
| *QOSA_SMS_CMS_MSG_TYPE_ERROR* | 消息类型错误 |
| *QOSA_SMS_CMS_MSG_NOT_COMP* | 消息不兼容 |
| *QOSA_SMS_CMS_INFO_ELEMENT_ERROR* | 信息元素错误 |
| *QOSA_SMS_CMS_PROT_ERROR* | 协议错误 |
| *QOSA_SMS_CMS_IW_UNSPEC* | 互操作性问题-未指定 |
| *QOSA_SMS_CMS_TEL_IW_NOT_SUPP* | 不支持的终端互操作 |
| *QOSA_SMS_CMS_UNSPEC_TP_ERROR* | 未指定的传输协议错误 |
| *QOSA_SMS_CMS_DCS_NOT_SUPP* | 不支持的数据编码方案 |
| *QOSA_SMS_CMS_MSG_CLASS_NOT_SUPP* | 不支持的消息类别 |
| *QOSA_SMS_CMS_UNSPEC_TD_ERROR* | 未指定的传输描述错误 |
| *QOSA_SMS_CMS_CMD_CANNOT_ACT* | 命令无法执行 |
| *QOSA_SMS_CMS_CMD_UNSUPP* | 不支持的命令 |
| *QOSA_SMS_CMS_UNSPEC_TC_ERROR* | 未指定的传输控制错误 |
| *QOSA_SMS_CMS_TPDU_NOT_SUPP* | 不支持的TPDU |
| *QOSA_SMS_CMS_SC_BUSY* | 短信中心繁忙 |
| *QOSA_SMS_CMS_NO_SC_SUB* | 未订阅短消息中心 |
| *QOSA_SMS_CMS_SC_SYS_FAIL* | 短消息中心系统故障 |
| *QOSA_SMS_CMS_INVALID_SME_ADDR* | 无效的SME地址 |
| *QOSA_SMS_CMS_DEST_SME_BARR* | 目标SME被限制 |
| *QOSA_SMS_CMS_SM_RD_SM* | 短消息已删除 |
| *QOSA_SMS_CMS_TP_VPF_NOT_SUPP* | 不支持的有效期格式 |
| *QOSA_SMS_CMS_TP_VP_NOT_SUPP* | 不支持的有效期值 |
| *QOSA_SMS_CMS_D0_SIM_SMS_STO_FULL* | SIM卡短信存储空间已满 |
| *QOSA_SMS_CMS_NO_SMS_STO_IN_SIM* | SIM无短信存储区 |
| *QOSA_SMS_CMS_ERR_IN_MS* | 移动台内部错误 |
| *QOSA_SMS_CMS_MEM_CAP_EXCEEDED* | 内存容量超限 |
| *QOSA_SMS_CMS_SIM_APP_TK_BUSY* | SIM卡应用工具包繁忙 |
| *QOSA_SMS_CMS_SIM_DATA_DL_ERROR* | SIM卡数据读写失败 |
| *QOSA_SMS_CMS_UNSPEC_ERROR_CAUSE* | 未指定的错误原因 |
| *QOSA_SMS_CMS_ME_FAIL* | 移动设备故障 |
| *QOSA_SMS_CMS_SMS_SERVICE_RESERVED* | 短信服务被保留 |
| *QOSA_SMS_CMS_OPER_NOT_ALLOWED* | 操作权限被运营商限制 |
| *QOSA_SMS_CMS_OPER_NOT_SUPP* | 当前操作运营商不支持 |
| *QOSA_SMS_CMS_INVALID_PDU_PARAM* | 无效的PDU参数 |
| *QOSA_SMS_CMS_INVALID_TXT_PARAM* | 无效的文本参数 |
| *QOSA_SMS_CMS_SIM_NOT_INSERT* | 未检测到SIM卡 |
| *QOSA_SMS_CMS_SIM_PIN_REQUIRED* | 需要输入SIM PIN解锁 |
| *QOSA_SMS_CMS_PH_SIM_PIN_REQUIRED* | 需要手机锁PIN验证 |
| *QOSA_SMS_CMS_SIM_FAIL* | SIM卡操作失败 |
| *QOSA_SMS_CMS_SIM_BUSY* | SIM卡繁忙 |
| *QOSA_SMS_CMS_SIM_WRONG* | SIM卡错误 |
| *QOSA_SMS_CMS_SIM_PUK_REQUIRED* | SIM卡已锁,需要PUK解锁 |
| *QOSA_SMS_CMS_SIM_PIN2_REQUIRED* | 需要SIM PIN2 |
| *QOSA_SMS_CMS_SIM_PUK2_REQUIRED* | 需要SIM PUK2码解锁 |
| *QOSA_SMS_CMS_MEM_FAIL* | 内存操作失败 |
| *QOSA_SMS_CMS_INVALID_MEM_INDEX* | 无效的存储索引 |
| *QOSA_SMS_CMS_MEM_FULL* | 存储器已满 |
| *QOSA_SMS_CMS_SCA_ADDR_UNKNOWN* | 未知的SCA地址 |
| *QOSA_SMS_CMS_NO_NW_SERVICE* | 无网络服务 |
| *QOSA_SMS_CMS_NW_TIMEOUT* | 网络超时 |
| *QOSA_SMS_CMS_NO_CNMA_ACK_EXPECTED* | 网络下行通知无应答 |
| *QOSA_SMS_CMS_UNKNOWN_ERROR* | 未知错误 |
| *QOSA_SMS_CMS_USER_ABORT* | 用户主动中止短信操作 |
| *QOSA_SMS_CMS_UNABLE_TO_STORE* | 无法存储 |
| *QOSA_SMS_CMS_INVALID_STATUS* | 无效状态 |
| *QOSA_SMS_CMS_INVALID_ADDR_CHAR* | 无效地址字符 |
| *QOSA_SMS_CMS_INVALID_LEN* | 无效长度 |
| *QOSA_SMS_CMS_INVALID_PDU_CHAR* | 无效的PDU字符 |
| *QOSA_SMS_CMS_INVALID_PARA* | 无效的参数 |
| *QOSA_SMS_CMS_INVALID_LEN_OR_CHAR* | 无效的长度或字符 |
| *QOSA_SMS_CMS_INVALID_TXT_CHAR* | 无效的文本字符 |
| *QOSA_SMS_CMS_TIMER_EXPIRED* | 定时器超时 |
| *QOSA_SMS_CMS_SMS_SEND_FAIL* | 短信发送失败 |
| *QOSA_SMS_ERROR* | 通用错误 |
| *QOSA_SMS_NOT_INIT_ERR* | 功能未初始化 |
| *QOSA_SMS_NO_MSG_ERR* | 无可用消息 |
### qosa_sms_stor_e
短信存储器枚举定义如下:
```cpp
typedef enum{
QOSA_SMS_STOR_ME = 0,
QOSA_SMS_STOR_SM = 1,
} qosa_sms_stor_e;
```
| **成员** | **说明** |
| --- | --- |
| *QOSA_SMS_STOR_ME* | 移动设备(ME)存储器 |
| *QOSA_SMS_STOR_SM* | SIM卡存储器 |
### qosa_sms_select_type_e
删除模式枚举定义如下:
```cpp
typedef enum
{
QOSA_SMS_SELECT_BY_INDEX,
QOSA_SMS_SELECT_BY_STATUS,
} qosa_sms_select_type_e;
```
| **成员** | **说明** |
| --- | --- |
| *QOSA_SMS_SELECT_BY_INDEX* | 按短信索引删除 |
| *QOSA_SMS_SELECT_BY_STATUS* | 按删除规则批量删除 |
### qosa_sms_delflag_e
删除规则枚举定义如下:
```cpp
typedef enum{
QOSA_SMS_DEL_INDEX = 0,
QOSA_SMS_DEL_RECV_READ = 1,
QOSA_SMS_DEL_RECV_READ_SENT = 2,
QOSA_SMS_DEL_RECV_READ_MO = 3,
QOSA_SMS_DEL_ALL = 4,
} qosa_sms_delflag_e;
```
| **成员** | **说明** |
| --- | --- |
| *QOSA_SMS_DEL_INDEX* | 删除 *index* 参数指定的短信 |
| *QOSA_SMS_DEL_RECV_READ* | 从 *mem1* 存储器中删除所有已读短信 |
| *QOSA_SMS_DEL_RECV_READ_SENT* | 从 *mem1* 存储器中删除所有已读短信和已发送的短信 |
| *QOSA_SMS_DEL_RECV_READ_MO* | 从 *mem1* 存储器中删除所有已读短信、已发送和未发送的短信 |
| *QOSA_SMS_DEL_ALL* | 删除 *mem1* 存储器中的所有短信 |
### qosa_sms_msg_type_e
消息类型枚举定义如下:
```cpp
typedef enum{
QOSA_SMS_DELIVER = 0,
QOSA_SMS_SUBMIT = 1,
QOSA_SMS_STATUS_REPORT = 2,
} qosa_sms_msg_type_e;
```
| **成员** | **说明** |
| --- | --- |
| *QOSA_SMS_DELIVER* | 下行短信 |
| *QOSA_SMS_SUBMIT* | 上行短信 |
| *QOSA_SMS_STATUS_REPORT* | 短信送达状态报告消息 |
### qosa_sms_status_e
短信状态枚举定义如下:
```cpp
typedef enum{
QOSA_SMS_UNREAD = 0,
QOSA_SMS_READ = 1,
QOSA_SMS_UNSENT = 2,
QOSA_SMS_SENT = 3,
QOSA_SMS_ALL = 4,
} qosa_sms_status_e;
```
| **成员** | **说明** |
| --- | --- |
| *QOSA_SMS_UNREAD* | 已接收但未读 |
| *QOSA_SMS_READ* | 已接收且已读 |
| *QOSA_SMS_UNSENT* | 已存储但未发送 |
| *QOSA_SMS_SENT* | 已存储且已发送 |
| *QOSA_SMS_ALL* | 所有短信 |
# 应用逻辑流程图
```{image} images/board_Z0t9w98bFhsRIybVoAwcqcq7n5d.jpg
:width: 820px
:height: 785px
:align: center
```
# 示例代码
## 完整示例
源码请查看https://github.com/UniRTOS/UniRTOS-Doc-Examples/blob/main/network/sms/sms_demo.c
## 发送PDU短信
源码请查看https://github.com/UniRTOS/UniRTOS-Doc-Examples/blob/main/network/sms/sms_pdu.c
## 发送英文字符短信
源码请查看https://github.com/UniRTOS/UniRTOS-Doc-Examples/blob/main/network/sms/sms_english.c
## 发送中英文字符短信(UCS2编码格式)
源码请查看https://github.com/UniRTOS/UniRTOS-Doc-Examples/blob/main/network/sms/sms_ucs2.c
## 发送中英文字符短信(文本格式)
源码请查看https://github.com/UniRTOS/UniRTOS-Doc-Examples/blob/main/network/sms/sms_txt.c
## 读取短信
源码请查看https://github.com/UniRTOS/UniRTOS-Doc-Examples/blob/main/network/sms/sms_read.c
## 删除短信
源码请查看https://github.com/UniRTOS/UniRTOS-Doc-Examples/blob/main/network/sms/sms_delete.c