简介
现在 ESP-AT
命令支持两个经典蓝牙 Profile, SPP
和 A2DP
, 但不是所有的模组都默认支持 BT 的命令, 目前只有 WROVER-32 的 release bin 默认打开了 BT SPP 命令.
如果客户需要使用 A2DP
命令, 需要使用带 PSRAM
的模组, 并且更改 partition
分区表, 因为默认的 partition
分区表里给app.bin
分配的大小是 1.5MB
, 如果再打开 A2DP
的命令, 编译出来的固件大概会是 1.7MB
, 建议有这样需求的客户使用 8MB flash
或者更大的模组, 并且需要带 PSRAM
.
Note:
v2.0.0.0
之后的版本, 才默认打开BT SPP
命令, 以前的不具有BT
功能;- 也可以
make SILENCE=1
编译, 会减少bin
大小, 但是不会有log
信息出来
1. 基础 BT 命令
在使用经典蓝牙的时候, 第一步就是初始化经典蓝牙协议栈, 这是使用其他 BT
命令的前提条件.
初始化 BT
AT+BTINIT=1
OK
如果使用完之后, 也可以关闭协议栈.
关闭 BT
AT+BTINIT=0
OK
初始化 BT
之后, 可以做一些参数设置, 比如设备名字, 发现模式, 加密参数等等.
设置名字
AT+BTNAME="EXAMPLE"
OK
设置名字这个应该不用过多解释, 一看就懂.
设置发现模式
AT+BTSCANMODE=2
OK
参数 2, 表示是可发现可连接, 另外两个参数 0 和 1, 可以参照指令文档.
一般这里建议支持设置为 2, 就可以了, 如果是被连接上之后不想再被连接, 可以再设置为 0.
Tips
- 这条命令是能被连接的必要条件, 必须要设置
加密参数
AT+BTSECPARAM=3,1,"9527" // NO input NO output, fixed PIN code, 9527
OK
这条命令用来设置 IO capabillity
, PIN type
以及 PIN code
Tips
ESP-AT BT
同时支持Simple pair
和Legacy pair
, 如果对端设置也支持Simple pair
的话, 就不会走 Legacy pair 的流程.
发现周边设备
// General inquiry mode, inquiry duration: 10, inquiry response: 10
AT+BTSTARTDISC=0,10,10
OK
每个参数的定义以及范围, 请参考命令手册, 下面我们举一个完整的例子:
AT+BTINIT=1
OK
AT+BTSCANMODE=2
OK
AT+BTSTARTDISC=0,10,10
+BTSTARTDISC:50:8f:4c:f2:84:19,xcg,0x2,0x3,0x2d0,-65
+BTSTARTDISC:50:8f:4c:f2:84:19,,0x2,0x3,0x2d0,-69
+BTSTARTDISC:50:8f:4c:f2:84:19,,0x2,0x3,0x2d0,-70
+BTSTARTDISC:50:8f:4c:f2:84:19,,0x2,0x3,0x2d0,-64
+BTSTARTDISC:a8:9c:ed:b0:06:ff,,0x2,0x3,0x2d0,-65
OK
同样子, 参数的描述请参考命令手册.
+BTSTARTDISC:<bt_addr>,<dev_name>,<major_dev_class>,<minor_dev_class>,<major_srv_class>
2. BT SPP 命令
上面是通用的 BT
命令, 我们现在介绍 SPP Profile
相关的命令
首先还是初始化 Profile
, 在这之前需要初始化 BT
协议栈.
初始化 SPP Profile
AT+BTSPPINIT=2
OK
这里的参数可以选择 0, 1, 2, 其中:
- 0: 表示关闭
SPP profile
- 1: 表示初始化为
Master
- 2 表示初始化为
Slave
在一般的应用场景中, 都是模组被 PC
和手机连接的较为常见, 这里我们就举例初始化为 Slave
.
如果客户需要用两块 ESP32 AT
来测试的话, 可以分别初始化两块模组为 Master
和 Slave
.
开启 SPP 服务
AT+BTSPPSTART
OK
这个是必须操作, 建议在初始化为 Slave
之后就立刻开启. 如果是 Master
, 那么这条命令不用下发.
等待被连接
这个时候, PC
或者手机的系统蓝牙设置里面应该就能扫描到我们的模组了, 在 PC
或者手机端点击链接, 有的电脑会显示连接上, 然后又断开了, 而且模组这里没有被连接的 log, 这个要紧, 请直接打开串口工具, 在端口号里选择这个 SPP
的端口, 点击连接, 就可以了, 这个时候, 连接的 log 就出来了.
+BTSPPCONN:<conn index>,<remote_addr>
数据发送
数据发送用的命令是:
// conn_index: 0, data length: 30
AT+BTSPPSEND=0,30
>
OK
这是发送指定长度数据的命令, 其实和其他 AT
命令发送方式一样, 如果想进入 BT SPP
透传, 直接输入 exe
命令:
AT+BTSPPSEND
>
如果退出透传模式, 输入 '+++'
.
数据接收
如果 PC
或者手机主动发送数据, ESP-AT
这里会有 log 提示:
+BTDATA:<length>,<data>
如果是透传模式的话, 那么前面的部分就没有了, 只有 data
部分.
连接
如果我们现在用的是 ESP32 BT
连接 ESP32 BT
, 那么我们可以在 Master
端发起连接:
例如:
// conn_index: 0, sec_mode: 0 -> No security, remote_address
AT+BTSPPCONN=0,0,"24:0a:c4:09:34:23"
OK
Tips
- 这里的第二个参数目前就设置为 0, 不要设置为别的参数
3. BT A2DP 命令
A2DP
有两个角色: A2DP Sink
和 A2DP Source
.
在初始化 BT
协议栈之后, 可以选择初始化为 Sink
或者 Source
.
3.1 初始化为 Sink
初始化为 Sink
之前, 需要做一些前置命令;
AT+BTINIT=1
OK
AT+BTSCANMODE=2
OK
另外设置名字以及加密参数的命令是可选的, 用户可以自行选择是否添加.
现在可以初始化 A2DP Profile
:
AT+BTA2DPINIT=2
OK
这个时候就是等待被连接了, 如果 Source
端开始播放音乐了, 那么 Sink
端这里可以做一些控制, 比如:
- 暂停
- 开始
- 快进
- 下一首
- 上一首
AT+BTA2DPCTRL=<conn_index>,<ctrl>
OK
-
ctrl: types of control.
- 0 : stop play
- 1 : start play
- 2 : forward
- 3 : backward
- 4 : fastward start
- 5 : fastward stop
Tips:
- 使用
A2DP Sink
需要客户自己添加I2S
部分的代码, 初始化I2S
部分的代码可以加在外部app_main
里面. decoder
芯片部分的驱动代码也需要客户自行添加.
3.2 初始化为 Source
如果需要做 A2DP Source
, 前面部分的初始化和上面都是一样的.
初始化为 A2DP Source
:
AT+BTA2DPINIT=2
OK
设置音频源:
AT+BTA2DPSRC="https://dl.espressif.com/dl/audio/ff-16b-2c-44100hz.mp3"
目前我们仅支持 MP3
格式, 后续会支持其他音乐格式以及从本地 flash
读取音频文件.
在正式开始播放音乐之前, 还必须连接上网络, 需要连上一个连接外网的路由器, 连接的步骤这里就不重复.
开始播放音乐:
AT+BTA2DPCTRL=<conn_index>,<ctrl>
OK
-
conn_index: index of classic bluetooth A2DP connection; only 0 is supported for the single connection right now.
-
ctrl: types of control.
- 0 : stop play
- 1 : start play
- 2 : suspend