跳转至

AT 命令

SLE AT 指令集

前置阅读:Hello SLE

学习目标

  • 理解 AT 指令在 SLE 调试中的作用——通过串口发送文本命令控制 SLE 功能
  • 掌握常用 AT+SLE* 指令的语法和返回格式
  • 能够用 AT 指令快速验证 SLE 连接 / 广播 / 扫描 / 通知功能(无需编写代码)
  • 理解 AT 指令与 API 代码的对应关系

基本概念

AT 指令在开发调试中的价值

在正式代码开发之前,用 AT 指令快速验证硬件和协议栈是否正常。一条指令即可完成广播 / 扫描 / 连接——比写代码快 10 倍。例如:

  • 验证两块板子能否建立 SLE 连接——两条 AT 指令即可
  • 验证射频发射功率配置——AT 指令查询 / 修改发射功率
  • 验证配对功能——AT 指令发起配对

AT 指令框架

WS63 的 AT 指令通过 UART 接收,由 AT 框架解析后调用对应的 SLE API,最后返回结果:

sequenceDiagram
    participant UART as 串口助手
    participant ATFW as AT 框架
    participant SLE as SLE 协议栈

    UART->>ATFW: AT+SLEADV=1,1,25\r\n
    ATFW->>ATFW: 解析指令名和参数
    ATFW->>SLE: sle_start_announce(handle=1, mode=1, interval=25)
    SLE-->>ATFW: ERRCODE_SUCC
    ATFW-->>UART: OK\r\n

指令格式:AT+<CMD>=<param1>,<param2>\r\n,返回 OK\r\nERROR\r\n。所有 SLE AT 指令都以 AT+SLE 开头,便于识别。

AT 指令 vs API 代码

以下对照表列出常用操作在 AT 指令和 API 代码中的写法——调试阶段用 AT 验证逻辑,确认可行后再翻译为 C 代码:

操作 AT 指令 对应 API
启动广播 AT+SLEADV=1,1,25 sle_start_announce()
启动扫描 AT+SLESEEK=1,100,100 sle_start_seek()
连接设备 AT+SLECONN=<addr> sle_connect_remote_device()
断开连接 AT+SLEDISC=<conn_id> sle_disconnect_remote_device()
发起配对 AT+SLEPAIR=<conn_id> sle_pair_remote_device()
读取 RSSI AT+SLERSSI=<conn_id> sle_read_remote_device_rssi()
查询本地地址 AT+SLEADDR? sle_get_local_addr()
发送通知 AT+SLENTF=<conn_id>,<data> ssaps_notify_indicate()

注:以上指令为示意。实际 SDK 中的 AT 指令名称和参数格式以 AT+SLE* 实现为准。完整指令列表见 SDK AT 指令文档。

涉及 API(与 AT 指令对应的)

AT 指令(示例) 对应用途 对应 API
AT+SLEADV=1,1,25 启动广播(announce_id=1, mode=可连, interval=25ms) sle_start_announce()
AT+SLESEEK=1,100,100 启动扫描(PHY=1M, interval=100, window=100) sle_start_seek()
AT+SLECONN=<addr> 连接指定地址设备 sle_connect_remote_device()
AT+SLEDISC=<conn_id> 断开连接 sle_disconnect_remote_device()
AT+SLEPAIR=<conn_id> 发起配对 sle_pair_remote_device()
AT+SLERSSI=<conn_id> 读取 RSSI sle_read_remote_device_rssi()
AT+SLEADDR? 查询本地地址 sle_get_local_addr()

案例说明

做什么

用两块 WS63 开发板 + 串口工具,通过 AT 指令完成广播 → 扫描 → 连接 → 配对 → 通知发送的完整验证。纯文本操作——无需 IDE、无需编译、无需写代码。

案例流程说明

sequenceDiagram
    participant PC_A as PC 串口 A
    participant S as WS63 Server
    participant C as WS63 Client
    participant PC_B as PC 串口 B

    PC_A->>S: AT+SLEADV=1,1,25
    S-->>PC_A: OK
    Note over S: 正在广播...

    PC_B->>C: AT+SLESEEK=1,100,100
    C-->>PC_B: OK
    Note over C: 扫描中...

    C-->>PC_B: +SLESEEK: addr=XX:XX:XX:XX
    PC_B->>C: AT+SLECONN=XX:XX:XX:XX
    S-->>PC_A: +SLECONN: conn_id=0
    C-->>PC_B: +SLECONN: conn_id=0
    Note over S,C: 已连接

    PC_B->>C: AT+SLEPAIR=0
    C-->>PC_B: OK
    S-->>PC_A: +SLEPAIR: success

    PC_A->>S: AT+SLENTF=0,hello
    C-->>PC_B: +SLENTF: hello

案例操作指导

第一步:烧录 AT 指令固件

打开 menuconfig,启用 AT 模式(取消用户 sample,启用 AT 框架):

Top → Application → Samples → BT → SLE → [*] SLE AT Sample

这等于设置了 CONFIG_SAMPLE_SUPPORT_SLE_AT_SAMPLE=y

fbb build ws63-liteos-app -p menuconfig
fbb build ws63-liteos-app

烧录到两块 WS63 板子。

第二步:接线

两块 WS63 的 UART0 分别接 PC 的两个串口。波特率 115200,8N1。

引脚 WS63 板 A WS63 板 B
TX 接 PC 串口 A 的 RX 接 PC 串口 B 的 RX
RX 接 PC 串口 A 的 TX 接 PC 串口 B 的 TX
GND 接 PC GND 接 PC GND

AT 指令不区分 Server 和 Client 固件——两块板子烧录同样的 AT 固件,通过不同的 AT 指令来扮演不同角色。这在调试时非常灵活——同一块板子既能当 Server 又能当 Client,随时切换。

第三步:Server 端操作

打开串口 A 的串口助手,依次输入:

AT                          → 返回 OK(确认 AT 框架正常)
AT+SLEADDR?                 → 返回本地 MAC 地址
AT+SLEADV=1,1,25            → 返回 OK(启动广播:句柄=1, 模式=可连可扫, 间隔=25ms)

第四步:Client 端操作

打开串口 B 的串口助手,依次输入:

AT                          → 返回 OK
AT+SLESEEK=1,100,100        → 返回 OK(启动扫描:PHY=1M, 间隔=100, 窗口=100)
                            → 自动上报扫描到的设备列表
AT+SLECONN=<addr>           → 返回 OK + conn_id(用第三步查到的地址)

第五步:验证连接

连接建立后,两端都会收到 unsolicited 上报:

+SLECONN:0,XX:XX:XX:XX     ← conn_id=0 表示第一条连接

此时可以继续测试配对和数据发送:

AT+SLEPAIR=0                → 返回 OK(配对 conn_id=0 的设备)
AT+SLERSSI=0                → 返回 RSSI 值(如 -45 dBm)
AT+SLENTF=0,hello_sle       → 发送通知数据

关键配置

Kconfig 配置

配置项 说明
CONFIG_SAMPLE_SUPPORT_SLE_AT_SAMPLE y 启用 SLE AT 指令 sample
CONFIG_SLE_AT_UART_PORT 0 AT 指令使用的 UART 端口号
CONFIG_SLE_AT_UART_BAUDRATE 115200 AT 指令串口波特率

串口参数

参数 说明
波特率 115200 固定,与 AT 固件匹配
数据位 8 标准配置
停止位 1 标准配置
校验位 标准配置
流控 AT 指令不需要硬件流控
换行符 \r\n (CRLF) AT 指令必须以此结尾

如果串口助手的换行设置不对(例如只发 \n),AT 框架无法识别指令结束符,会一直等待直到超时。

代码详解

本节无代码——AT 指令是通过串口交互的文本命令。以下为指令速查表,按功能分组排列。

发现类指令

指令模板 参数说明 返回格式 备注
AT+SLEADV=<handle>,<mode>,<interval> handle: 广播句柄(1~16); mode: 0=不可连不可扫 1=可连可扫 2=可连不可扫 3=不可连可扫; interval: 广播间隔(单位 125us) OK / ERROR 启动广播
AT+SLEADVSTOP=<handle> handle: 广播句柄 OK / ERROR 停止广播
AT+SLESEEK=<phy>,<interval>,<window> phy: 1=1M 2=2M 4=4M; interval: 扫描间隔; window: 扫描窗口 OK / ERROR 启动扫描,结果通过 +SLESEEK: 上报
AT+SLESEEKSTOP OK / ERROR 停止扫描

连接类指令

指令模板 参数说明 返回格式 备注
AT+SLECONN=<addr> addr: 12 位十六进制 MAC 地址(如 AABBCCDDEEFF) OK + conn_id / ERROR 发起连接
AT+SLEDISC=<conn_id> conn_id: 连接句柄(0~7) OK / ERROR 断开指定连接
AT+SLECONNUPDATE=<conn_id>,<min>,<max>,<latency>,<timeout> min/max: 连接间隔(125us); latency: 最大延迟; timeout: 监管超时(10ms) OK / ERROR 更新连接参数

数据类指令

指令模板 参数说明 返回格式 备注
AT+SLENTF=<conn_id>,<data> conn_id: 连接句柄; data: 字符串数据 OK / ERROR 发送通知(Notification)
AT+SLEINDC=<conn_id>,<data> 同上 OK / ERROR 发送指示(Indication,需对端确认)

安全类指令

指令模板 参数说明 返回格式 备注
AT+SLEPAIR=<conn_id> conn_id: 连接句柄 OK / ERROR 发起配对
AT+SLERMPAIR=<conn_id> conn_id: 连接句柄 OK / ERROR 删除绑定信息
AT+SLEBOND? 已绑定设备列表 查询已配对设备

信息查询类指令

指令模板 参数说明 返回格式 备注
AT+SLEADDR? 12 位十六进制 MAC 地址 查询本地地址
AT+SLERSSI=<conn_id> conn_id: 连接句柄 十进制 RSSI 值(如 -45) 读取当前连接 RSSI
AT+SLESTATE? 协议栈状态信息 查询当前 SLE 协议栈状态
AT+SLEVER? 版本号字符串 查询 SLE 协议栈版本

常见错误值

返回值 含义 可能原因
ERROR 通用错误 参数错误、指令格式错误、协议栈未就绪
+CME ERROR: 1 未连接 在未建立连接时调用了需要连接的操作
+CME ERROR: 2 参数无效 参数超出范围或格式不正确
+CME ERROR: 3 操作进行中 前一次同类操作尚未完成
+CME ERROR: 4 不支持 当前固件未开启此功能