先说下蓝牙客户端和服务端的区别。
例如:手机1做客户端,手机2服务端
手机1要连手机2,就要自己发起搜索,搜索到手机2,然后发起连接
而手机2什么都不要做,只要开启广播,让手机1连就可以。
所以,如果我们想让esp32处于别人随时可以搜索和连接的状态,就要将esp32设置成BLE服务端,买来的芯片所带程序并不能满足要求,在他的数据手册里有这样一段话,意思就是要想用蓝牙作为服务端,需要下载他所需的bin文件,才能正常使用。详细见下图。
需要下载原厂的bin程序,如何官网下载,可以翻阅我写的esp32学习笔记1,里面详细写了如何查找和下载。
下载到bin文件以后,打开文件夹,需要将at_customize.bin和目录customized_partitions下的ble_data.bin、server_ca.bin、server_cert.bin、server_key.bin下载到esp32中。
如何下载程序看上一篇笔记,这里,着重要注意他们的地址,曾经我因为不小心写错地址,捣鼓了很久重新下载原厂程序,才疏学浅踩坑不少,也因此整理了第一篇笔记。
不同版本地址不一样,我这篇的版本是ESP32-WROOM-32_AT_Bin_V2.0,打开下载工具,将bin导入,记得打钩,电机START,将这些bin文件下载到esp32中。下载完之后,就可以设置成蓝牙服务端了。
完成这些步骤,就可以配置成服务端了。
这时我们可以发送一下命令,让esp32作为服务端并将数据透传给收
AT+BLEINIT=2 //将esp32设置成蓝牙服务端
AT+BLEGATTSSRVCRE //GATTS 创建服务
AT+BLEGATTSSRVSTART //GATTS 开启全部服务。
AT+BLEGATTSCHAR? //GATTS 发现服务特征
AT+BLEADVSTART //打开广播
AT+BLESPPCFG=1,1,6,1,5 //配置 BLE 透传模式
AT+BLESPP //打开透传模式
发送数据
在这里有好几个坑:
1.打开广播后,手机设置里面的蓝牙怎么都无法扫描到
原因:这是以为,BLE不支持手机蓝牙,他需要下载BLE蓝牙调试工具,只有在BLE蓝牙调试工具中才能查找到esp32的蓝牙。
其次,在BLE蓝牙调试工具中,esp32并不能显示蓝牙的名称,只能显示地址。
2.在配置透传模式后,再发送AT+BLESPP回复ERROR,无法打开数据透传
原因,这是在配置AT+BLESPPCFG就已经错误。我们来看下收据手册:
在esp32现有的例程里,将1号服务的第7号设置为写通道,经过我的测试,我的板子设置成这样无法开启透传,而1号服务的第6号可以,具体机制还不是很清楚,仅供参考。
3.在打开透传模式之后,esp32无法同时接收手机发送过来的数据,只有退出透传模式才可以
这个主要是设置蓝牙透传模式AT+BLESPPCFG所决定的,这里经过我的验证,esp32有两种模式:
只能发送:AT+BLESPPCFG=1,1,6,1,5或AT+BLESPPCFG=1,1,6,1,3
可以接收和发送(双向透传):AT+BLESPPCFG=1,1,6,1,4
可能还有只接收的模式,我没有去验证。
4.如何才能在手机端的BLE调试助手中显示esp32的蓝牙名称
要将esp32作为蓝牙服务端,无法用AT+BLENAME设置名字,根据手册提示,如下:
可知,要设置名称需要用AT+BLEADVDATA指令,根据例程:
这样可以将蓝牙的名称设置成Espressif,这是因为457370726573736966是Espressif的hex码,打开http://stool.chinaz.com/hex,由下面解码工具可以得出:
如果想要设置蓝牙名字,只要将要设的名字输入上图框中,然后点击Hex编码,就会生成对应的hex码:
AT+BLEADVDATA=“0201060A09457370726573736966030302A0”
/* The adv data is
- 02 01 06 //,,
- 0A 09 457370726573736966 //,,
- 03 03 02A0 //,,
*/
其中,第一列表示长度,第二列表示命令,要将0A改成设置后的长度;
将加黑部分替换成生成的hex码,其他不变,接着分成以下两步:
1、AT+BLEADVPARAM=32,64,0,0,7
2、AT+BLEADVDATA=“0201060A09457370726573736966030302A0”
这样名字设置就完成了。
这时候,打开广播之后,名字就设置成自己想要的了。
AT+BLEINIT=2 //将esp32设置成蓝牙服务端
AT+BLEGATTSSRVCRE //GATTS 创建服务
AT+BLEGATTSSRVSTART //GATTS 开启全部服务。
AT+BLEADVSTART //打开广播