HiSpark编程指南

- 调测资料
  - SDK Sample使用指南
    - 前言
    - 概述
    - Sample框架
    - 外设 Sample
    - SLE UART Sample
    - SLE UART DMA Sample
    - SLE Mouse Sample
    - SLE amic vdt with dongle
    - SLE microphone
    - SLE measure dis
    - BLE Lowpower Sample
    - BLE UART Sample
    - BLE Keyboard Sample
    - BLE SLE TAG Sample
    - BLE Mouse Sample
    - USB Keyboard Sample
    - USB Mouse Sample
    - USB AMIC VDT Sample
    - RCU
    - 多连接
    - air mouse
    - SLE MOUSE with Dongle
    - SLE OTA dongle
    - game mouse
    - BLE UUID
    - 缩略语
  - SDK二次开发网络安全注意事项
    - 前言
    - 产品安全解决方案
    - 结论
  - SDK开发环境搭建用户指南
    - 前言
    - 开发环境搭建
    - 编译SDK
    - 新建APP
  - 内存维测指导书
    - 前言
    - 简介
    - 内存维测功能
  - 射频AT测试指南
    - 前言
    - 射频测试AT指令
    - AT指令组包示例
    - 注意事项
  - 维测指导书
    - 前言
    - 概述
    - 日志说明
    - 日志分析
    - 问题定位
    - 典型案例
    - 常见问题FAQ
- 软件资料
  - AT命令使用指南
    - 前言
    - 指令说明
    - 通用AT指令
    - BT业务AT指令
    - 新增AT指令方法
  - DFU升级APK开发指南
    - 前言
    - 功能特性
    - 系统框架
    - 工程文件部署
    - 界面实现
    - 升级界面Fragment实现
    - 关于界面Fragment实现
    - 应用清单AndroidManifest
  - DFX软件开发指南
    - 前言
    - DIAG维测功能
    - 死机诊断
    - Dump解析
  - EFUSE使用指南
    - 前言
    - 概述
    - 使用软件接口读写EFUSE
    - 使用BurnTool烧写EFUSE
  - NFC TAG软件开发指导书
    - 前言
    - 概述
    - 开发指导
  - NV存储用户指南
    - 前言
    - NV简介
    - NV编译预置
    - NV API指南
    - 定制化NV结构使用介绍
    - 通过NV自定义传输数据最大长度
  - Release notes
    - 1.0.18版本描述文件
    - 1.0.17版本描述文件
    - 1.0.16版本描述文件
  - SDK开发指南
    - 前言
    - 概述
    - 系统接口
  - SDK接口变更说明书
    - 前言
    - BLE SDK接口变更说明
  - SP31 SLP使用指南
    - 开源版本
  - USB HID复合设备开发指南
    - 前言
    - 概述
    - 实现方式
  - 代码框架说明
    - 前言
    - SDK模块框架
    - SDK目录结构
    - SDK目录说明
  - 低功耗FAQ
    - 前言
    - 系统无法睡眠
    - IO无法唤醒系统
    - 唤醒后外设异常
    - 低功耗导致OTA升级异常
    - 功耗比预期高
    - 锁中断导致BT业务阻塞
    - 概率性狗超时
    - 供电模式&软件配置
    - 提前唤醒时间问题
  - 低功耗sample使用指南
    - 前言
    - 编译&测试
    - 系统状态管理
    - 用户指南
  - 低功耗开发指南
    - 前言
    - 低功耗概述
    - 低功耗方案
    - 开发指引
    - 功耗优化
    - 常见问题
  - 功率配置说明书
    - 前言
    - 射频功率配置说明
  - 升级方案使用指南
    - 前言
    - 概述
    - 升级包制作
    - 升级包传输
    - 升级包保存
    - 升级包本地升级
    - FAQ
  - 快速入门指南
    - 前言
    - 文档目录
    - 环境搭建
    - 基础功能开发
    - 调优
    - 特性开发
    - 测试报告
  - 星闪应用层SLE-Link协议
    - 前言
    - 概述
    - SLE Frame格式定义
    - 服务接口定义
    - 交互流程示例
  - 星闪软件开发指导书
    - 前言
    - 概述
    - Device Discovery接口
    - Connection Manager接口
    - SSAP Server接口
    - SSAP client接口
    - Low Latency接口
    - Transmission Manager接口
    - SLE Passkey接口
    - SLE Channel Map 接口
  - 红外学习使用指南
    - 前言
    - 红外学习方式
    - 通过比较器进行红外学习
    - 使用指南
  - 蓝牙软件开发指导书
    - 前言
    - 概述
    - GAP接口
    - GATT server接口
    - GATT client接口
  - 设备驱动开发指南
    - 前言
    - Pinctrl
    - GPIO
    - UART
    - SPI
    - I2C
    - ADC
    - DMA
    - PWM
    - WDT
    - Timer
    - Systick
    - TCXO
    - Flash
    - SFC
    - QDEC
    - KEYSCAN
    - PDM
    - USB_HID
    - USB_DFU
    - I2S
    - TRNG
    - 附：MIDDLEWARE
  - 音频编解码开发指导书
    - 前言
    - 概述
    - Audio Encoder
    - Audio Decoder
    - 调试与功能
- 工具资料
  - BurnTool工具使用指导书
    - 前言
    - BurnTool工具简介
    - 操作指南
    - FAQ
  - HiSpark Studio使用指南
    - 前言
    - 工具简介
    - 开发环境搭建
    - 工程管理
    - 工程配置
    - 编译运行
    - 软件包烧录
    - 栈分析和镜像分析
    - 工程调试
    - 串口控制台工具
    - Kconfig配置
    - GUI工程创建与使用
    - 高阶分析功能使用
    - 常见错误

### 该页内容

- 前言
- 指令说明
  - 命令简介
  - 指令类型
  - 注意事项
- 通用AT指令
  - 通用AT指令一览表
  - 通用AT指令描述
    - AT 测试AT功能
    - AT+HELP 查看当前可用AT命令
    - AT+REBOOT
    - AT+SETSLEEP
    - AT+CACHESTATISTIC
    - AT+HEAPSTAT
    - AT+TASKSTACK
    - AT+TASKMALLOC
    - AT+WRITEREG
    - AT+READREG
    - AT+INTLOCKDUMP
    - AT+OSTIMERPRINT
    - AT+OSDFXPRINT
    - AT+PMVETOINFO
    - AT+CPUP
    - AT+GPIODEBUG
    - AT+UARTINONE
- BT业务AT指令
  - BT业务AT指令一览表
    - BLE
      - gap模块AT命令
      - gatts模块AT命令
      - gattc模块AT命令
    - SLE
  - BT业务AT指令描述
    - BLE
      - gap模块AT命令
        - AT+BLEENABLE 使能ble协议栈
        - AT+BLEDISABLE 关闭ble协议栈
        - AT+BLESETADDR 设置本地设备地址
        - AT+BLEGETADDR 获取本地设备地址
        - AT+BLESETNAME 设置本地设备名称
        - AT+BLEGETNAME 获取本地设备名称
        - AT+BLESETAPPEARANCE 设置本地设备外观
        - AT+BLESETADVDATA 设置BLE广播数据
        - AT+BLESETADVPAR 设置广播数据参数
        - AT+BLESTARTADV 开始发送BLE广播
        - AT+BLESTOPADV 停止发送BLE广播
        - AT+BLESETSCANPAR 设置BLE扫描参数
        - AT+BLESTARTSCAN 启动BLE扫描
        - AT+BLESTOPSCAN 停止BLE扫描
        - AT+BLEPAIR 与对端设备发起配对
        - AT+BLEGETPAIREDNUM 获取BLE设备配对设备数量
        - AT+BLEGETPAIREDDEV 获取BLE设备配对设备
        - AT+BLEGETPAIREDSTA 获取BLE设备配对状态
        - AT+BLEUNPAIR 取消配对
        - AT+BLEUNPAIR 取消所有配对
        - AT+BLECONNPARUPD 更新连接参数
        - AT+BLECONN 与BLE设备连接
        - AT+BLEDISCONN 与BLE设备断开连接
        - AT+BLEGAPREGCBK 注册BLE回调函数
        - AT+BLESETDATALEN 设置发送数据包数据长度
        - AT+BLESETPHY 设置phy
      - gatts模块AT命令
        - AT+GATTSREGSRV 创建一个GATT server
        - AT+GATTSUNREG 删除GATT server，释放资源
        - AT+GATTSADDSERV 添加一个GATT服务
        - AT+GATTSSYNCADDSERV 添加一个GATT服务（同步）
        - AT+GATTSADDCHAR 为GATT服务添加一个特征
        - AT+GATTSSYNCADDCHAR 为GATT服务添加一个特征（同步）
        - AT+GATTSADDDESCR 为最新的特征添加一个描述符
        - AT+GATTSSYNCADDDESCR 为最新的特征添加一个描述符（同步）
        - AT+GATTSSTARTSERV 启动指定的GATT服务
        - AT+GATTSDELALLSERV 删除指定server上的所有服务
        - AT+GATTSSENDRSP 发送响应
        - AT+GATTSSNDNTFY 发送通知或指示
        - AT+GATTSSNDNTFYBYUUID 根据uuid发送通知或指示
        - AT+GATTSREGCBK 注册GATT服务端回调函数
        - AT+GATTSSETMTU 在连接之前设置server rx mtu
      - gattc模块AT命令
        - AT+GATTCREG 创建一个GATT client
        - AT+GATTCUNREG 删除GATT client，释放资源
        - AT+GATTCFNDSERV 发现服务
        - AT+GATTCFNDCHAR 发现特征
        - AT+GATTCFNDDESCR 发现描述符
        - AT+GATTCREADBYHDL 读取by hdl
        - AT+GATTCREADBYUUID 读取by_uuid
        - AT+GATTCWRITEREQ 写by hdl req
        - AT+GATTCWRITECMD 写by hdl cmd
        - AT+GATTCEXCHMTU 交换MTU请求
        - AT+GATTCREGCBK 注册GATT客户端回调函数
    - SLE
      - SLE Device Discovery模块指令描述
        - SLE使能
        - SLE去使能
        - 设置SLE广播参数
        - 设置SLE广播数据
        - 起SLE广播
        - 停SLE广播
        - 设置扫描参数
        - 使能扫描
        - 关闭扫描
        - 设置本端名称
        - 获取本端名称
        - 设置本端地址
        - 获取本端地址
      - SLE Connection manager模块指令描述
        - 建立SLE连接
        - 星闪逻辑链路更新参数
        - 星闪读取远端rssi
        - 注册SLE连接模块和安全模块AT指令的串口打印回调函数
        - 断开SLE连接
        - 设置SLE PHY
        - 设置SLE 默认连接参数
        - SLE断开所有连接
      - SLE security management模块指令描述
        - 进行加密配对
        - 移除加密配对
        - 获取配对设备数目
        - 获取配对设备
        - 获取设备配对状态
        - 获取绑定设备
      - ssap server模块指令描述
        - 注册服务端
        - 去注册服务端
        - 添加服务
        - 添加服务同步
        - 添加属性
        - 添加属性同步
        - 添加属性描述符
        - 添加属性描述符同步
        - 服务端向客户端发送通知
        - 服务端向客户端通过uuid发送通知
        - 服务端发送响应
        - 服务端注册回调
        - start service
      - ssap client模块指令描述
        - 注册SSAPC回调函数
        - 发现service
        - 客户端向服务端写入数据
        - 客户端向服务端发送写请求
        - 客户端发起信息交换
        - 客户端通过uuid发送读请求
        - 客户端读取服务端属性数据
  - 常用AT指令示例
    - BLE
      - 配置server
      - 配置client
      - 其他AT指令示例
        - 扫描参数设置
        - 开启扫描
    - SLE
      - 配置server
      - 配置client
      - 其他AT指令示例
        - 开启扫描
- 新增AT指令方法
  - 添加AT调试
  - 添加自定义命令

# 前言

概述

本文介绍BS2XV100的AT指令式及场景，为用户提供相应的指令格式和参数示例解释（本文档以BS21为例进行说明，后续不再备注说明）。

产品版本

与本文档相对应的产品版本如下。

产品名称 | 产品版本
--- | ---
BS2X | V100

读者对象

本文档主要适用于以下工程师：

- 技术支持工程师

- 软件开发工程师

符号约定

在本文中可能出现下列标志，它们所代表的含义如下。

符号 | 说明
--- | ---
| 表示如不避免则将会导致死亡或严重伤害的具有高等级风险的危害。
| 表示如不避免则可能导致死亡或严重伤害的具有中等级风险的危害。
| 表示如不避免则可能导致轻微或中度伤害的具有低等级风险的危害。
| 用于传递设备或环境安全警示信息。如不避免则可能会导致设备损坏、数据丢失、设备性能降低或其它不可预知的结果。 “须知”不涉及人身伤害。
| 对正文中重点信息的补充说明。 “说明”不是安全警示信息，不涉及人身、设备及环境伤害信息。

修改记录

文档版本 | 发布日期 | 修改说明
--- | --- | ---
07 | 2025-12-01 | 更新“服务端发送响应”章节内容。
06 | 2025-11-07 | 更新“指令说明”的“注意事项”章节内容。 更新“BLE”的“配置server”章节内容。
05 | 2025-08-29 | 更新“BT业务AT指令一览表”的“gatts模块AT命令”章节内容。 更新“BT业务AT指令描述”的“AT+GATTSUNREG 删除GATT server，释放资源”章节内容。 新增“注册SLE连接模块和安全模块AT指令的串口打印回调函数”章节内容。
04 | 2025-05-30 | 更新“通用AT指令一览表”章节内容。 更新“通用AT指令描述”章节内容。 新增“AT+BLESETPHY 设置phy”章节内容。 更新“获取设备配对状态”章节内容。 更新“服务端向客户端发送通知”章节内容。 新增“常用AT指令示例”章节内容。
03 | 2025-01-14 | 更新“星闪读取远端rssi”章节内容。
02 | 2024-09-13 | 新增“AT+BLESETDATALEN 设置发送数据包数据长度”章节内容。 更新“新增AT指令方法”章节内容。
01 | 2024-05-15 | 第一次正式版本发布。
00B02 | 2024-03-01 | 新增“BT业务AT指令”的“BLE”章节内容。 新增“BT业务AT指令”的“SLE”章节内容。
00B01 | 2024-01-08 | 第一次临时版本发布。

# 指令说明

## 命令简介

AT命令用于TE（例如：PC等用户终端）和MT（例如：移动台等移动终端）之间控制信息的交互，如图1所示。

图 1 AT命令示意图

## 指令类型

AT指令类型如表1所示。

表 1 AT指令类型说明

类型 | 格式 | 用途
--- | --- | ---
测试指令 | AT+<cmd>=? | 该命令用于查询设置指令的参数以及取值范围。
查询指令 | AT+<cmd>? | 该命令用于返回参数的当前值。
设置指令 | AT+<cmd>=<parameter>,… | 设置参数值或执行。
执行指令 | AT+<cmd> | 用于执行本指令的功能。

## 注意事项

- 不是每一条指令都具备上述4种类型的命令。

- 文档中有但当前软件版本不支持的AT指令会返回ERROR:TBD。

- 双引号表示字符串数据“string”，例如：AT+SCANSSID=“string”。

- 串口通信默认：波特率为115200、8个数据位、1个停止位、无校验。

- [ ]内为可选值，参数可选。

- 命令中的参数以“,”作为分隔符，除双引号括起来的字符串参数外，不支持参数本身带“,”。

- AT指令中的参数不能有多余的空格。

- AT指令必须大写，且必须以回车换行符作为结尾（CR LF），部分串口工具在用户敲击键盘回车键时只有回车符（CR）没有换行符（LF），导致AT指令无法识别，如需使用串口工具手动输入AT指令，需在串口工具中将回车键设置为回车符（CR）+换行符（LF）。以IPOP V4.1和SecureCRT8.1为例，说明如图1、图2所示。

  图 1 IPOP V4.1 CR+LF设置示例

  图 2 SecureCRT8.1 CR+LF设置示例

- AT命令默认最大长度为128个字符，参数可配置。通过Kconfig（menuconfig），（Top）->Middleware->Utils->AT->Config AT，修改The max length of AT comand参数

- AT命令默认单个参数最大长度为128字节，参数可配置。修改middleware/chips/bs2x/at/at_cmd_porting/at_porting.c中，修改AT_RX_BUFF_SIZE大小

# 通用AT指令

## 通用AT指令一览表

表 1 通用AT指令说明

指令 | 描述
--- | ---
AT | 测试AT功能。
AT+TESTSUITE | AT调试切换为TESTSUITE调试。
AT+REBOOT | 芯片软复位。
AT+WRITEREG | 通过AT写寄存器，需要打开宏REG_OPERATION。
AT+READREG | 通过AT读寄存器，需要打开宏REG_OPERATION。
AT+SETSLEEP | 通过AT投睡眠票，需要打开宏SLP_VETO_AT_SUPPORT。
AT+HEAPSTAT | 打印堆使用情况。
AT+TASKSTACK | 打印每个任务栈使用情况。
AT+TASKMALLOC | 打印每个任务内存申请情况。
AT+INTLOCKDUMP | 打印锁中断时长排名前10的函数。
AT+OSTIMERPRINT | 打印目前创建的Timer情况。
AT+OSDFXPRINT | 打印线程切换轨迹和最近的10次中断。
AT+PMVETOINFO | 通过AT投低功耗票，需要打开宏SLP_VETO_AT_SUPPORT。
AT+CPUP | 通过AT打印CPU占用率情况，需要LiteOS版本内打开宏LOSCFG_KERNEL_CPUP。

## 通用AT指令描述

### AT 测试AT功能

表 1 AT测试说明

格式 | AT
响应 | OK
参数说明 | -
示例 | AT
注意 | -

### AT+HELP 查看当前可用AT命令

表 1 查看可用AT命令说明

格式 | AT+HELP
响应 | +HELP: 显示当前支持的AT命令 OK
参数说明 | -
示例 | AT+HELP
注意 | -

### AT+REBOOT

格式 | AT+REBOOT
响应 | 软复位芯片 OK
参数说明 | -
示例 | AT+REBOOT
注意 | -

### AT+SETSLEEP

格式 | AT+SETSLEEP=para
响应 | disable enter sleep. OK enable enter sleep. OK
参数说明 | 0：禁止进入睡眠 1：允许进入睡眠
示例 | AT+HELP=0
注意 | 需要打开ENABLE_LOW_POWER

### AT+CACHESTATISTIC

格式 | AT+CACHESTATISTIC=para
响应 | 开启或关闭cache的命中率统计 OK
参数说明 | para： 0：关闭 1：开启
示例 | AT+CACHESTATISTIC=1
注意 | 需要打开CACHE_SUPPORT_DEBUG

### AT+HEAPSTAT

格式 | AT+HEAPSTAT
响应 | 打印所有线程堆内存申请信息 OK
参数说明 | -
示例 | AT+HEAPSTAT
注意 | -

### AT+TASKSTACK

格式 | AT+TASKSTACK
响应 | 打印所有线程栈信息 OK
参数说明 | -
示例 | AT+TASKSTACK
注意 | -

### AT+TASKMALLOC

格式 | AT+TASKMALLOC=para
响应 | 打印某个线程堆内存申请信息 OK
参数说明 | <task_id>：线程ID
示例 | AT+TASKMALLOC=2
注意 | -

### AT+WRITEREG

格式 | AT+WRITEREG=para0,para1
响应 | 写寄存器 OK
参数说明 | para0：寄存器地址 para1：写入寄存器的值
示例 | AT+WRITEREG=0x57000014,0x5a5a
注意 | 需要打开REG_OPERATION

### AT+READREG

格式 | AT+READREG=para0,para1
响应 | 读寄存器 addr：para0 = value OK
参数说明 | para0：读寄存器起始地址 para1：读寄存器的长度
示例 | AT+READREG=0x57000010,4
注意 | 需要打开REG_OPERATION

### AT+INTLOCKDUMP

格式 | AT+INTLOCKDUMP
响应 | 打印锁中断时长排名前10的函数 osal_print_irq_record: type[0:lock, 1:unlock, 2:restore 3 enter 4 exit] OK
参数说明 | -
示例 | AT+INTLOCKDUMP
注意 | 需要打开OSAL_IRQ_RECORD_DEBUG

### AT+OSTIMERPRINT

格式 | AT+OSTIMERPRINT
响应 | 打印当前创建了延时的线程和创建的软Timer情况 [task]: taskId = %d, taskName = %s, taskStatus = %d [swtmr]: timerId = 0x%x, handler = 0x%x, interval = %d, state = %d OK
参数说明 | -
示例 | AT+OSTIMERPRINT
注意 | 需要打开OS_TIMER_DEBUG_SUPPORT，status对应的状态在los_task_base.h和los_swtmr_pri.h中查询

### AT+OSDFXPRINT

格式 | AT+OSDFXPRINT
响应 | 打印线程切换轨迹和最近的10次中断 <Task id>:x x x x x x <Interrupt num>: x x x OK
参数说明 | -
示例 | AT+OSDFXPRINT
注意 | 需要打开OS_DFX_SUPPORT

### AT+PMVETOINFO

格式 | AT+PMVETOINFO
响应 | [pm_veto]: total_counts = 通过AT投低功耗票 OK
参数说明 | -
示例 | AT+PMVETOINFO
注意 | 需要打开SLP_VETO_AT_SUPPORT

### AT+CPUP

格式 | AT+CPUP
响应 | 统计CPU占用率 OK
参数说明 | -
示例 | AT+CPUP
注意 | 需要LiteOS版本内打开宏LOSCFG_KERNEL_CPUP、LOSCFG_DEBUG_TASK、LOSCFG_DEBUG_HWI

### AT+GPIODEBUG

格式 | AT+GPIODEBUG
响应 | 打印各个GPIO方向、输出高低等配置 OK
参数说明 | -
示例 | AT+GPIODEBUG
注意 | 需要打开GPIO_SUPPORT_DEBUG

### AT+UARTINONE

格式 | AT+UARTINONE=para
响应 | AT串口输出到HSO OK
参数说明 | para：1表示将AT串口输出到HSO
示例 | AT+UARTINONE=1
注意 | 需要打开UART_SUPPORT_ALL_IN_ONE

# BT业务AT指令

## BT业务AT指令一览表

### BLE

#### gap模块AT命令

指令 | 描述
--- | ---
AT+BLEENABLE | 使能BLE协议栈。
AT+BLEDISABLE | 关闭BLE协议栈。
AT+BLESETADDR=<参数> | 设置本地设备地址。
AT+BLEGETADDR | 获取本地设备地址。
AT+BLESETNAME=<参数> | 设置本地设备名称。
AT+BLEGETNAME | 获取本地设备名称。
AT+BLESETAPPEARANCE=<参数> | 设置本地设备外观。
AT+BLESETADVDATA=<参数> | 设置BLE广播数据。
AT+BLESETADVPAR=<参数> | 设置BLE广播参数。
AT+BLESTARTADV=<参数> | 开始发送BLE广播。
AT+BLESTOPADV=<参数> | 停止发送BLE广播。
AT+BLESETSCANPAR=<参数> | 设置BLE扫描参数。
AT+BLESTARTSCAN | 启动BLE扫描。
AT+BLESTOPSCAN | 停止BLE扫描。
AT+BLEPAIR=<参数> | 与对端设备发起配对。
AT+BLEGETPAIREDNUM | 获取BLE设备配对设备数量。
AT+BLEGETPAIREDDEV | 获取BLE设备配对设备。
AT+BLEGETPAIREDSTA=<参数> | 获取BLE设备配对状态。
AT+BLEUNPAIR=<参数> | 取消配对。
AT+BLEUNPAIRALL | 取消所有配对。
AT+BLECONNPARUPD=<参数> | 连接参数更新。
AT+BLECONN=<参数> | 与BLE设备连接。
AT+BLEDISCONN=<参数> | 断开BLE设备连接。
AT+BLEGAPREGCBK | 注册gap回调函数。
AT+BLESETDATALEN=<参数> | 设置链路数据包的数据长度。

#### gatts模块AT命令

指令 | 描述
--- | ---
AT+GATTSREGSRV=<参数> | 创建一个GATT server。
AT+GATTSUNREG=<参数> | 删除GATT server，释放资源。
AT+GATTSADDSERV=<参数> | 添加一个GATT服务。
AT+GATTSSYNCADDSERV=<参数> | 添加一个GATT服务（同步）。
AT+GATTSADDCHAR=<参数> | 为GATT服务添加一个特征。
AT+GATTSSYNCADDCHAR=<参数> | 为GATT服务添加一个特征（同步）。
AT+GATTSADDDESCR=<参数> | 为最新的特征添加一个描述符。
AT+GATTSSYNCADDDESCR=<参数> | 为最新的特征添加一个描述符（同步）。
AT+GATTSSTARTSERV=<参数> | 启动指定的GATT服务。
AT+GATTSDELALLSERV=<参数> | 删除指定server上的所有服务。
AT+GATTSSENDRSP=<参数> | 发送响应。
AT+GATTSSNDNTFY=<参数> | 发送通知或指示。
AT+GATTSSNDNTFYBYUUID=<参数> | 根据uuid发送通知或指示。
AT+GATTSREGCBK | 注册GATT服务端回调函数。
AT+GATTSSETMTU=<参数> | 在连接之前设置server rx mtu。

#### gattc模块AT命令

指令 | 描述
--- | ---
AT+GATTCREG=<参数> | 创建一个GATT client。
AT+GATTCUNREG=<参数> | 删除GATT client，释放资源。
AT+GATTCFNDSERV=<参数> | 发现所有服务（可by uuid）。
AT+GATTCFNDCHAR=<参数> | 发现所有特征。
AT+GATTCFNDDESCR=<参数> | 发现所有描述符。
AT+GATTCREADBYHDL=<参数> | 读取by hdl。
AT+GATTCREADBYUUID=<参数> | 读取by_uuid
AT+GATTCWRITEREQ=<参数> | 写by hdl req。
AT+GATTCWRITECMD=<参数> | 写by hdl cmd。
AT+GATTCEXCHMTU=<参数> | 交换mtu请求。
AT+GATTCREGCBK | 注册GATT客户端回调函数。

### SLE

指令 | 描述
--- | ---
AT+SLEENABLE | SLE使能。
AT+SLESETADVPAR | 设置SLE广播参数。
AT+SLESETADVDATA | 设置指令。
AT+SLESTARTADV | 起SLE广播。
AT+SLESTOPADV | 停SLE广播。
AT+SLESTARTSCAN | 启动扫描。
AT+SLESTOPSCAN | 关闭扫描。
AT+SLESETNAME | 设置本端名称。
AT+SLEGETNAME | 获取本端名称。
AT+SLESETADDR | 设置本端地址。
AT+SLEGETADDR | 获取本端地址。
AT+SLECONN | 建立SLE连接。
AT+SLEDISCONN | 断开SLE连接。
AT+SLESETPHY | 设置SLE PHY。
AT+SLESETDEFAULTCONNP | 设置SLE 默认连接参数。
AT+SLEPAIR | 进行加密配对。
AT+SLEUNPAIR | 移除加密配对。
AT+SLEGETPAIREDNUM | 获取配对设备数目。
AT+SLEGETPAIRDEV | 获取配对设备。
AT+SLEGETPAIRSTA | 获取配对状态。
AT+SLEGETBONDDEV | 获取绑定设备状态。
AT+SLECONNPARUPD | 星闪逻辑链路更新参数。
AT+SLEREADPEERRSSI | 读取对端rssi。
AT+SLEREGCONNCBK | 注册SLE连接模块和安全模块AT指令的串口打印回调函数
AT+SSAPSADDSRV | 注册服务端。
AT+SSAPSDELALLSRV | 删除服务端。
AT+SSAPSADDSERV | 添加服务。
AT+SSAPSSYNCADDSERV | 添加服务同步。
AT+SSAPSADDPROPERTY | 添加属性。
AT+SSAPSSYNCADDPROPERTY | 添加属性同步。
AT+SSAPSADDDESCR | 添加属性描述符。
AT+SSAPSSYNCADDDESCR | 添加属性描述符同步。
AT+SSAPSSTARTSERV | start service。
AT+SSAPSSNDNTFY | 服务端向客户端发送通知。
AT+SSAPSNTFYBYUUID | 服务端向客户端通过uuid发送通知。
AT+SSAPSSNDRESP | 服务端向客户端发送响应。
AT+SSAPSREGCBK | 服务端注册回调函数。
AT+SSAPCREGCBK | 注册SSAPC回调函数。
AT+SSAPCFNDSTRU | 发现service。
AT+SSAPCWRITECMD | 客户端向服务端写入数据。
AT+SSAPCWRITEREQ | 客户端向服务端发送写请求。
AT+SSAPCEXCHINFO | 客户端发起信息交换。
AT+SSAPCREADBYUUID | 客户端通过uuid发送读请求。
AT+SSAPCREADREQ | 客户端读取服务端属性数据。
AT+SLESETSCANPAR | 设置扫描参数。
AT+SLEDISCONNALL | SLE断开所有连接。

## BT业务AT指令描述

### BLE

#### gap模块AT命令

##### AT+BLEENABLE 使能ble协议栈

格式 | AT+BLEENABLE
响应 | 打开BLE开关 成功：OK
参数说明 | -
示例 | AT+BLEENABLE
注意 | -

##### AT+BLEDISABLE 关闭ble协议栈

格式 | AT+BLEDISABLE
响应 | 关闭BLE开关 成功：OK
参数说明 | -
示例 | AT+BLEDISABLE
注意 | -

##### AT+BLESETADDR 设置本地设备地址

格式 | AT+BLESETADDR=<addr_type,addr>
响应 | 成功：OK 失败：ERROR
参数说明 | <addr_type>：蓝牙设备类型 <addr>：蓝牙设备地址
示例 | AT+BLESETADDR=0,0x112233445566
注意 | 设备类型取值范围： 0：公共设备地址 1：随机设备地址 2：公共本端地址 3：随机静态本端地址 设备地址为长度为14的字符串

##### AT+BLEGETADDR 获取本地设备地址

格式 | AT+BLEGETADDR
响应 | 成功：本地设备地址 失败：ERROR
参数说明 | -
示例 | AT+BLEGETADDR
注意 | -

##### AT+BLESETNAME 设置本地设备名称

格式 | AT+BLESETNAME=<len,name>
响应 | 成功：OK 失败：ERROR
参数说明 | <len>：本地设备名称长度 <name>：本地设备名称
示例 | AT+BLESETNAME=10,atcmdtest
注意 | 名称长度取值范围为[0,255]，设备名称长度为len-1的字符串，名称最后默认存在’/0’

##### AT+BLEGETNAME 获取本地设备名称

格式 | AT+BLEGETNAME
响应 | 成功：本地设备名称 失败：ERROR
参数说明 | -
示例 | AT+BLEGETNAME
注意 | -

##### AT+BLESETAPPEARANCE 设置本地设备外观

格式 | AT+BLESETAPPEARANCE=<appearance>
响应 | 成功：OK 失败：ERROR
参数说明 | <appearance>：本地设备外观
示例 | AT+BLESETAPPEARANCE=961
注意 | 参数值应为规定值，示例中961为键盘的外观值，具体请参考表1

##### AT+BLESETADVDATA 设置BLE广播数据

格式 | AT+BLESETADVDATA=<adv_length,adv_data,scan_rsp_length,scan_rsp_data,adv_id>
响应 | 成功：OK 失败：ERROR
参数说明 | <adv_length>：广播数据长度（普通广播数据长度最大为31字节，拓展广播数据长度最大为251字节（实际为190字节，BTC限制）） <adv_data>：广播数据 <scan_rsp_length>：扫描返回数据长度 <scan_rsp_data>：扫描返回数据 <adv_id>：广播id
示例 | AT+BLESETADVDATA=6,0x112233445566,0,0,1
注意 | 广播数据长度单位为字节，所以广播数据应为长度两倍的字符串，扫描返回数据同理，广播ID取值范围为1~255

##### AT+BLESETADVPAR 设置广播数据参数

格式 | AT+BLESETADVPAR=<min_interval,max_interval,adv_type,own_addr,peer_addr_type,peer_addr,channel_map,adv_filter_policy,tx_power,duration,adv_id>
响应 | 成功：OK 失败：ERROR
参数说明 | <min_interval>：最小扫描间隔；取值范围[0x20, 0x4000],Time=N×0.625ms <max_interval>：最大扫描间隔；取值范围[0x20, 0x4000],Time=N×0.625ms <adv_type>：广播类型 <own_addr>：本端地址 <peer_addr_type>：对端地址类型 <peer_addr>：对端地址 <channel_map>：信道；取值范围为[0x01, 0x07] <adv_filter_policy>：过滤策略 <tx_power>：扫描功率 <duration>：扫描周期；仅取值为0 <adv_id>：广播ID；取值范围1~255
示例 | AT+BLESETADVPAR=48,48,0,0x112233445577,0,0x112233445566,7,0,1,0,1
注意 | -

##### AT+BLESTARTADV 开始发送BLE广播

格式 | AT+BLESTARTADV=<adv_id>
响应 | 成功：OK 失败：ERROR
参数说明 | <adv_id>：广播id
示例 | AT+BLESTARTADV=1
注意 | -

##### AT+BLESTOPADV 停止发送BLE广播

格式 | AT+BLESTOPADV=<adv_id>
响应 | 成功：OK 失败：ERROR
参数说明 | <adv_id>：广播id
示例 | AT+BLESTOPADV=1
注意 | -

##### AT+BLESETSCANPAR 设置BLE扫描参数

格式 | AT+BLESETSCANPAR=<scan_interval,scan_window,scan_type,scan_phy,scan_rsp_policy>
响应 | 成功：OK 失败：ERROR
参数说明 | <scan_interval>：扫描间隔；取值范围[0x04, 0x4000]，Time=N×0.625ms <scan_window>：扫描窗口；取值范围[0x04, 0x4000]，Time=N×0.625ms <scan_type>：扫描类型；{0（被动扫描）,1（主动扫描）} <scan_phy>：扫描phy <scan_rsp_policy>：扫描过滤策略
示例 | AT+BLESETSCANPAR=0x48,0x48,0,1,0
注意 | -

##### AT+BLESTARTSCAN 启动BLE扫描

格式 | AT+BLESTARTSCAN
响应 | 成功：OK 失败：ERROR
参数说明 | -
示例 | AT+BLESTARTSCAN
注意 | -

##### AT+BLESTOPSCAN 停止BLE扫描

格式 | AT+BLESTOPSCAN
响应 | 成功：OK 失败：ERROR
参数说明 | -
示例 | AT+BLESTOPSCAN
注意 | -

##### AT+BLEPAIR 与对端设备发起配对

格式 | AT+BLEPAIR=<addr_type,addr>
响应 | 成功：OK 失败：ERROR
参数说明 | <addr_type>：蓝牙设备类型 <addr>：蓝牙设备地址
示例 | AT+BLEPAIR=0,0x112233445566
注意 | 设备类型取值范围： 0：公共设备地址 1：随机设备地址 2：公共本端地址 3：随机静态本端地址 设备地址为长度为14的字符串；配对之前先进行连接

##### AT+BLEGETPAIREDNUM 获取BLE设备配对设备数量

格式 | AT+BLEGETPAIREDNUM
响应 | 成功：配对设备数量 失败：ERROR
参数说明 | -
示例 | AT+BLEGETPAIREDNUM
注意 | -

##### AT+BLEGETPAIREDDEV 获取BLE设备配对设备

格式 | AT+BLEGETPAIREDDEV
响应 | 成功：配对设备地址 失败：ERROR
参数说明 | -
示例 | AT+BLEGETPAIREDDEV
注意 | -

##### AT+BLEGETPAIREDSTA 获取BLE设备配对状态

格式 | AT+BLEGETPAIREDSTA=<addr_type,addr>
响应 | 成功：BLE设备配对状态 失败：ERROR
参数说明 | <addr_type>：蓝牙设备类型 <addr>：蓝牙设备地址
示例 | AT+BLEGETPAIREDSTA=0,0x112233445566
注意 | 设备类型取值范围： 0：公共设备地址 1：随机设备地址 2：公共本端地址 3：随机静态本端地址 设备地址为长度为14的字符串

##### AT+BLEUNPAIR 取消配对

格式 | AT+BLEUNPAIR=<addr_type,addr>
响应 | 成功：断连 失败：ERROR
参数说明 | <addr_type>：蓝牙设备类型 <addr>：蓝牙设备地址
示例 | AT+BLEUNPAIR=0,0x112233445566
注意 | 设备类型取值范围： 0：公共设备地址 1：随机设备地址 2：公共本端地址 3：随机静态本端地址 设备地址为长度为14的字符串

##### AT+BLEUNPAIR 取消所有配对

格式 | AT+BLEUNPAIR
响应 | 成功：断连 失败：ERROR
参数说明 | -
示例 | AT+BLEUNPAIR
注意 | -

##### AT+BLECONNPARUPD 更新连接参数

格式 | AT+BLECONNPARUPD=<conn_handle,interval_min,interval_max,slave_latency,timeout_multiplier>
响应 | 成功：OK 失败：ERROR
参数说明 | <conn_handle>：连接句柄 <interval_min>：链路调度最小间隔，[0x06, 0x0C80]，Time=N×1.25ms <interval_max>：链路调度最大间隔，[0x06, 0x0C80]，Time=N×1.25ms <slave_latency>：延迟周期，单位slot（该值表示在设置值的周期内可以不回复, 为0时则表示每包都需回复） <timeout_multiplier>：超时断连间隔
示例 | AT+BLECONNPARUPD=0，0x48,0x48,0,500
注意 | -

##### AT+BLECONN 与BLE设备连接

格式 | AT+BLECONN=<addr_type,addr>
响应 | 成功：OK 失败：ERROR
参数说明 | <addr_type>：蓝牙设备类型 <addr>：蓝牙设备地址
示例 | AT+BLECONN=0,0x112233445566
注意 | 设备类型取值范围： 0：公共设备地址 1：随机设备地址 2：公共本端地址 3：随机静态本端地址 设备地址为长度为14的字符串

##### AT+BLEDISCONN 与BLE设备断开连接

格式 | AT+BLEDISCONN=<addr_type,addr>
响应 | 成功：OK 失败：ERROR
参数说明 | <addr_type>：蓝牙设备类型 <addr>：蓝牙设备地址
示例 | AT+BLEDISCONN=0,0x112233445566
注意 | 设备类型取值范围： 0：公共设备地址 1：随机设备地址 2：公共本端地址 3：随机静态本端地址 设备地址为长度为14的字符串

##### AT+BLEGAPREGCBK 注册BLE回调函数

格式 | AT+BLEGAPREGCBK
响应 | 成功：OK 失败：ERROR
参数说明 | -
示例 | AT+BLEGAPREGCBK
注意 | -

##### AT+BLESETDATALEN 设置发送数据包数据长度

格式 | AT+BLESETDATALEN
响应 | 成功：OK 失败：ERROR
参数说明 | <conn_handle>：连接句柄 <maxtxoctets>：最大字节数 <maxtxtime>：最大发送时间
示例 | AT+BLESETDATALEN=0,100,100
注意 | -

##### AT+BLESETPHY 设置phy

格式 | AT+BLESETPHY=<conn_handle>,<all_phys>,<tx_phys>,<rx_phys>,<phy_options>
响应 | 成功：OK 失败：ERROR
参数说明 | <conn_handle>：连接句柄 <all_phys>: 0: TX/RX PHY生效 1：TX PHY不生效 2：RX PHY不生效 3：TX/RX PHY都不生效 <tx_phy>：tx phy值 0：1M PHY 1：2M PHY 2：Code PHY <rx_phy>：rx phy值 0：1M PHY 1：2M PHY 2：Code PHY <phy_options>: PHY选项 0：主机没有首选编码 1：使用S=2编码PHY(1M/2=512k) 2：使用S=8编码PHY(1M/8=128k)
示例 | AT+BLESETPHY=0,2,1,1,0
注意 | 上述各参数中没有列出的示例值为预留字段, AT侧不做拦截, 下发后BTC会回复异常参数, 请关注回调中的异常日志打印

#### gatts模块AT命令

##### AT+GATTSREGSRV 创建一个GATT server

格式 | AT+GATTSREGSRV=<uuid>
响应 | 成功：OK 失败：ERROR
参数说明 | <uuid>：应用uuid
示例 | AT+GATTSREGSRV=0x1122
注意 | -

##### AT+GATTSUNREG 删除GATT server，释放资源

格式 | AT+GATTSUNREG=<uuid>
响应 | 成功：OK 失败：ERROR
参数说明 | <server_id>：服务端id
示例 | AT+GATTSUNREG=1
注意 | -

##### AT+GATTSADDSERV 添加一个GATT服务

格式 | AT+GATTSADDSERV=<server_id,svc_uuid,is_primary_flag>
响应 | 成功：OK 失败：ERROR
参数说明 | <server_id>：服务端id <svc_uuid>：服务uuid <is_primary_flag>：是否是首要服务
示例 | AT+GATTSADDSERV=1,0x1812,1
注意 | -

##### AT+GATTSSYNCADDSERV 添加一个GATT服务（同步）

格式 | AT+GATTSSYNCADDSERV=<server_id,svc_uuid,is_primary_flag>
响应 | 成功：OK 失败：ERROR
参数说明 | <server_id>：服务端id <svc_uuid>：服务uuid <is_primary_flag>：是否是首要服务
示例 | AT+GATTSSYNCADDSERV=1,0x1812,1
注意 | -

##### AT+GATTSADDCHAR 为GATT服务添加一个特征

格式 | AT+GATTSADDCHAR=<server_id,service_handle,chara_uuid,permissions,properties,value_len,value>
响应 | 成功：OK 失败：ERROR
参数说明 | <server_id>：服务端id <service_handle>：服务句柄 <chara_uuid>：特征uuid <permissions>：权限 <propertise>：特性 <value_len>：值长 <value>：值
示例 | AT+GATTSADDCHAR=1,1,0x2a4a,0x01,0x02,4,01010003
注意 | 值是长度为值长度两倍的字符串

##### AT+GATTSSYNCADDCHAR 为GATT服务添加一个特征（同步）

格式 | AT+GATTSSYNCADDCHAR=<server_id,service_handle,chara_uuid,permissions,properties,value_len,value>
响应 | 成功：OK 失败：ERROR
参数说明 | <server_id>：服务端id <service_handle>：服务句柄 <chara_uuid>：特征uuid <permissions>：权限 <propertise>：特性 <value_len>：值长度 <value>：值
示例 | AT+GATTSSYNCADDCHAR=1,1,0x2a4a,0x01,0x02,4,01010003
注意 | 值是长度为值长度两倍的字符串

##### AT+GATTSADDDESCR 为最新的特征添加一个描述符

格式 | AT+GATTSADDDESCR=<server_id,service_handle,chara_uuid,permissions,value_len,value>
响应 | 成功：OK 失败：ERROR
参数说明 | <server_id>：服务端id <service_handle>：服务句柄 <chara_uuid>：特征uuid <permissions>：权限 <value_len>：值长度 <value>：值
示例 | AT+GATTSADDDESCR=1,1,0x2902,0x03,2,0100
注意 | 值是长度为值长度两倍的字符串

##### AT+GATTSSYNCADDDESCR 为最新的特征添加一个描述符（同步）

格式 | AT+GATTSSYNCADDDESCR=<server_id,service_handle,chara_uuid,permissions,value_len,value>
响应 | 成功：OK 失败：ERROR
参数说明 | <server_id>：服务端id <service_handle>：服务句柄 <chara_uuid>：特征uuid <permissions>：权限 <value_len>：值长度 <value>：值
示例 | AT+GATTSSYNCADDDESCR=1,1,0x2902,0x03,2,0100
注意 | 值是长度为值长度两倍的字符串

##### AT+GATTSSTARTSERV 启动指定的GATT服务

格式 | AT+GATTSSTARTSERV=<server_id,service_handle>
响应 | 成功：OK 失败：ERROR
参数说明 | <server_id>：服务端id <service_handle>：服务句柄
示例 | AT+GATTSSTARTSERV=1,1
注意 | -

##### AT+GATTSDELALLSERV 删除指定server上的所有服务

格式 | AT+GATTSDELALLSERV=<server_id>
响应 | 成功：OK 失败：ERROR
参数说明 | <server_id>：服务端id
示例 | AT+GATTSDELALLSERV=1
注意 | -

##### AT+GATTSSENDRSP 发送响应

格式 | AT+GATTSSENDRSP=<server_id,conn_handle,request_id,status,offset,value_len,value>
响应 | 成功：OK 失败：ERROR
参数说明 | <server_id>：服务端id <conn_handle>：连接句柄 <request_id>：请求id <status>：请求结果 <offset>：偏移 <value_len>：值长度 <value>：值
示例 | AT+GATTSSENDRSP=1,0,req_id,0,0,2,0x4562
注意 | 值是长度为值长度两倍的字符串

##### AT+GATTSSNDNTFY 发送通知或指示

格式 | AT+GATTSSNDNTFY=<server_id,conn_handle,attr_handle,value_len,value>
响应 | 成功：OK 失败：ERROR
参数说明 | <server_id>：服务端id <conn_handle>：连接句柄 <attr_handle>：偏移 <value_len>：值长度 <value>：值
示例 | AT+GATTSSNDNTFY=1,0,9,7,0x00000000000014
注意 | 值是长度为值长度两倍的字符串

##### AT+GATTSSNDNTFYBYUUID 根据uuid发送通知或指示

格式 | AT+GATTSSNDNTFYBYUUID=<server_id,conn_handle,chara_uuid,start_handle,end_handle,value_len,value>
响应 | 成功：OK 失败：ERROR
参数说明 | <server_id>：服务端id <conn_handle>：连接句柄 <chara_uuid>：特征uuid <start_handle>：起始句柄 <end_handle>：结束句柄 <value_len>：值长度 <value>：值
示例 | AT+GATTSSNDNTFYBYUUID=1,0,0x2a4d,1,9,7,0x00000000000014
注意 | 值是长度为值长度两倍的字符串

##### AT+GATTSREGCBK 注册GATT服务端回调函数

格式 | AT+GATTSREGCBK
响应 | 成功：OK 失败：ERROR
参数说明 | -
示例 | AT+GATTSREGCBK
注意 | -

##### AT+GATTSSETMTU 在连接之前设置server rx mtu

格式 | AT+GATTSSETMTU=<server_id,mtu_size>
响应 | 成功：OK 失败：ERROR
参数说明 | <server_id>：服务端id <mtu_size>：mtu大小
示例 | AT+GATTSSETMTU=1,23
注意 | -

#### gattc模块AT命令

##### AT+GATTCREG 创建一个GATT client

格式 | AT+GATTCREG=<uuid>
响应 | 成功：OK 失败：ERROR
参数说明 | <uuid>：应用uuid
示例 | AT+GATTCREG=0x1212
注意 | -

##### AT+GATTCUNREG 删除GATT client，释放资源

格式 | AT+GATTCUNREG=<client_id>
响应 | 成功：OK 失败：ERROR
参数说明 | <client_id>：客户端id
示例 | AT+GATTCUNREG=1
注意 | -

##### AT+GATTCFNDSERV 发现服务

格式 | AT+GATTCFNDSERV=<client_id,conn_id,uuid>
响应 | 成功：OK 失败：ERROR
参数说明 | <client_id>：客户端id <conn_id>：连接id <uuid>：应用uuid
示例 | AT+GATTCFNDSERV=1,1,0x1212
注意 | -

##### AT+GATTCFNDCHAR 发现特征

格式 | AT+GATTCFNDCHAR=<client_id,conn_id,server_handle,uuid>
响应 | 成功：OK 失败：ERROR
参数说明 | <client_id>：客户端id <conn_id>：连接id <server_handle>：服务句柄 <uuid>：应用uuid
示例 | AT+GATTCFNDCHAR=1,1,0,0x1212
注意 | -

##### AT+GATTCFNDDESCR 发现描述符

格式 | AT+GATTCFNDDESCR=<client_id,conn_id,handle>
响应 | 成功：OK 失败：ERROR
参数说明 | <client_id>：客户端id <conn_id>：连接id <handle>：服务句柄
示例 | AT+GATTCFNDDESCR=1,1,0
注意 | -

##### AT+GATTCREADBYHDL 读取by hdl

格式 | AT+GATTCREADBYHDL=<client_id,conn_id,handle>
响应 | 成功：OK 失败：ERROR
参数说明 | <client_id>：客户端id <conn_id>：连接id <handle>：服务句柄
示例 | AT+GATTCREADBYHDL=1,1,0
注意 | -

##### AT+GATTCREADBYUUID 读取by_uuid

格式 | AT+GATTCREADBYUUID=<client_id,conn_id,start_hdl,end_hdl,uuid>
响应 | 成功：OK 失败：ERROR
参数说明 | <client_id>：客户端id <conn_id>：连接id <start_hdl>：起始句柄 <end_hdl>：结束句柄 <uuid>：想要读的uuid
示例 | AT+GATTCREADBYUUID=1,0,13,13,2a4d
注意 | -

##### AT+GATTCWRITEREQ 写by hdl req

格式 | AT+GATTCWRITEREQ=<client_id,conn_id,handle,data_len,data>
响应 | 成功：OK 失败：ERROR
参数说明 | <client_id>：客户端id <conn_id>：连接id <handle>：句柄 <data_len>：数据长度 <data>：数据
示例 | AT+GATTCWRITEREQ=1,0,13,1,0x11
注意 | -

##### AT+GATTCWRITECMD 写by hdl cmd

格式 | AT+GATTCWRITECMD=<client_id,conn_id,handle,data_len,data>
响应 | 成功：OK 失败：ERROR
参数说明 | <client_id>：客户端id <conn_id>：连接id <handle>：句柄 <data_len>：数据长度 <data>：数据
示例 | AT+GATTCWRITECMD=1,0,13,1,0x11
注意 | -

##### AT+GATTCEXCHMTU 交换MTU请求

格式 | AT+GATTCEXCHMTU=<server_id,conn_id,mtu_size>
响应 | 成功：OK 失败：ERROR
参数说明 | <server_id>：服务端id <conn_id>：连接id <mtu_size>：client rx mtu大小
示例 | AT+GATTCEXCHMTU=1,0,100
注意 | -

##### AT+GATTCREGCBK 注册GATT客户端回调函数

格式 | AT+GATTCREGCBK
响应 | 成功：OK 失败：ERROR
参数说明 | -
示例 | AT+GATTCREGCBK
注意 | -

### SLE

#### SLE Device Discovery模块指令描述

##### SLE使能

设置指令 | AT+SLEENABLE
响应 | 成功：OK 失败：ERROR
参数说明 | -
示例 | AT+SLEENABLE
注意 | -

##### SLE去使能

设置指令 | AT+SLEDISABLE
响应 | 成功：OK 失败：ERROR
参数说明 | -
示例 | AT+SLEDISABLE
注意 | -

##### 设置SLE广播参数

设置指令 | AT+SLESETADVPAR=<announce_handle>,<announce_mode>,<announce_interval_min>,<announce_interval_max>,<own_addr_type>,<own_addr_addr>,<peer_addr_type>,<peer_addr_addr>
响应 | 成功：OK 失败：ERROR
参数说明 | <announce_handle>：设备公开句柄，取值范围[0, 0x10] <announce_mode>：设备公开类型 /*可连接可扫描*/ <announce_interval_min>：最小设备公开周期，0x000020~0xffffff，单位125μs <announce_interval_max>：最大设备公开周期，0x000020~0xffffff，单位125μs <own_addr_type>：SLE本端地址类型 0：公有地址, 6 ：随机地址 <own_addr_addr>：SLE本端设备地址 <peer_addr_type>：SLE对端设备地址类型 0：公有地址, 6 ：随机地址 <peer_addr_addr>：SLE对端设备地址
示例 | AT+SLESETADVPAR=1,3,200,200,0,000000000000,0,000000000000
注意 | 此命令需在SLE使能AT+SLEENABLE后下发

##### 设置SLE广播数据

设置指令 | AT+SLESETADVDATA=<adv_handle>,<announce_data_len>,<seek_rsp_data_len>,<announce_data>,<seek_rsp_data>
响应 | 成功：OK 失败：ERROR
参数说明 | <adv_handle>：广播handle, 取值范围[0, 0x10] <announce_data_len>：设备公开数据长度 <seek_rsp_data_len>：扫描响应数据长度 <announce_data>：设备公开数据（hex类型字符串，最大长度521个字符） <seek_rsp_data>：扫描响应数据（hex类型字符串，最大长度521个字符）
示例 | AT+SLESETADVDATA=1,10,4,aabbccddeeff11223344,11224455
注意 | 此命令需在SLE使能AT+SLEENABLE后下发

##### 起SLE广播

设置指令 | AT+SLESTARTADV=<adv_enable>
响应 | 成功：OK 失败：ERROR
参数说明 | <adv_handle>：adv handle, 取值范围[0, 0x10]
示例 | AT+SLESTARTADV=1
注意 | 此命令需在SLE使能AT+SLEENABLE后下发

##### 停SLE广播

设置指令 | AT+SLESTOPADV=<adv_handle>
响应 | 成功：OK 失败：ERROR
参数说明 | <adv_handle>：adv handle
示例 | AT+SLESTOPADV=1
注意 | 此命令需在SLE起广播AT+SLESTARTADV=1后下发

##### 设置扫描参数

设置指令 | AT+SLESETSCANPAR=<scan_type>,<scan_interval>,<scan_window>
响应 | 成功：OK 失败：ERROR
参数说明 | <scan_type>：扫描类型 0：被动扫描 1：主动扫描 <scan_interval>：扫描间隔，取值范围[0x14, 0xFFFF]，单位125μs <scan_window>：扫描窗口，取值范围[0x14, 0xFFFF]，单位125μs
示例 | AT+SLESETSCANPAR=0,0x48,0x48
注意 | 此命令需在SLE起扫描AT+SLESTARTSCAN前下发

##### 使能扫描

设置指令 | AT+SLESTARTSCAN
响应 | 成功：OK 失败：ERROR
参数说明 | -
示例 | AT+SLESTARTSCAN
注意 | -

##### 关闭扫描

设置指令 | AT+SLESTOPSCAN
响应 | 成功：OK 失败：ERROR
参数说明 | -
示例 | AT+SLESTOPSCAN
注意 | -

##### 设置本端名称

设置指令 | AT+SLESETNAME
响应 | 成功：OK 失败：ERROR
参数说明 | <len>：name长度 <name>：名字
示例 | AT+SLESETNAME=7,SDKTEST
注意 | -

##### 获取本端名称

设置指令 | AT+SLEGETNAME
响应 | 成功：OK 失败：ERROR
参数说明 | -
示例 | AT+SLEGETNAME
注意 | -

##### 设置本端地址

设置指令 | AT+SLESETADDR
响应 | 成功：OK 失败：ERROR
参数说明 | <addr_type>：地址类型 <addr>：地址
示例 | AT+SLESETADDR=0,0x000000000001
注意 | -

##### 获取本端地址

设置指令 | AT+SLEGETADDR
响应 | 成功：OK 失败：ERROR
参数说明 | -
示例 | AT+SLEGETADDR
注意 | -

#### SLE Connection manager模块指令描述

##### 建立SLE连接

当前只支持0、6两种，通常常用的类型是0。地址类型会校验，如果不匹配会返回错误。

设置指令 | AT+SLECONN=<sle_addr_type>,<sle_addr>
响应 | 成功：OK 失败：ERROR 连接成功后会打印[connected]字样以及对端设备地址与handle值
参数说明 | < sle_addr_type >：SLE设备地址类型 0：公有地址 6 ： 随机地址 <sle_addr>：SLE设备地址
示例 | AT+SLECONN=0,0x000000000000
注意 | -

##### 星闪逻辑链路更新参数

设置指令 | AT+SLECONNPARUPD=<conn_id>,<interval_min>,<interval_max>,<max_latency>,<supervision_timeout>
响应 | 成功：OK 失败：ERROR
参数说明 | <conn_id>：连接ID <interval_min>：链路调度最小间隔，取值范围[0x0002, 0x32000]，单位125μs <interval_max>：链路调度最大间隔，取值范围[0x0002, 0x32000]，单位125μs <max_latency>：延迟周期，单位slot（该值表示在设置值的周期内可以不回复, 为0时则表示每包都需回复） <supervision_timeout>：超时时间，单位10ms
示例 | AT+SLECONNPARUPD=0,20,20,0,500
注意 | -

##### 星闪读取远端rssi

该命令的作用：读取当前SLE ACB 链路的RSSI信号强度，RSSI（Received Signal Strength Indicator）是接收信号的强度指示。

设置指令 | AT+SLEREADPEERRSSI=<conn_id>
响应 | 成功：OK 失败：ERROR
参数说明 | <conn_id>：连接ID
示例 | AT+SLEREADPEERRSSI=0
注意 | 需建立连接后发送此命令

##### 注册SLE连接模块和安全模块AT指令的串口打印回调函数

设置指令 | AT+SLEREGCONNCBK
响应 | 成功：OK 失败：ERROR
参数说明 | -
示例 | AT+SLEREGCONNCBK
注意 | -

##### 断开SLE连接

设置指令 | AT+SLEDISCONN=<sle_addr_type>,<sle_addr>
响应 | 成功：OK 失败：ERROR 连接成功后会打印[disconnected]字样以及对端设备地址与handle值
参数说明 | < sle_addr_type >：SLE设备地址类型 0：公有地址 6：随机地址 <sle_addr>：SLE设备地址
示例 | AT+SLEDISCONN=0,000000000000
注意 | -

##### 设置SLE PHY

默认1M 4M暂时不支持。

该命令作用：某些场景下需要高的传输速率，此时就通过设置tx_phy、rx_phy参数为2M。如果两端都支持2M,才能设置成功。

设置指令 | AT+SLESETPHY=<conn_id>,<tx_phy>,<rx_phy>
响应 | 成功：OK 失败：ERROR
参数说明 | <conn_id>：连接id <tx_phy>：tx phy值 0：1M PHY 1：2M PHY 2：4M PHY <rx_phy>：tx phy值 0：1M PHY 1：2M PHY 2：4M PHY
示例 | AT+SLESETPHY=0,1,1
注意 | -

##### 设置SLE 默认连接参数

设置指令 | AT+ SLESETDEFAULTCONNP =<enable_filter_policy>,<initiate_phys>,<gt_negotiate>,<scan_interval>,<scan_window>,<max_interval>,<min_interval>,<timeout>
响应 | 成功：OK 失败：ERROR
参数说明 | <enable_filter_policy>：是否打开链路过滤 <initiate_phys>：链路扫描带宽 <gt_negotiate>：链路建立时是否进行G和T交互 <scan_interval>：扫描对端设备的interval 最小值：0x14 最大值：无上限 <scan_window>：扫描对端设备的windows 最小值：0x14 最大值：传入的<scan_interval> <max_interval>：链路最大调度interval 最大值：32000 <min_interval>：链路最小调度interval 最小值：10 <timeout>：链路超时时间(N×10ms) 最小值：10 最大值：3200
示例 | AT+SLESETDEFAULTCONNP=0,1,0x1,0x20,0x20,0x64,0x64,0x1FC
注意 | -

##### SLE断开所有连接

设置指令 | AT+SLEDISCONNALL
响应 | 成功：OK 失败：ERROR
参数说明 |
示例 | AT+SLEDISCONNALL
注意 | -

#### SLE security management模块指令描述

##### 进行加密配对

设置指令 | AT+SLEPAIR=<sle_addr_type>,<sle_addr>
响应 | 成功：OK 失败：ERROR
参数说明 | < sle_addr_type >：SLE设备地址类型 0：公有地址 6：随机地址 <sle_addr>：SLE设备地址
示例 | AT+SLEPAIR=0,000000000000
注意 | 需在sle建立连接以后，和对端启动加密配对

##### 移除加密配对

设置指令 | AT+SLEUNPAIR=<sle_addr_type>,<sle_addr>
响应 | 成功：OK 失败：ERROR
参数说明 | < sle_addr_type >：SLE设备地址类型 0：公有地址, 6：随机地址 <sle_addr>：SLE设备地址
示例 | AT+SLEUNPAIR=0,000000000000
注意 | -

##### 获取配对设备数目

设置指令 | AT+SLEGETPAIREDNUM
响应 | 成功：OK 失败：ERROR
参数说明 | -
示例 | AT+SLEGETPAIREDNUM
注意 | -

##### 获取配对设备

设置指令 | AT+SLEGETPAIRDEV
响应 | 成功：OK 失败：ERROR
参数说明 | -
示例 | AT+SLEGETPAIRDEV
注意 | --

##### 获取设备配对状态

设置指令 | AT+SLEGETPAIRSTA=<sle_addr_type>,<sle_addr>
响应 | 成功：OK 失败：ERROR
参数说明 | < sle_addr_type >：SLE设备地址类型 0：公有地址 6：随机地址 <sle_addr>：SLE设备地址
示例 | AT+SLEGETPAIRSTA=0,000000000000
注意 | -

##### 获取绑定设备

设置指令 | AT+SLEGETBONDDEV
响应 | 成功：OK 失败：ERROR
参数说明 | -
示例 | AT+SLEGETBONDDEV
注意 | -

#### ssap server模块指令描述

##### 注册服务端

设置指令 | AT+SSAPSADDSRV=<uuid>
响应 | 成功：OK 失败：ERROR
参数说明 | -
示例 | AT+SSAPSADDSRV=0x1234
注意 | -

##### 去注册服务端

设置指令 | AT+SSAPSDELALLSRV
响应 | 成功：OK 失败：ERROR
参数说明 | -
示例 | AT+SSAPSDELALLSRV
注意 | -

##### 添加服务

注册成“次要服务”没什么影响。现在都是主要服务，次要服务的概念弱化了，因此通常情况下都是注册成主要服务。

设置指令 | AT+SSAPSADDSERV=<uuid>,<is_primary>
响应 | 成功：OK 失败：ERROR
参数说明 | -
示例 | AT+SSAPSADDSERV=0x2222,1
注意 | -

##### 添加服务同步

设置指令 | AT+SSAPSSYNCADDSERV=<uuid>,<is_primary>
响应 | 成功：OK 失败：ERROR
参数说明 | -
示例 | AT+SSAPSSYNCADDSERV=0x2222,1
注意 | -

属性参数说明：

    typedef enum {
        SSAP_PERMISSION_READ                  = 0x01,      /*可读*/
        SSAP_PERMISSION_WRITE                 = 0x02,      /*可写*/
        SSAP_PERMISSION_ENCRYPTION_NEED       = 0x04,      /*需要加密*/
        SSAP_PERMISSION_AUTHENTICATION_NEED   = 0x08,      /*需要认证*/
        SSAP_PERMISSION_AUTHORIZATION_NEED    = 0x10,      /*需要授权*/
    } ssap_permission_t;

    typedef enum {
        SSAP_OPERATE_INDICATION_BIT_READ = 0x01,          /*数据值可被读取*/
        SSAP_OPERATE_INDICATION_BIT_WRITE_NO_RSP = 0x02,  /*数据值可被写入，写入后无反馈*/
        SSAP_OPERATE_INDICATION_BIT_WRITE = 0x04,         /*数据值可被写入，写入后产生反馈给客户端*/
        SSAP_OPERATE_INDICATION_BIT_NOTIFY = 0x08,        /*数据值通过通知方式传递给客户端*/
        SSAP_OPERATE_INDICATION_BIT_INDICATE = 0x10,      /*数据值通过指示方式传递给客户端*/
        SSAP_OPERATE_INDICATION_BIT_BROADCAST = 0x20,     /*数据值可携带在广播中*/
        SSAP_OPERATE_INDICATION_BIT_DESCRITOR_WRITE = 0x100,  /*数据值说明描述符可被写入*/
        SSAP_OPERATE_INDICATION_MAX,                      /*操作指示最大值 */
    } ssap_operate_indication_t;

##### 添加属性

设置指令 | AT+SSAPSADDPROPERTY=<service_handle>,<uuid>,<permissions>,<operate_indication>,<value_len>,<value>
响应 | 成功：OK 失败：ERROR
参数说明 | <service_handle>：服务的hadle <uuid>：SSAP特征UUID <permissions>：特征权限 <operate_indication>：操作指示 <value_len>：响应的数据长度 <value>：响应的数据
示例 | AT+SSAPSADDPROPERTY=1,0x2323,5,5,2,0x1234
注意 | -

##### 添加属性同步

设置指令 | AT+SSAPSSYNCADDPROPERTY=<service_handle>,<uuid>,<permissions>,<operate_indication>,<value_len>,<value>
响应 | 成功：OK 失败：ERROR
参数说明 | <service_handle>：服务的hadle <uuid>：SSAP 特征 UUID <permissions>：特征权限 <operate_indication>：操作指示 <value_len>：响应的数据长度 <value>：响应的数据
示例 | AT+SSAPSSYNCADDPROPERTY=1,0x2323,5,5,2,0x1234
注意 | -

##### 添加属性描述符

设置指令 | AT+SSAPSADDDESCR=<service_handle>,<property_handle>,<uuid>,<permissions>,<operate_indication>,<type>,<value_len>,<value>
响应 | 成功：OK 失败：ERROR
参数说明 | <service_handle>：服务handle <property_handle>：属性handle <uuid>：SSAP 描述符 UUID <permissions>：特征权限 <operate_indication>：操作指示 <type>：描述符类型 <value_len>：数据长度 <value>：数据
示例 | AT+SSAPSADDDESCR=1,2,0x3333,5,5,2,2,0x0200
注意 | 属性描述符值为0100时表示notify，为0200时表示indicate，为0时表示不可向对端通知或指示

##### 添加属性描述符同步

设置指令 | AT+SSAPSSYNCADDDESCR=<service_handle>,<property_handle>,<uuid>,<permissions>,<operate_indication>,<type>,<value_len>,<value>
响应 | 成功：OK 失败：ERROR
参数说明 | <service_handle>：服务handle <property_handle>：属性handle <uuid>：SSAP 描述符 UUID <permissions>：特征权限 <operate_indication>：操作指示 <type>：描述符类型 <value_len>：数据长度 <value>：数据
示例 | AT+SSAPSSYNCADDDESCR=1,2,0x3333,5,5,2,2,0x0200
注意 | -

##### 服务端向客户端发送通知

设置指令 | AT+SSAPSSNDNTFY=<conn_id>,<handle>,<type>,<value_len>,<value>
响应 | 成功：OK 失败：ERROR
参数说明 | <conn_id>：连接handle <handle>：属性handle <type>：SSAP 特征类型 0：特征值 1：属性说明描述符 2：客户端配置描述符 3：服务端配置描述符 4：格式描述符 5：服务管理保留描述符，0x05–0x1F 0xFF：厂商自定义描述符 <value_len>：数据长度 <value>：数据
示例 | AT+SSAPSSNDNTFY=0,2,0,2,0x0200
注意 | -

##### 服务端向客户端通过uuid发送通知

设置指令 | AT+SSAPSNTFYBYUUID=<conn_id>,<uuid>,<start_hdl>,<end_hdl>,<type>,<value_len>,<value>
响应 | 成功：OK 失败：ERROR
参数说明 | <conn_id>：连接handle <uuid>：属性uuid <start_hdl>：开始句柄 <end_hdl>：结束句柄 <type>：SSAP 特征类型 0：特征值 1：属性说明描述符 2：客户端配置描述符 3：服务端配置描述符 4：格式描述符 5：服务管理保留描述符，0x05–0x1F 0xFF：厂商自定义描述符 <value_len>：数据长度 <value>：数据
示例 | AT+SSAPSNTFYBYUUID=0,0x1234,0,0xFFFF,0,2,0x0200
注意 | -

##### 服务端发送响应

发送响应原因说明：

    typedef enum {
        ERRCODE_SSAP_INVALID_PDU = ERRCODE_SLE_SSAP_BASE + 0x01,                      /*服务端接收的 PDU 无效*/
        ERRCODE_SSAP_PDU_NOT_SUPPORT = ERRCODE_SLE_SSAP_BASE + 0x02,                  /*服务端不支持处理接收的PDU*/
        ERRCODE_SSAP_UNKNOW = ERRCODE_SLE_SSAP_BASE + 0x03,                           /*服务端执行请求时发生未知错误*/
        ERRCODE_SSAP_INVALID_HANDLE = ERRCODE_SLE_SSAP_BASE + 0x04,                   /*请求中的句柄无效*/
        ERRCODE_SSAP_INSUFFICIENT_RESOURCES = ERRCODE_SLE_SSAP_BASE + 0x05,           /*服务端没有足够资源完成请求*/
        ERRCODE_SSAP_PROHIBIT_READING = ERRCODE_SLE_SSAP_BASE + 0x06,                 /*服务端禁止客户端读取值*/
        ERRCODE_SSAP_PROHIBIT_WRITE = ERRCODE_SLE_SSAP_BASE + 0x07,                   /*服务端禁止客户端写入值*/
        ERRCODE_SSAP_CLIENT_NOT_AUTHENTICATED = ERRCODE_SLE_SSAP_BASE + 0x08,         /*客户端未经过认证*/
        ERRCODE_SSAP_CLIENT_NOT_AUTHORIZATION = ERRCODE_SLE_SSAP_BASE + 0x09,         /*客户端未被授权*/
        ERRCODE_SSAP_BEARER_NOT_ENCRYPTED = ERRCODE_SLE_SSAP_BASE + 0x0A,             /*传输 PDU 的承载未加密*/
        ERRCODE_SSAP_ENTRIES_NOT_FOUND = ERRCODE_SLE_SSAP_BASE + 0x0B,                /*服务端未找到对应条目*/
        ERRCODE_SSAP_INVALID_METHOD_CALL = ERRCODE_SLE_SSAP_BASE + 0x0C,                   /*方法访问错误*/
        ERRCODE_SSAP_INCORRECT_DATA_TYPE = ERRCODE_SLE_SSAP_BASE + 0x0D,              /*客户端发送写入数据类型不符的错误*/
        ERRCODE_SSAP_INCORRECT_DATA_VALUE_LENGTH = ERRCODE_SLE_SSAP_BASE + 0x0E,             /*客户端发送写入值长度不符的错误*/
        ERRCODE_SSAP_VALUE_OUT_OF_RANGE = ERRCODE_SLE_SSAP_BASE + 0x0F,               /*客户端写入的值超出范围*/
        ERRCODE_SSAP_SUBCONTRACT_NOT_SUPPORT = ERRCODE_SLE_SSAP_BASE + 0x10,          /*服务端不支持信令的分包发送*/
        ERRCODE_SSAP_ATTRIBUTE_NUM_OVER_LIMIT = ERRCODE_SLE_SSAP_BASE + 0x11,         /*请求数量超出服务端的支持能力*/
        ERRCODE_SSAP_FRAGMENT_NUMBER_NOT_SUPPORT = ERRCODE_SLE_SSAP_BASE + 0x12,      /*服务端不支持信令分片序号功能*/
        ERRCODE_SSAP_SUBCONTRACT_NOT_FULLY_RECEIVE = ERRCODE_SLE_SSAP_BASE + 0x13,    /*服务端未接收所有分包*/
        ERRCODE_SSAP_TRANSACTION_NUM_NOT_SUPPORT = ERRCODE_SLE_SSAP_BASE + 0x14,      /*服务端不支持消息事务号*/
        ERRCODE_SSAP_RELIABLE_MODE_NOT_SUPPORT = ERRCODE_SLE_SSAP_BASE + 0x15,        /*服务端不支持可靠模式*/
        ERRCODE_SSAP_UPPERLAYER_APPLICATION_ERROR_MIN = ERRCODE_SLE_SSAP_BASE + 0xAF, /*预留给上层协议定义应用错误*/
        ERRCODE_SSAP_UPPERLAYER_APPLICATION_ERROR_MAX = ERRCODE_SLE_SSAP_BASE + 0xFF, /*预留给上层协议定义应用错误*/
    } errcode_sle_ssap_t;

设置指令 | AT+SSAPSSNDRESP=<conn_id>,<request_id>,<status>,<value_len>,<value>
响应 | 成功：OK 失败：ERROR
参数说明 | <conn_id>：服务handle <request_id>：请求id <status>：发送响应原因 <value_len>：数据长度 <value>：数据
示例 | AT+SSAPSSNDRESP=0,0,1,2,0x0200
注意 | -

##### 服务端注册回调

设置指令 | AT+SSAPSREGCBK
响应 | 成功：OK 失败：ERROR
参数说明 | -
示例 | AT+SSAPSREGCBK
注意 | -

##### start service

设置指令 | AT+SSAPSSTARTSERV=<service_handle>
响应 | 成功：OK 失败：ERROR
参数说明 | <service_handle>：服务handle
示例 | AT+SSAPSSTARTSERV=1
注意 | -

#### ssap client模块指令描述

##### 注册SSAPC回调函数

设置指令 | AT+SSAPCREGCBK
响应 | 成功：OK 失败：ERROR
参数说明 | -
示例 | AT+SSAPCREGCBK
注意 | -

##### 发现service

查找类型字段说明：

    typedef enum {
        SSAP_FIND_TYPE_SERVICE_STRUCTURE = 0x00,     /*服务结构*/
        SSAP_FIND_TYPE_PRIMARY_SERVICE   = 0x01,     /*首要服务*/
        SSAP_FIND_TYPE_REFERENCE_SERVICE = 0x02,     /*引用服务*/
        SSAP_FIND_TYPE_PROPERTY          = 0x03,     /*属性*/
        SSAP_FIND_TYPE_METHOD            = 0x04,     /*方法*/
        SSAP_FIND_TYPE_EVENT             = 0x05,     /*事件*/
    } ssap_find_type_t;

设置指令 | AT+SSAPCFNDSTRU=<client_id>,<conn_id>,<type>,<uuid>,<start_hdl>,<end_hdl>
响应 | 成功：OK 失败：ERROR
参数说明 | <client_id>：客户端id <conn_id>：连接id <type>：查找类型 0：服务结构 1：首要服务 3：属性
示例 | AT+SSAPCFNDSTRU=0,0,1,0x1234,0,0xff
注意 | -

##### 客户端向服务端写入数据

设置指令 | AT+SSAPCWRITECMD=<client_id>,<conn_id>,<handle>,<type>,<len>,<write_data>
响应 | 成功：OK 失败：ERROR
参数说明 | <client_id>：客户端id <conn_id>：连接id <handle>：属性handle <type>：客户端类型，取值：0/1/3 <len>：写入数据长度 <write_data>：写入数据段
示例 | AT+SSAPCWRITECMD=0,0,2,0,2,0x8899
注意 | -

##### 客户端向服务端发送写请求

设置指令 | AT+SSAPCWRITEREQ=<client_id>,<conn_id>,<handle>,<type>,<len>,<write_data>
响应 | 成功：OK 失败：ERROR
参数说明 | <client_id>：客户端id <conn_id>：连接id <handle>：属性handle <type>：客户端类型，取值：0/1/3 <len>：写入数据长度 <write_data>：写入数据段
示例 | AT+SSAPCWRITEREQ=0,0,2,0,2,0x8899
注意 | -

##### 客户端发起信息交换

设置指令 | AT+SSAPCEXCHINFO=<client_id>,<conn_id>,<mtu_size>,<version>
响应 | 成功：OK 失败：ERROR
参数说明 | <client_id>：客户端id <conn_id>：连接id <mtu_size>：ssap通道mtu 最小值：251 最大值：520 <version>：版本号 0：BLE 1：SLE
示例 | AT+SSAPCEXCHINFO=0,0,251,1
注意 | -

##### 客户端通过uuid发送读请求

设置指令 | AT+SSAPCREADBYUUID=<client_id>,<conn_id>,<uuid>,<type>,<start_hdl>,<end_hdl>
响应 | 成功：OK 失败：ERROR
参数说明 | <client_id>：客户端id <conn_id>：连接id <uuid>：uuid <type>：客户端类型, 取值：0/1/3 <start_hdl>：开始handle <end_hdl>：结束handle
示例 | AT+SSAPCREADBYUUID=0,0,0x1234,0,0,0xFFFF
注意 | -

##### 客户端读取服务端属性数据

设置指令 | AT+SSAPCREADREQ=<client_id>,<conn_id>,<handle>,<type>
响应 | 成功：OK 失败：ERROR
参数说明 | <client_id>：客户端id（预留参数） <conn_id>：连接id <handle>：属性handle（连接成功后的回调里会打印） <type>：客户端类型，取值：0/1/3
示例 | AT+SSAPCREADREQ=0,0,2,0
注意 | 读数据时的handle需与写入数据时的handle一致

表 1 设备外观值一览表

设备外观 | 值 | 说明
--- | --- | ---
BLE_APPEARANCE_UNKNOWN | 0 | None
BLE_APPEARANCE_GENERIC_PHONE | 64 | Generic category
BLE_APPEARANCE_GENERIC_COMPUTER | 128 | Generic category
BLE_APPEARANCE_GENERIC_WATCH | 192 | Generic category
BLE_APPEARANCE_WATCH_SPORTS_WATCH | 193 | Watch subtype
BLE_APPEARANCE_GENERIC_CLOCK | 256 | Generic category
BLE_APPEARANCE_GENERIC_DISPLAY | 320 | Generic category
BLE_APPEARANCE_GENERIC_REMOTE_CONTROL | 384 | Generic category
BLE_APPEARANCE_GENERIC_EYE_GLASSES | 448 | Generic category
BLE_APPEARANCE_GENERIC_TAG | 512 | Generic category
BLE_APPEARANCE_GENERIC_KEYRING | 576 | Generic category
BLE_APPEARANCE_GENERIC_MEDIA_PLAYER | 640 | Generic category
BLE_APPEARANCE_GENERIC_BARCODE_SCANNER | 704 | Generic category
BLE_APPEARANCE_GENERIC_THERMOMETER | 768 | Generic category
BLE_APPEARANCE_THERMOMETER_EAR | 769 | Thermometer subtype
BLE_APPEARANCE_GENERIC_HEART_RATE_SENSOR | 832 | Generic category
BLE_APPEARANCE_HEART_RATE_SENSOR_HEART_RATE_BELT | 833 | Heart Rate Sensor subtype
BLE_APPEARANCE_GENERIC_BLOOD_PRESSURE | 896 | Generic category
BLE_APPEARANCE_BLOOD_PRESSURE_ARM | 897 | Blood Pressure subtype
BLE_APPEARANCE_BLOOD_PRESSURE_WRIST | 898 | Blood Pressure subtype
BLE_APPEARANCE_HUMAN_INTERFACE_DEVICE_HID | 960 | HID Generic
BLE_APPEARANCE_KEYBOARD | 961 | HID subtype
BLE_APPEARANCE_MOUSE | 962 | HID subtype
BLE_APPEARANCE_JOYSTICK | 963 | HID subtype
BLE_APPEARANCE_GAMEPAD | 964 | HID subtype
BLE_APPEARANCE_DIGITIZER_TABLET | 965 | HID subtype
BLE_APPEARANCE_CARD_READER | 966 | HID subtype
BLE_APPEARANCE_DIGITAL_PEN | 967 | HID subtype
BLE_APPEARANCE_BARCODE_SCANNER | 968 | HID subtype
BLE_APPEARANCE_GENERIC_GLUCOSE_METER | 1024 | Generic category
BLE_APPEARANCE_GENERIC_RUNNING_WALKING_SENSOR | 1088 | Generic category
BLE_APPEARANCE_RUNNING_WALKING_SENSOR_IN_SHOE | 1089 | Running Walking Sensor subtype
BLE_APPEARANCE_RUNNING_WALKING_SENSOR_ON_SHOE | 1090 | Running Walking Sensor subtype
BLE_APPEARANCE_RUNNING_WALKING_SENSOR_ON_HIP | 1091 | Running Walking Sensor subtype
BLE_APPEARANCE_GENERIC_CYCLING | 1152 | Generic category
BLE_APPEARANCE_CYCLING_CYCLING_COMPUTER | 1153 | Cycling subtype
BLE_APPEARANCE_CYCLING_SPEED_SENSOR | 1154 | Cycling subtype
BLE_APPEARANCE_CYCLING_CADENCE_SENSOR | 1155 | Cycling subtype
BLE_APPEARANCE_CYCLING_POWER_SENSOR | 1156 | Cycling subtype
BLE_APPEARANCE_CYCLING_SPEED_AND_CADENCE_SENSOR | 1157 | Cycling subtype
BLE_APPEARANCE_INVALID | 65536 | out of uint16_t

## 常用AT指令示例

### BLE

#### 配置server

1. 使能BLE。

       AT+BLEENABLE
       [Acore] ble enable cbk in, event:c
       OK

   - 命令说明：使能BLE协议栈。

   - 打印说明：使能成功。

2. 设置本地地址。

       AT+BLESETADDR=0,0x111111111112
       OK

   - 命令说明：配置BLE本地地址为0x111111111112，地址类型为公共设备地址。

     > 说明： 设备类型取值： 0：公共设备地址 1：随机设备地址 2：公共本端地址 3：随机静态本端地址

   - 打印说明：本地地址配置成功。设置完成后，可以使用AT+BLEGETADDR命令查看当前本地地址：

         AT+BLEGETADDR
         ble at cmd gap ble get local addr:
           0x11 0x11 0x11 0x11 0x11 0x12
         OK

3. 设置本地设备名。

       AT+BLESETNAME=11,testnamesrv
       OK

   - 命令说明：设置设备名称，名称长度取值范围为[0,255]，设备实际名称长度为len+1的字符串，名称最后默认存在’/0’。本例中，设置时名称后没有' '，读取设备名称显示名称后有' '。

   - 打印说明：设置成功。

     > 说明： 设置后可以通过命令验证是否设置成功:

     >     AT+BLEGETNAME
     >     ble at cmd gap ble get local name:testnamesrv
     >     OK

4. 注册GAP回调函数。

       AT+BLEGAPREGCBK
       OK

   - 命令说明：注册GAP层回调函数。

   - 打印说明：注册成功。

5. 注册一个GATT server。

       AT+GATTSREGSRV=0x1122
       [GAP service register][device name] handle: 0x0006, value handle: 0x0007
       [GAP service register][device appearance] handle: 0x0008, value handle: 0x0009
       [GAP service register][prefer conn param] handle: 0x000a, value handle: 0x000b
       [GATTServer]register server: 1
       OK

   - 命令说明：注册一个GATT服务端（sever），配置该服务端的UUID=0x1122。

   - 打印说明：GAP服务注册器自动注册一个Generic Access服务（包含device name、device appearance、prefer conn param三个chara），handle id从0x6开始，到0xb；然后GATT成功注册了一个server，server ID=1，sercer hdl=5。

6. 注册 GATT 服务端回调函数

       AT+GATTSREGCBK
       OK

   - 命令说明：注册 GATT 服务端回调函数。

   - 打印说明：注册成功。

7. 添加一个 GATT 服务（同步）

       AT+GATTSSYNCADDSERV=1,0x0012,1
       ble at gatts add service sync register srv_handle:14
       OK

   - 命令说明：在server id=1的server中注册一个服务，配置服务uuid=0x0012，该服务是首选服务。

   - 打印说明：成功添加了一个GATT服务（同步），服务句柄=14，服务句柄可用于后续对该服务进行操作。

8. 为 GATT 服务添加一个特征（同步）

       AT+GATTSSYNCADDCHAR=1,14,0x122a,0x03,0x12,4,01010003
       [gatts_add_characteristic_sync] register handle:15, value_handle:16
       OK

   - 命令说明：向指定server(server ID=1)中指定的service（service handle=14）添加一个characteristic，这个特征的uuid=0x122a，权限是0x3（可读可写），property（特性）是0x12（通知特征值+读特征值），value的（最大）长度是4字节，value是0x01010003；（service handle来自于步骤5返回的数据）。

     > 说明： 权限参数取值范围： 0x01：可读 0x02：可写 0x04：需要加密 0x08：需要认证 0x10：需要授权 0x20：需要MITM保护

     > 说明： property（特性）参数取值范围： 0x01：广播特征值 0x02：读特征值 0x04：写特征值并且不需要响应 0x08：写特征值 0x10：通知特征值 0x20：指示特征值 0x40：签名写特征值 0x80：在特征扩展特性描述符中定义了附加的特征特性

   - 打印说明：：添加characteristic成功，register handle=15，value handle=16

9. 为最新的特征添加一个描述符（同步）。

       AT+GATTSSYNCADDDESCR=1,14,0x2902,0x03,2,0100
       [gatts_add_descriptor_sync] register descriptor handle:17
       OK

   - 命令说明：向指定server（server id=1）的指定service（service handle=14）的最新的characteristic添加一个描述符（descriptor），desc的uuid=0x2902，权限为0x03（可读可写），value长度2字节，value=0x0100；权限的取值与6中权限取值相同。

   - 打印说明：添加描述符成功，描述符的handle=17。

10. 注册一个特性为可读可写且需要响应、允许指示且有两个描述符的特征；注册一个特性为可读可写且不需要响应，并允许指示的特征。

        AT+GATTSSYNCADDCHAR=1,14,0x122b,0x03,0x2a,4,01010003
        [gatts_add_characteristic_sync] register handle:18, value_handle:19
        OK
        AT+GATTSSYNCADDDESCR=1,14,0x2904,0x03,2,1110
        [gatts_add_descriptor_sync] register descriptor handle:20
        OK
        AT+GATTSSYNCADDDESCR=1,14,0x2905,0x03,2,2220
        [gatts_add_descriptor_sync] register descriptor handle:21
        OK
        AT+GATTSSYNCADDCHAR=1,14,0x122c,0x03,0x26,4,01010003
        [gatts_add_characteristic_sync] register handle:22, value_handle:23
        OK

11. 启动指定的GATT 服务。

        AT+GATTSSTARTSERV=1,14
        [GATTServer]ServiceStartCallback server: 1 srv_hdl: 14 status: 0
        OK

    - 命令说明：启动指定GATT server（server id=1）中service handle=14的服务。

    - 打印说明：server 1中handle=14的服务启动成功。

    > 说明： 必须在start一个service后，才能添加新的service。

12. 设置广播参数。

        AT+BLESETADVPAR=0x32,0x32,0,0x000000000000,0,0x000000000000,7,0,1,0,0x1
        [ACore] ble set adv param min_interval:0x32, max interval:0x32, adv_type:0, duration:0
        [ACore] ble set adv param, own addr:0x00:**:**:**:00:00
        [ACore] ble set adv param, peer addr:0x00:**:**:**:00:00
        AdvParamCallback adv_id: 1 status: 0
        OK

    - 命令说明：设置id=1的广播的发送参数。

    - 打印说明：广播参数设置成功。

13. 设置广播数据。

        AT+BLESETADVDATA=0,0,0,0,1
        AdvDataCallback adv_id: 1 status: 0
        OK

    - 命令说明：设置指定广播（id=1）的发送数据。

    - 打印说明：广播1的发送数据设置成功。

14. 发送广播。

        AT+BLESTARTADV=1
        [ACore] gap ble start adv in, adv_id:1
        AdvEnableCallback adv_id: 1, start success
        OK

    - 命令说明：开始发送id=1的BLE广播。

    - 打印说明：开始发送id=1的BLE广播，回调打印发送成功。

    > 说明： 使用nRF connect工具，与设备连接后，可以看到注册的服务，如图1所示。

    图 1 设备连接页面示意图

    > 须知： 后续步骤需要在client端发现了相应服务后执行才有效。

15. 发送通知或指示。

        AT+GATTSSNDNTFY=1,0,16,7,0x00000000000014
        OK

    - 命令说明：让指定characteristic（hdl=16）向指定server（id=1）的指定连接（conn id=0）对端发送notify或indicate(取决与该characteristic的特性)，内容为7字节的数据，数据内容为0x00000000000014。本例中，将指令的第三个参数设置为15或16均可以。

    - 打印说明：发送成功。

      > 说明： client端成功收到notify/indicate后，触发回调，会打印对应信息。 特征的特性是允许nofity时的打印：

      >     [GATTClient]Receive notification----client:1 conn_id:0
      >     handle:16 data_len:7
      >     data:00 00 00 00 00 00 14
      >     status:0

      > 说明： hdl=2的特征的特性是indicate，使用该命令会indicate。

      >     AT+GATTSSNDNTFY=1,0,2,4,0x00000001
      >     OK

      > 此时客户端的回调打印为：

      >     [GATTClient]Receive indication----client:1 conn_id:0
      >     handle:3 data_len:4
      >     data:00 00 00 00
      >     status:0

16. 根据uuid发送通知或指示。

        AT+GATTSSNDNTFYBYUUID=1,0,0x122a,14,17,2,0x0101
        OK

    - 命令说明：让指定characteristic（uuid=0x122a，特性起始hdl=14，结束hdl=17）向指定server（id=1）的指定连接（conn id=0）对端发送notify或indicate(取决与该characteristic的特性)，内容为7字节的数据，数据内容为0x00000000000014。

    - 打印说明：发送成功。

      > 说明： client端成功收到notify后，触发回调，会打印对应信息：

      >     [GATTClient]Receive notification----client:1 conn_id:0
      >     handle:16 data_len:2
      >     data:01 01
      >     status:0

      indicate方式与15一致。

#### 配置client

1. 使能BLE。

       AT+BLEENABLE
       [ACore] ble enable cbk in, event:c
       OK

   - 命令说明：使能BLE协议栈。

   - 打印说明：使能成功。

2. 设置本地地址。

       AT+BLESETADDR=0,0x000000000002
       OK

   - 命令说明：与配置server时一样，配置BLE本地地址为0x111111111112，地址类型为公共设备地址。

   - 打印说明：本地地址配置成功。

3. 注册GAP回调函数。

       AT+BLEGAPREGCBK
       OK

   - 命令说明：注册GAP层回调函数。

   - 打印说明：注册成功。

4. 注册GATT客户端回调函数。

       AT+GATTCREGCBK
       OK

   - 命令说明：注册GATT客户端回调函数。

   - 打印说明：注册成功。

5. 注册一个GATT client。

       AT+GATTCREG=0x1234
       [GATTClient] client: 1
       OK

   - 命令说明：注册一个GATT客户端（client），配置该客户端的UUID=0x1234。

   - 打印说明：成功添加了一个GATT客户端，它的client id=1（client id可用于后续对该client进行操作）。

6. 与BLE设备连接。

       AT+BLECONN=0,0x111111111112
       [Connected] addr:12:**:**:**:11:11, conn_id:00 addr type 0
       conn_id: 0 conn_state: 1 pair_status: 1 addrtype 0 disc_reason 0
       [GATTClient]Mtu changed----client:1 conn_id:0 mtu size:23
       status:0
       OK

   - 命令说明：与指定地址的设备进行连接，对端地址类型为公共设备地址。

     > 说明： 设备类型参数取值范围： 0：公共设备地址 1：随机设备地址 2：公共本端地址 3：随机静态本端地址

   - 打印说明：与目标设备连接成功，连接id=0，连接状态＝１，配对状态＝１，并且双端交换了MTU信息。

     > 说明： 连接时，对端设备也会打印连接信息，server端还会终止广播，被终止的广播ID此时为１。

     >     [Connected] addr:02:**:**:**:00:00, conn_id:00 addr type 0
     >     [ACore] ble gap adv set terminated cbk event:9
     >     conn_id: 0 conn_state: 1 pair_status: 1 addrtype 0 disc_reason 0
     >     [GATTServer]ExchangeMtuReqReceiveCallback--server_id:1 conn_id:0
     >     req_mtu_size:23
     >     status:0
     >     AdvTerminateCallback adv_id: 1 status: 0

7. 与对端设备发起配对。

       AT+BLEPAIR=0,0x111111111112
       OK
       PairCompleteCallback con_id: 0 status: 0
       PairCompleteCallback addr:12:**:**:**:11:11

   - 命令说明：与指定地址的设备进行配对，配对前双端设备必须已连接。

   - 打印说明：设备配对成功，回调打印配对成功的信息。

     > 说明： 配对成功后，对端设备也会触发回调，打印配对信息：

     >     PairCompleteCallback con_id: 0 status: 0
     >     PairCompleteCallback addr:02:**:**:**:00:00

8. 发现服务。

       AT+GATTCFNDSERV=1,0,0x0012
       [GATTClient]Discovery service----client:1 conn_id:0
       start handle:14 end handle:21 uuid_len:2
       uuid:0012
       status:0
       [GATTClient]Discovery service complete----client:1 conn_id:0 uuid len:2
       uuid:0012status:0
       OK

   - 命令说明：在指定client（id=1）的指定连接（conn id=0）中发现UUID=0x0012的服务。

   - 打印说明：在指定client（id=1）的指定连接（conn id=0）中发现了UUID=0x0012的服务，服务的起始handle=14，最后handle=21，uuid的长度=2字节。后续的发现chara或者读、写操作需要用到handle信息。

9. 发现特征。

       AT+GATTCFNDCHAR=1,0,14,0x122a
       [GATTClient]Discovery character----client:1 conn_id:0 uuid_len:2
       uuid:122a
       declare handle:15 value handle:16 properties:12
       status:0
       [GATTClient]Discovery character----client:1 conn_id:0 uuid_len:2
       uuid:122b
       declare handle:18 value handle:19 properties:2a
       status:0
       [GATTClient]Discovery character----client:1 conn_id:0 uuid_len:2
       uuid:122c
       declare handle:22 value handle:23 properties:26
       status:0
       [GATTClient]Discovery character complete----client:1 conn_id:0 uuid len:2
       uuid:0012
       service handle:29
       status:0
       OK

   - 命令说明：在指定client（id=1）的指定连接（conn id=0）的指定服务（server hdl=14）发现UUID=0x122a的特性。

   - 打印说明：在指定client（id=1）的指定连接（conn id=0）的指定服务（server hdl=14）发现了UUID=0x122a的特性，这个特性的declare hdl=15，value hdl=16，property =0x12（通知特征值+读特征值）。

   > 说明： 从回调打印信息中可以发现，该命令实际会发现指定服务的所有特性，本例中发现了server 14中uuid=122a和uuid=122b的特性。

   > 说明： 在该AT指令中，uuid填写service uuid 0x0012或者chara uuid 0x122a，都可以成功发现服务中的该服务（server hdl=14）中的charateristics：

   >     AT+GATTCFNDCHAR=1,0,14,0x0012
   >     [GATTClient]Discovery character----client:1 conn_id:0 uuid_len:2
   >     uuid:122a
   >     declare handle:15 value handle:16 properties:12
   >     status:0
   >     [GATTClient]Discovery character----client:1 conn_id:0 uuid_len:2
   >     uuid:122b
   >     declare handle:18 value handle:19 properties:2a
   >     status:0
   >     [GATTClient]Discovery character----client:1 conn_id:0 uuid_len:2
   >     uuid:122c
   >     declare handle:22 value handle:23 properties:26
   >     status:0
   >     [GATTClient]Discovery character complete----client:1 conn_id:0 uuid len:2
   >     uuid:0012
   >     service handle:55
   >     status:0
   >     OK

10. 发现描述符。

        AT+GATTCFNDDESCR=1,0,15
        [GATTClient]Discovery descriptor----client:1 conn_id:0 uuid len:2
        uuid:2902
        descriptor handle:17
        status:0
        [GATTClient]Discovery descriptor complete----client:1 conn_id:0
        charatcer handle:65535
        status:0
        OK

    - 命令说明：在指定client（id=1）的指定连接（conn id=0）中发现指定特性（declare hdl=15）的所有描述符（一个特性从它的声明属性开始）。

    - 打印说明：在指定client（id=1）的指定连接（conn id=0）中发现了指定特性的所有描述符，这个特性包含一个描述符（hdl=17）。

    然后再发现第二个特征的所有描述符：

        AT+GATTCFNDDESCR=1,0,18
        [GATTClient]Discovery descriptor----client:1 conn_id:0 uuid len:2
        uuid:2904
        descriptor handle:20
        status:0
        [GATTClient]Discovery descriptor----client:1 conn_id:0 uuid len:2
        uuid:2905
        descriptor handle:21
        status:0
        [GATTClient]Discovery descriptor complete----client:1 conn_id:0
        charatcer handle:36882
        status:0
        OK

11. 通过handle读取服务端信息。

        AT+GATTCREADBYHDL=1,0,16
        OK
        [GATTClient]Read result----client:1 conn_id:0
        handle:16 data_len:4
        data:01 01 00 03
        status:0

    - 命令说明：在指定client（id=1）的指定连接（conn id=0）中，请求读取srv端hdl=16的数据。

    - 打印说明：请求成功，读取到srv端的数据，读取结果返回了4字节长度的数据，数据内容为(0x)01 01 00 03。

    > 说明： 在此前的章节中，我们注册server时，系统自动注册了一个服务，其中一个chara是device name，它的值的handle=7，我们可以试着读取它。 读取成功的返回值是(0x)74 65 73 74 6e 61 6d 65 73 72 76，转换为ASCII码即**"**testnamesrv "，也就是此前在配置服务端时我们设置的设备名字。

    > 说明： srv端收到请求时，会有回调打印信息：

    >     [GATTServer]ReadReqReceiveCallback--server_id:1 conn_id:0
    >     request_id:7 handle:7 offset:0 need_authorize:0 need_rsp:1 is_long:0
    >     status:0

    > 说明： 使用命令时发现，（如此例）client端不需要先发现服务、特征等，即可进行读取请求并能成功。

12. 通过UUID读取。

        AT+GATTCREADBYUUID=1,0,15,16,0x122a
        OK
        [GATTClient]Read result----client:1 conn_id:0
        handle:16 data_len:4
        data:01 01 00 03
        status:0
        [GATTClient]Read by uuid complete----client:1 conn_id:0
        start handle:15 end handle:16 uuid len:2
        uuid:122a
        status:0

    - 命令说明：在指定client（id=1）的指定连接（conn id=0）的指定hdl区间内(hdl in [15,16])中，请求读取srv端uuid=0x122a的数据。

    - 打印说明：请求成功，读取到srv端的数据，读取结果返回了4字节长度的数据，数据内容为(0x)01 01 00 03 。

      > 说明： 这种读取方式srv端无回调打印。

13. 写by hdl请求。

        AT+GATTCWRITEREQ=1,0,19,4,0xaabbccdd
        [GATTClient]Write result----client:1 conn_id:0 handle:19
        status:0
        OK

    - 命令说明：向指定client（id=1）的指定连接（conn id=0）的指定hdl(=19)发送写请求，请求写入4个字节的数据，数据值为0xaabbccdd，此时特征的特性必须包含0x8写特征值。

      > 说明： 特征注册时配置数据的长度也是改属性的固定长度，如果写入属性值的长度值小于或等于这个固定长度，则属性值中包括写入属性值长度的部分应被写入新的属性值，而剩下的部分应不被改动（例：如果原属性固定长度为4字节，value=0x01010003，当请求写入3字节的数据0xaabbcc时，写入成功后的值会是0xaabbcc03）；如果写入属性值的长度值大于属性值的固定长度，则服务端会忽略该写入请求；srv端notify或indicate时不受固定长度限制。

    - 打印说明：写请求成功。

      > 说明： server端收到写请求，会有回调打印：

      >     [GATTServer]WriteReqReceiveCallback--server_id:1 conn_id:0
      >     request_id:22 handle:19 offset:0 need_authorize:0 need_rsp:1 is_prep:0
      >     data_len:4 data:
      >     aa bb cc dd
      >     status:0

      > 说明： 可以通过读取请求，验证写入是否成功：

      >     AT+GATTCREADBYHDL=1,0,19
      >     OK
      >     [GATTClient]Read result----client:1 conn_id:0
      >     handle:19 data_len:4
      >     data:aa bb cc dd
      >     status:0

14. 写by hdl cmd（需要先注册一个特性包含0x4的特征）。

        AT+GATTCWRITECMD=1,0,23,3,0xaabbee
        [GATTClient]Write result----client:1 conn_id:0 handle:23
        status:0
        OK

    - 命令说明：向指定client（id=1）的指定连接（conn id=0）的指定hdl(=19)发送写请求，请求写入3个字节的数据，数据值为0xaabbee，此时特征的特性必须包含0x4，即写特征值并且不需要响应。

    - 打印说明：写请求成功。

      > 说明： server端收到写请求，会有回调打印：

      >     [GATTServer]WriteReqReceiveCallback--server_id:1 conn_id:0
      >     request_id:3 handle:23 offset:0 need_authorize:0 need_rsp:0 is_prep:0
      >     data_len:3 data:
      >     aa bb ee
      >     status:0

    > 说明： 通过读取请求，验证写入是否成功：

    >     AT+GATTCREADBYHDL=1,0,23
    >     OK
    >     [GATTClient]Read result----client:1 conn_id:0
    >     handle:23 data_len:4
    >     data:aa bb ee 03
    >     status:0

#### 其他AT指令示例

##### 扫描参数设置

- 设置BLE扫描参数。

      AT+BLESETSCANPAR=0x48,0x48,0,1,0
      ScanParameterSetCompletedCallback status: 0
      OK

  命令说明：配置扫描间隔为0x48 * 0.625ms，扫描窗口为0x48 * 0.625ms，扫描类型为被动扫描，扫描LE 1M PHY，扫描过滤策略为接收所有广播（定向到其它设备的除外）。

  > 说明： 扫描phy参数取值范围： 0x0：无广播包 0x1：1M PHY 0x2：2M PHY 0x3：Coded PHY

  > 说明： 扫描过滤策略参数取值范围： 0x0：接收所有广播，不接收目标地址不是本设备地址的定向广播； 0x1：只接收白名单里设备的广播，不接收目标地址不是本设备地址的定向广播； 0x2：接收所有的非定向广播、地址是可解析私有地址的广播方发送的定向广播和发给该设备的定向广播； 0x3：接收白名单中的所有非定向广播、地址是可解析私有地址的广播方发送的定向广播和发给该设备的定向广播。

  打印说明：参数设置成功，回调打印。

##### 开启扫描

- 启动BLE扫描。

      AT+BLESTARTSCAN
      OK

  ScanResult primPhy: 1 secPhy: 0 event_type: 19 data_status: 0 data_len: 31, addr_type:0x1 addr:0xa6:2e:e5:07:59:58

  ScanResult primPhy: 1 secPhy: 0 event_type: 19 data_status: 0 data_len: 12, addr_type:0x1 addr:0x91:28:08:07:b6:d2

  ScanResult primPhy: 1 secPhy: 0 event_type: 19 data_status: 0 data_len: 30, addr_type:0x0 addr:0x5f:10:00:10:10:d8

  ScanResult primPhy: 1 secPhy: 0 event_type: 19 data_status: 0 data_len: 0, addr_type:0x0 addr:0x12:11:11:11:11:11

  命令说明：启动BLE扫描功能。

  打印说明：扫描启动成功，打印扫描结果到屏幕上。每一条打印数据中分别表示：主广播PHY类型(primPhy)，辅广播PHY类型(secPhy)，扫描结果广播类型（event_type），扫描结果数据状态，广播数据长度，广播地址类型，广播地址。

  > 说明： 扫描结果广播类型： 0x00：扩展的不可连接不可扫描非定向； 0x01：扩展的可连接非定向； 0x02：扩展的可扫描非定向； 0x04：扩展的不可连接不可扫描定向； 0x05：扩展的可连接定向； 0x06：扩展的可扫描定向； 0x10：传统的不可连接非定向； 0x12：传统的可扫描非定向； 0x13：传统的可连接可扫描非定向； 0x15：传统的可连接定向； 0x1A：传统的与ADV_SCAN_IND对应的扫描响应； 0x1B：传统的与ADV_IND对应的扫描响应。

  > 说明： 扫描结果广播类型： 0x00：完整数据或最后一个片段 0x01：不完整的数据 0x02：被截断不完整的数据

  > 说明： 启动BLE扫描后，扫描结果会刷屏。

### SLE

#### 配置server

1. 使能SLE。

       AT+SLEENABLE
       OK

   - 命令说明：使能SLE协议栈。

   - 打印说明：使能成功。

2. 设置SLE本地地址。

       AT+SLESETADDR=0,0x000000001111
       OK

   - 命令说明：使能SLE协议栈。

   - 打印说明：使能成功。

   > 说明： 可以使用AT+SLEGETADDR命令查看当前本地地址：

   >     AT+SLEGETADDR
   >     [SLE DD SDK] get addr: 00:00:00:00:11:11
   >     OK

3. 设置本地设备名。

       AT+SLESETNAME=11,BLETESTNAME
       OK

   - 命令说明：设置设备名称

   - 打印说明：设置成功。

     > 说明： 可以使用AT+SLEGETNAME命令查看：

     >     AT+SLEGETNAME
     >     [SLE DD SDK] get name: BLETESTNAME
     >     OK

     > 与BLE中不同，SLE设置的设备名称后没有被添加' '。

4. 服务端注册回调。

       AT+SSAPSREGCBK
       [AT] ssaps register cbks.
       OK

   - 命令说明：注册SLE服务端回调函数。

   - 打印说明：回调注册成功。

5. 注册SLE服务端。

       AT+SSAPSADDSRV=0x1234
       ssaps register server handle (1).
       OK

   - 命令说明：注册SLE服务端，服务端uuid设置为0x1234；

   - 打印说明：服务端注册成功，服务端句柄=1。

6. 添加service（同步）。

       AT+SSAPSSYNCADDSERV=0x2222,1
       ssaps add service sync handle (16), ret:0.
       OK

   - 命令说明：同步的方式添加一个service，service uuid=0x2222，1表示把这个服务注册为首要服务；

   - 打印说明：服务注册成功，服务句柄hdl=16。

7. 添加属性（同步）。

       AT+SSAPSSYNCADDPROPERTY=16,0x2424,0x3,0xb,2,0x0101
       ssaps add property sync handle (17), ret:0.
       OK

   - 命令说明：同步方式为handle=16的service添加一个属性（property），属性的uuid=0x2424，属性权限为3（可读可写），操作指使=0xb（可读可写，写后无反馈，允许notify），数据长度=2字节，数据值=0x0101。

     > 说明： property permission参数取值范围： 0x1：可读 0x2：可写 0x4：需要加密 0x8：需要认证 0x10：需要授权

     > 说明： operate indication参数取值范围： 0x01：数据值可被读取； 0x02：数据值可被写入，写入后无反馈； 0x04：数据值可被写入，写入后产生反馈给客户端； 0x08：数据值通过通知方式传递给客户端； 0x10：数据值通过指示方式传递给客户端； 0x20：数据值可携带在广播中； 0x100：数据值说明描述符可被写入； 0x200：客户端描述符可被写入； 0x400：服务端述符可被写入； 0x7FF：操作指示最大值。

   - 打印说明：property添加成功，property handle=17。

8. 添加属性描述符（同步）

       AT+SSAPSSYNCADDDESCR=16,17,0x2425,5,5,3,2,0x0100
       ssaps add descriptor sync ret (0).
       OK

   - 命令说明：为指定服务（handle=16）的指定属性（property handle=17）添加一个descriptor，descriptor的uuid=0x2425，描述符权限为5，操作指示为5（这两个参数的取值范围与步骤6中的一致）；描述符类型为2，数据长度2字节，数据值=0x0100，表示notify。

     > 说明： 描述符类型参数取值范围： 0x00：特征值； 0x01：属性说明描述符； 0x02：客户端配置描述符； 0x03：服务端配置描述符； 0x04：格式描述符； 0x05~ 0x1F：服务管理保留描述符； 0xFF：厂商自定义描述符。

     > 说明： 属性描述符的value字段的值的含义： 0100：notify； 0200：indicate； 0 ：不可向对端通知或指示。

   - 打印说明：descriptor添加成功

9. 添加属性（同步）。

       AT+SSAPSSYNCADDPROPERTY=16,0x2525,0x3,0x15,2,0x0202
       ssaps add property sync handle (18), ret:0.
       OK

   命令说明：同步方式为handle=16的service再添加一个属性（property），属性的uuid=0x2525，属性权限为3（可读可写），操作指使=0x15（可读可写，写后有反馈，允许indicate），数据长度=2字节，数据值=0x0202。

10. 添加属性描述符（同步）。

        AT+SSAPSSYNCADDDESCR=16,18,0x2526,5,0x15,2,2,0x0200
        ssaps add descriptor sync ret (0).
        OK

    命令说明：为指定服务（handle=16）的指定属性（property handle=17）添加一个descriptor，descriptor的uuid=0x2526，描述符权限为5，操作指示为5；描述符类型为2，数据长度2字节，数据值=0x020，表示indicate。

11. 启动服务

        AT+SSAPSSTARTSERV=16
        [AT] ssaps start service cb server_id(1) handle(16) status(0).
        ssaps start_service handle:10, ret:0.
        OK

    - 命令说明：启动handle=16的service；

    - 打印说明：启动成功，server id=1，service handle=16。

12. 设置SLE广播参数

        AT+SLESETADVPAR=1,3,200,200,0,000000001111,0,000000000000
        [ACore] sle set announce param, handle:1, mode:3, min_interval:c8, max_interval:c8, tx_power: 127
        [ACore] sle set announce param, own addr:0x00:**:**:**:11:11
        [ACore] sle set announce param, peer addr:0x00:**:**:**:00:00
        OK

    - 命令说明：设置广播参数，设置广播handle=1，handle的取值范围[0，0x10]；设备为0x03 可连接可扫描状态，最小公开周期200 * 125μs，最大200×125μs，本端地址为公共设备地址，地址为0x000000001111，对端为公共设备地址，地址全0。

      > 说明： 设备公开类型参数取值范围： 0x00：不可连接不可扫描； 0x01：可连接不可扫描； 0x02：不可连接可扫描； 0x03：可连接可扫描； 0x07：可连接可扫描，定向。

      > 说明： 地址类型参数： 0：公有地址； 6：随机地址。

    - 打印说明：广播参数设置成功，打印了hdl=1的广播参数，其中tx_power: 127表示没有设置特定发射功率。

13. 设置SLE广播数据。

        AT+SLESETADVDATA=1,10,4,aabbccddeeff11223344,11224455
        OK

    - 命令说明：设置handle=1的广播的发送数据，广播数据长度为10字节，扫描响应数据长度为4字节，广播数据=aabbccddeeff11223344，响应数据设置为11224455。

    - 打印说明：广播数据设置成功。

14. 发送SLE广播：AT+SLESTARTADV=1

        AT+SLESTARTADV=1
        [ACore] sle start announce in, adv_id:1
        [ACore] sle adv cbk in, event:0 status:0
        [ACore] sle adv cbk in, event:1 status:0
        [ACore] sle adv cbk in, event:2 status:0
        [ACore] sle adv cbk in, event:3 status:0
        OK

    - 命令说明：开始发送id=1的SLE广播。

    - 打印说明：开始发送id=1的SLE广播。

    > 说明： 下方步骤需要在client端发现了相应服务后执行才有效。

15. 服务端向客户端发送通知（NTF或IND）

        AT+SSAPSSNDNTFY=0,0x11,0,2,0x1010
        OK

    - 命令说明：指定连接（conn id=0）对端的客户端发送notify或indicate（由该property的特征的值决定），notify特定property（hdl=0x11）的数据，数据类型为0（见8的描述符类型），2字节数据，数据内容为0x0200。

    - 打印说明：发送成功。

      > 说明： client端成功收到notify后，回调触发，打印对应信息：：

      >     [ssap client] notification info cbk client 0,handle:0x11, type:0x0, status:0x0
      >     ------------data-----------------
      >     10 10
      >     ---------------------------------

      > 说明： handle=0x12的property是允许indicate的，可以使用该命令进行indicate操作：

      >     AT+SSAPSSNDNTFY=0,0x12,0,2,0x2020
      >     OK

      > 此时对端触发indicate的回调，打印信息如下：

      >     [ssap client] indication info cbk conn_id 0,data_len:2, data_type:0x0, status:0x0

      > 说明： 触发哪种回调取决于发送方的property的权限配置（要允许notify或indicate）以及其描述符的值：

      > - property允许notify时，该属性的描述符值需设置成0x0100；

      > - property允许indicate时，该属性的描述符值需设置成0x0200。

16. 根据uuid发送通知或指示。

        AT+SSAPSNTFYBYUUID=0,0x2424,16,17,0,2,0xaabb
        OK

    - 命令说明：指定连接（conn id=0）对端的客户端发送notify或indicate（由该property的特性决定），通知特定property（uuid=0x2424）的数据，数据类型为0（见8中的描述符类型），内容为2字节数据，数据内容为0x0200。本命令与SSAPSSNDNTFY效果相同。

    - 打印说明：发送成功。

      > 说明： client端成功收到notify后，回调触发，打印对应信息：

      >     [ssap client] notification info cbk client 0,handle:0x11, type:0x0, status:0x0
      >     ------------data-----------------
      >     aa bb
      >     ---------------------------------

      > 说明： property是允许indicate的，可以使用该命令进行indicate操作：

      >     AT+SSAPSNTFYBYUUID=0,0x2525,18,19,0,2,0xaabb
      >     OK

      > 此时对端触发indicate的回调，打印信息如下：

      >     [ssap client] indication info cbk conn_id 0,data_len:2, data_type:0x0, status:0x0

#### 配置client

1. 使能SLE。

       AT+SLEENABLE
       OK

   - 命令说明：使能SLE协议栈。

   - 打印说明：使能成功。

2. 设置本地地址。

       AT+SLESETADDR=0,0X000000888888
       OK

   - 命令说明：设置本地地址。

   - 打印说明：设置完成成功。

     > 说明： 可以使用AT+SLEGETADDR命令查看当前本地地址，检验设置是否成功：

     >     AT+SLEGETADDR
     >     [SLE DD SDK] get addr: 00:00:00:88:88:88
     >     OK

3. 注册SLE客户端回调。

       AT+SSAPCREGCBK
       [ssap client] client register cbk
       OK

   - 命令说明：注册SLE客户端回调（也注册了客户端）。

   - 打印说明：注册成功。

4. 设置SLE默认连接参数。

       AT+SLESETDEFAULTCONNP=0,1,0x1,0x20,0x20,0x64,0x64,0x1FC
       OK

   - 命令说明：设置默认连接参数，配置为：不使能链路过滤，初始化扫描带宽为1(1表示1M，2表示2M)，链路建立时进行G\T交互，扫描interval=0x20(最小允许0x14)，扫描窗口为0x20，最大链路interval=0x64，最小链路interval=0x64，超时时间=0x1FC(单位：10ms)。

   - 打印说明：配置成功。

5. 与 SLE 设备连接

       AT+SLECONN=0,0X000000001111
       OK
       [Connected]
       addr:00:**:**:**:11:11, handle:00

   - 命令说明：与地址为0X000000001111的设备建立连接；SLE建立连接的AT指令中，对端设备地址值必须是对端设备发送的广播中携带的本端地址值。

   - 打印说明：连接成功，连接hdl=0。

     > 说明： 连接建立后，server端也会打印了连接信息：

     >     [Connected]
     >     addr:00:**:**:**:88:88, handle:00
     >     [ACore] sle adv cbk in, event:7 status:0

     > 最后一行说明server端触发了广播事件回调（ID=1的广播停止了）。

6. 进行加密配对。

       AT+SLEPAIR=0,0X000000001111
       OK

   - 命令说明：与地址为0X000000001111的设备加密配对，必须在连接建立后才能成功。

   - 打印说明：配对成功。

7. 获取配对设备

       AT+SLEGETPAIRDEV
       [SLE CM SDK] get paired num: 1
       [SLE CM SDK] addr: 00:00:**:**:**:11
       OK

   - 命令说明：获取配对设备数目。

   - 打印说明：已配对设备数为1，并打印对端地址。

   > 说明： 另外，可以使用命令AT+SLEGETPAIREDNUM单独获配对设备数量信息：

   >     AT+SLEGETPAIREDNUM
   >     [SLE CM SDK] get paired num: 1
   >     OK

8. 获取设备配对状态。

       AT+SLEGETPAIRSTA=0,0X000000001111
       [SLE CM SDK] state: 3
       OK

   - 命令说明：获取与地址为0X000000001111的设备的配对状态；

   - 打印说明：与该设备的已配对。

   > 说明： 配对状态值说明： 0x1：未配对 0x2：正在配对 0x3：已配对

9. 获取绑定设备

       AT+SLEGETBONDDEV
       [SLE CM SDK] get bonded num: 1
       [SLE CM SDK] addr: 00:00:**:**:**:11
       OK

   - 命令说明：获取已绑定的设备信息。

   - 打印说明：当前已绑定设备数量为1，已绑定地址为 00:00:**:**:**:11的设备。

10. 发现服务和property

        AT+SSAPCFNDSTRU=0,0,1,0x2222,0,0xff
        sle at cmd discovery structure type = 1, uuid_len = 2, start_hdl: 0x0, end_hdl: 0xff
        OK
        [ssap client] find structure cbk client: 0 conn_id:0 status: 0x0
        [ssap client] find structure structure start_hdl:[0x10], end_hdl:[0x12], uuid len:2
        [ssap client] structure uuid:[0x22][0x22]
        [ssap client] find structure complete cbk client: 0 conn_id:0 status:0x0, type:1

    - 命令说明：在指定client（id=0，服务端id默认为0，目前没有回调打印它）的指定连接（conn id/conn hdl=0，连接id或handle值是在建立连接时，由回调函数打印的，见步骤5）中发现一个structure uuid=0x2222的首要服务，搜索起始handle=0，搜索结束handle=0xff。本例中，目标服务是3.3.2.1 步骤6中的。

      > 说明： 服务类型参数取值范围： 0x00：SERVICE_STRUCTURE 服务结构 0x01：PRIMARY_SERVICE 首要服务 0x02：REFERENCE_SERVICE 引用服务 0x03：PROPERTY 属性 0x04：METHOD 方法 0x05：EVENT 事件

    - 打印说明：发现了目标structure，它的起始hdl=0x10，结束hdl=0x12，以及其他打印信息。

    > 说明： 通过将第三个参数设置为0x3，可以用这个命令发现属性:

    >     AT+SSAPCFNDSTRU=0,0,3,0x2424,0,0xff
    >     sle at cmd discovery structure type = 3, uuid_len = 2, start_hdl: 0x0, end_hdl: 0xff
    >     OK
    >     [ssap client] find property cbk client: 0 conn_id:0 status: 0x0
    >     [ssap client] find property hdl:[0x11]
    >     [ssap client] uuid:[0x24][0x24]
    >     [ssap client] descriptors[0]: type = 0x03
    >     [ssap client] find structure complete cbk client: 0 conn_id:0 status:0x0, type:3

    >     AT+SSAPCFNDSTRU=0,0,3,0x2525,0,0xff
    >     sle at cmd discovery structure type = 3, uuid_len = 2, start_hdl: 0x0, end_hdl: 0xff
    >     OK
    >     [ssap client] find property cbk client: 0 conn_id:0 status: 0x0
    >     [ssap client] find property hdl:[0x12]
    >     [ssap client] uuid:[0x25][0x25]
    >     [ssap client] descriptors[0]: type = 0x02
    >     [ssap client] find structure complete cbk client: 0 conn_id:0 status:0x0, type:3

11. 通过uuid读取服务端信息。

        AT+SSAPCREADBYUUID=0,0,0x2424,0,0,0xff
        OK
        [ssap client] read cfm cbk client: 0 conn_id:0 status: 0x0. handle:0x11
        ------------data-----------------
        01 01
        ---------------------------------
        [ssap client] read by uuid complete cbk client: 0 conn_id:0 status: 0x0. type:0x0
        [ssap client] read by uuid complete cbk start_hdl:[0x00], end_hdl:[0xff], uuid len:2
        [ssap client] uuid:[0x24][0x24]

    - 命令说明：请求读取指定client（id=0）的指定连接（conn hdl=0）中类型为0（见3.3.2.1 步骤8中的描述符类型）、uuid=0x2424的数据，搜索的hdl范围为[0, 0xff]。

    - 打印说明：请求成功，读取到srv端的数据，读取的值为0x0101。

      > 说明： srv端收到请求时，会有回调打印：

      >     [AT] ssaps read by uuid cb server_id(1) conn id(0)         begin handle(0x0000) end handle (0x00ff) status(0).
      >     [AT] ssaps read by uuid cb request_id(0) type(0) need_rsp(0) need_authorize(0).
      >     [AT] ssaps read by uuid cb uuid len(2) 37 be

    > 说明： 第四个参数设置为3，可以读取这个property的描述符的值：

    >     AT+SSAPCREADBYUUID=0,0,0x2424,3,0,0xff
    >     OK
    >     [ssap client] read cfm cbk client: 0 conn_id:0 status: 0x0. handle:0x11
    >     ------------data-----------------
    >     01 00
    >     ---------------------------------
    >     [ssap client] read by uuid complete cbk client: 0 conn_id:0 status: 0x0. type:0x3
    >     [ssap client] read by uuid complete cbk start_hdl:[0x00], end_hdl:[0xff], uuid len:2
    >     [ssap client] uuid:[0x24][0x24]

12. 通过hdl读取。

        AT+SSAPCREADREQ=0,0,0X12,0
        OK
        [ssap client] read cfm cbk client: 0 conn_id:0 status: 0x0. handle:0x0
        ------------data-----------------
        02 02
        ---------------------------------

    - 命令说明：请求读取指定client（id=0）的指定连接（conn hdl=0）中hdl=0x12、类型为0（见8中的描述符类型）的数据。

    - 打印说明：请求成功，读取到srv端的数据，读取的值为0x0202。

      > 说明： srv端收到请求时，有回调触发，打印如下：

      >     [AT] ssaps read cb server_id(1) conn id(0) handle(18) status(0).
      >     [AT] ssaps read request cb request_id(0) type(0) need_rsp(0) need_authorize(0).

    > 说明： SSAPCWRITEREQ把第四个参数设置为2，可以读取该property的描述符的值：

    >     AT+SSAPCREADREQ=0,0,0x12,2
    >     OK
    >     [ssap client] read cfm cbk client: 0 conn_id:0 status: 0x0. handle:0x0
    >     ------------data-----------------
    >     02 00
    >     ---------------------------------

13. 发送写请求（req方式）。

        AT+SSAPCWRITEREQ=0,0,0x12,0,3,0x778899
        OK
        [ssap client] write cfm cbk client: 0 conn_id:0 status: 0x0. handle:0x12
        ------------data-----------------
        77 88 99

        ---------------------------------

    - 命令说明：向指定client（id=0）的指定连接（conn id=0）的指定hdl(=0x12)发送写请求，向类型为0（见3.3.2.1 步骤8中的描述符类型）的条目请求写入3个字节的数据，数据值为0x778899。req方式下，目标property必须是包含0x4特性的（即允许写且写后有反馈）。

    - 打印说明：写请求成功。

      > 说明： server端收到写请求，有回调触发，打印如下：

      >     [AT] ssaps write cb server_id(1) conn id(0) handle(18) status(0).
      >     [AT] ssaps write cb request cb request_id(0) type(0) need_rsp(0) need_authorize(0).
      >     [AT] ssaps write cb request cb data len(3).
      >     ------------data-----------------
      >     77 88 99
      >     ---------------------------------

      > 说明： 可以通过读取请求，验证写入是否成功：

      >     AT+SSAPCREADREQ=0,0,0x12,0
      >     OK
      >     [ssap client] read cfm cbk client: 0 conn_id:0 status: 0x0. handle:0x0
      >     ------------data-----------------
      >     77 88 99
      >     ---------------------------------

14. 向服务端写入数据（cmd方式）。

        AT+SSAPCWRITECMD=0,0,0x11,0,3,0xaabbcc
        OK

    - 命令说明：命令说明：向指定client（id=0）的指定连接（conn id=0）的指定hdl(=0x11)发送写请求，向类型为0（见8中的描述符类型）的条目，写入3个字节的数据，数据值为0xaabbcc。cmd写方式下，目标property必须是包含0x2特性的（即允许写且写后无反馈）。

    - 打印说明：命令发送成功。

      > 说明： 对端有回调触发，打印如下：

      >     [AT] ssaps write cb server_id(1) conn id(0) handle(17) status(0).
      >     [AT] ssaps write cb request cb request_id(0) type(0) need_rsp(0) need_authorize(0).
      >     [AT] ssaps write cb request cb data len(3).
      >     ------------data-----------------
      >     aa bb cc
      >     ---------------------------------

      > 说明： 可以通过读取请求，验证写入是否成功：

      >     AT+SSAPCREADREQ=0,0,0x11,0
      >     OK
      >     [ssap client] read cfm cbk client: 0 conn_id:0 status: 0x0. handle:0x0
      >     ------------data-----------------
      >     aa bb cc
      >     ---------------------------------

#### 其他AT指令示例

##### 开启扫描

- 开启扫描

    AT+SLESTARTSCAN
    OK
    [adv_report] event_type: 0x03, addr_type: 0x00, addr: 00:3e:37:0f:01:00
    [adv_report] data length: 36
    [adv_report] event_type: 0x03, addr_type: 0x00, addr: 00:3e:37:0f:01:00
    [adv_report] data length: 36
    [adv_report] event_type: 0x03, addr_type: 0x00, addr: 00:01:09:07:b0:55

命令说明：开启SLE广播扫描。

打印说明：开启成功。打印扫描结果到屏幕上。每一条扫描结果占两行，第一行打印数据表示：扫描结果广播类型（event_type），广播地址类型，广播地址；第二行打印数据表示：广播数据长度。

> 说明： 需要使用指令：AT+SLEATCOMMONREGCBK注册SLE一般回调（包含广播和扫描回调），才能使扫描结果被打印出来。

> 说明： 扫描结果广播类型： 比特位 | 描述 0 | 可连接的GLE广播报文 connectable GLE adv packet 1 | 可扫描的GLE广播报文 scanable GLE adv packet 2 | 直接GLE报文 direct GLE packet 3 | 扫描响应报文 scan response packet 4 | 第一信道广播报文 first channel adv packet 5-6 | 数据状态 data status | 0b00，完整的广播报告 complete adv report | 0b01，不完整的广播报告，后续还有更多报文数据 incomplete adv report, more data is following | 0b10，不完整的广播报告，数据被截断 incomplete adv report, data is truncated | 0b11，RFU

> 说明： 启动SLE扫描后，扫描结果会刷屏。

# 新增AT指令方法

## 添加AT调试

AT调试支持TESTSUITE与AT共用一个串口切换使用，目前SDK默认关闭TESTSUITE，若默认开启，启动AT需要在TESTSUITE命令行输入

    a testsuite_sw_at

如果需要修改默认使用的模式，修改application/bs21/bs21_acore/app_os_init.c 中AT任务的初始化，在下图框选位置追加如下内容：

AT调试串口的配置可以在middleware/chips/bs2x/at/at_bt_cmd/at/at_bt.h 中修改：

## 添加自定义命令

命令的添加涉及到两个文件，分别是“middleware/chips/bs2x/at/at_btc_cmd_table/at_btc_product.c”和“middleware/chips/bs2x/at/at_btc_cmd_table/at_bt_cmd_table.c”。

在at_btc_product.c添加AT命令执行的函数实体，以如下函数举例：

编写函数实体后，在at_bt_cmd_table.c文件的table表中注册相关AT命令：

注册结构体格式：

    typedef struct {
        const char *name;    /*!< The name cannot be duplicate. */
        const uint16_t cmd_id;    /*!< The cmd_id cannot be duplicate. */
        const uint16_t attribute;
        const at_para_parse_syntax_t *syntax;
        at_cmd_func_t cmd;
        at_set_func_t set;
        at_read_func_t read;
        at_test_func_t test;
    } at_cmd_entry_t;

表 1 自定义命令参数

参数 | 功能
--- | ---
name | AT指令名称。
cmd_id | 指令ID号，不能重复。
attribute | 标识符校验。
        标识该参数当前不支持。
        AT_SYNTAX_ATTR_NOT_SUPPORTED    = 0x0001,
        标识该参数可缺省，为保证参数顺序，缺省时‘，’不可缺省。
        AT_SYNTAX_ATTR_OPTIONAL         = 0x0002,
        该属性标识校验方式为最小值校验。
        AT_SYNTAX_ATTR_AT_MIN_VALUE     = 0x0004,
        该属性标识校验方式为最大值校验。
        AT_SYNTAX_ATTR_AT_MAX_VALUE     = 0x0008,
        该属性标识校验方式为白名单校验。
        AT_SYNTAX_ATTR_LIST_VALUE       = 0x0010,
        该属性标识校验方式为长度校验。
        AT_SYNTAX_ATTR_MAX_LENGTH       = 0x0020,
        该属性标识为该参数新增此参数的长度字段。
        AT_SYNTAX_ATTR_ADD_LENGTH       = 0x0040,
        该参数用于字符串，标识字符串支持大小写混合。
        AT_SYNTAX_ATTR_FIX_CASE         = 0x0080,
        该属性标识该参数已预设长度字段。
        AT_SYNTAX_ATTR_LENGTH_FIELD     = 0x0100
syntax | 定义AT参数校验格式。
cmd | AT命令执行回调函数，eg：发送AT+TEST时回调。
set | AT设置执行回调函数，eg：发送AT+TEST=520时回调。
read | AT读取执行回调函数，eg：发送AT+TEST?时回调。
test | AT测试执行回调函数，eg：发送AT+TEST=?时回调。