1 引言
1.1 概述
利尔达WB81模组支持wifi/蓝牙透传,如果在WB81设备上需要同时开启这两个模式,传输方式只支持普通模式。因为忽略这一要求,用户在调试的时候可能会遇到以下情况:
1、开启了Wi-Fi透传,蓝牙初始化失败,蓝牙功不能正常使用;
2、同时开启Wi-Fi和蓝牙之后,Wi-Fi和蓝牙设置透传模式都会失败。
为了满足这一要求,本文档主要介绍 BLE 普通传输的使用方法,并提供在WB81设备上运行这些命令的详细示例。
2 示例
以下示例同时使用两块WB81开发板,其中一块作为 BLE主机(扫描-连接),另一块作为 BLE从机(广播-被连接)。这个例子展示了应如何使用AT命令读写服务特征值(收发数据),完成数据通信。
在以下步骤中以WB81-从机开头的操作只需要在WB81 BLE从机端执行即可,以WB81-主机开头的操作只需要在WB81 BLE主机端执行即可。
2.1 设置BLE初始化角色
从机端:设置为从机模式
AT+BLEINIT=2 //设置模组为从机模式
ok
AT+BLEGATTSSRVCRE //创建服务
ok
AT+BLEGATTSSRVSTART //开启服务
ok
主机端:设置为主机模式
AT+BLEINIT=1 //设置模组为主机模式
ok
2.2 广播-扫描
从机端:开启广播
AT+BLEADVPARAM=50,50,0,0,7,0,, //设置广播参数:最小间隔;最大间隔;广播类型;本机地址类型;广播信道;过滤规则;
ok
AT+BLEADVDATA="0201060A09457370726573736966030302A0" //设置广播数据。数据内容参考广播数据详解
ok
AT+BLEADVSTART //开启广播
ok
AT+BLEADDR? //查询本机MAC地址
+BLEADDR:"b0:b2:1c:f4:53:e6"
OK
主机端:开启扫描
AT+BLESCAN=1,3,1,"b0:b2:1c:f4:53:e6" //扫描MAC地址为"b0:b2:1c:f4:53:e6"的广播包
+BLESCAN:"b0:b2:1c:f4:53:e6",-34,0201060a09457370726573736966030302a0,,0
2.3 连接
主机端:发起连接
AT+BLECONN=0,"b0:b2:1c:f4:40:da" //建立连接号为0,从机MAC地址为"b0:b2:1c:f4:40:da"的连接
OK
从机端:连接响应
+BLECONN:0,"54:43:b2:6e:dc:6a" //连接号为0,主机MAC地址为 "54:43:b2:6e:dc:6a"
2.4 查询本地服务/特征值
查询服务
①主机端:
AT+BLEGATTCPRIMSRV=0 //查询连接号为0的服务
+BLEGATTCPRIMSRV:0,1,0x1801,1
+BLEGATTCPRIMSRV:0,2,0x1800,1
+BLEGATTCPRIMSRV:0,3,0xA002,1
+BLEGATTCPRIMSRV:0,4,0xA003,1
OK
②从机端:
AT+BLEGATTSSRV? //查询本地服务
+BLEGATTSSRV:1,1,0xA002,1
+BLEGATTSSRV:2,1,0xA003,1
OK
查询特征值
③主机端:
AT+BLEGATTCCHAR=0,3
+BLEGATTCCHAR:"char",0,3,1,0xC300,0x02
+BLEGATTCCHAR:"desc",0,3,1,1,0x2901
+BLEGATTCCHAR:"char",0,3,2,0xC301,0x02
+BLEGATTCCHAR:"desc",0,3,2,1,0x2901
+BLEGATTCCHAR:"char",0,3,3,0xC302,0x08
+BLEGATTCCHAR:"desc",0,3,3,1,0x2901
+BLEGATTCCHAR:"char",0,3,4,0xC303,0x04
+BLEGATTCCHAR:"desc",0,3,4,1,0x2901
+BLEGATTCCHAR:"char",0,3,5,0xC304,0x08
+BLEGATTCCHAR:"char",0,3,6,0xC305,0x10
+BLEGATTCCHAR:"desc",0,3,6,1,0x2902
+BLEGATTCCHAR:"char",0,3,7,0xC306,0x20
+BLEGATTCCHAR:"desc",0,3,7,1,0x2902
+BLEGATTCCHAR:"char",0,3,8,0xC307,0x02
+BLEGATTCCHAR:"desc",0,3,8,1,0x2901
OK
④从机端:
AT+BLEGATTSCHAR?
+BLEGATTSCHAR:"char",1,1,0xC300,0x02
+BLEGATTSCHAR:"desc",1,1,1,0x2901
+BLEGATTSCHAR:"char",1,2,0xC301,0x02
+BLEGATTSCHAR:"desc",1,2,1,0x2901
+BLEGATTSCHAR:"char",1,3,0xC302,0x08
+BLEGATTSCHAR:"desc",1,3,1,0x2901
+BLEGATTSCHAR:"char",1,4,0xC303,0x04
+BLEGATTSCHAR:"desc",1,4,1,0x2901
+BLEGATTSCHAR:"char",1,5,0xC304,0x08
+BLEGATTSCHAR:"char",1,6,0xC305,0x10
+BLEGATTSCHAR:"desc",1,6,1,0x2902
+BLEGATTSCHAR:"char",1,7,0xC306,0x20
+BLEGATTSCHAR:"desc",1,7,1,0x2902
+BLEGATTSCHAR:"char",1,8,0xC307,0x02
+BLEGATTSCHAR:"desc",1,8,1,0x2901
+BLEGATTSCHAR:"char",2,1,0xC400,0x02
+BLEGATTSCHAR:"desc",2,1,1,0x2901
+BLEGATTSCHAR:"char",2,2,0xC401,0x02
+BLEGATTSCHAR:"desc",2,2,1,0x2901
OK
WB81的典型服务通道:
注意:
1. 主机使用查询本地服务/特征,需要先建立 Bluetooth LE 连接
2. 主机查询服务的结果,比从机查询服务的结果多两个默认服务(UUID: 0x1800和0x1801),这是正常现象。正因如此,对于同一服务,主机查询的<srv_index>值等于从机查询的<srv_index>值+2。例如上述示例中的服务0xA002,当前在主机端查询到的<srv_index>为3,再从机端查询则是1。
2.5 收发数据
2.5.1 从机 NOTIFY 服务特征值给主机端 (0xc305)
1. 主机使能NOTIFY
主机只有使能成功后,才能收到从机的notify数据
//主机使能 NOTIFY 通道
AT+BLEGATTCWR=0,3,6,1,2 //固定参数
>
12 //任意2字节数据,取消回车换行发送
OK
//使能成功,从机端返回
+WRITE:0,1,6,1,2,\0
2. 从机发送数据
将len换成自己需要发送的数据长度,例如示例1,发送10个字节给从机,从机收到数据会返回如下打印
AT+BLEGATTSNTFY=1 0,1,6,len
3. 示例1
从机端notify数据:
AT+BLEGATTSNTFY=0,1,6,10
>
1234567890
ok
主机端接收打印:
+NOTIFY:0,3,6,10,1234567890
2.5.2 从机 indicate 服务特征值给主机端(0xc306)
1. 主机使能 indicate 通道
只有主机使能成功,才能收到从机的indicate数据
//主机使能 INDICATE 通道
AT+BLEGATTCWR=0,3,7,1,2 //固定参数
>
12 //任意2字节数据,取消回车换行发送
OK
//使能成功,从机端返回
+WRITE:0,1,7,1,2,\0
2. 从机发送数据
将len换成自己需要发送的数据长度,例如示例2,发送4个字节给主机,主机收到数据会返回如下打印
AT+BLEGATTSIND=1 0,1,7,len
3. 示例2
从机端incidate数据:
AT+BLEGATTSIND=0,1,7,4
>
1234
OK
主机端接收打印:
+INDICATE:0,3,7,4,1234
2.5.3 主机写数据给从机(0xc304)
1. 主机发送数据
将len换成自己需要发送的数据长度,最大支持512,例如示例3,发送6个字节给从机,从机收到数据会返回如下打印
AT+BLEGATTCWR=0,3,5,,len
2. 示例3:
主机端发送数据:
AT+BLEGATTCWR=0,3,5,,6
>
456789
OK
从机端接收打印:
+WRITE:0,1,5,,6,456789
2.5.4 主机读取特征值(0xc301)
0xc301这个通道的值,只有主机主动去读才会获取
1. 从机写入数据
将len换成自己需要发送的数据长度,最大支持512,例如示例4,发送3个字节给主机
AT+BLEGATTSSETATTR=1 1,2,,len
2. 主机读取
发送指令AT+BLEGATTCRD=0,3,2 读取特征值,读取成功会有如示例4的打印
AT+BLEGATTCRD=0,3,2
3. 示例4:
从机端写入特征值:
AT+BLEGATTSSETATTR=1,2,,3
>
333
ok
+READ:0,"b0:b2:1c:f4:40:da"
主机端读取特征值:
AT+BLEGATTCRD=0,3,2
+BLEGATTCRD:0,3,333
OK
3、详解
1. 服务/特征值指令
①AT+BLEGATTCPRIMSRV=<conn_index>
+BLEGATTCPRIMSRV:<conn_index>,<srv_index>,<srv_uuid>,<srv_type>
②+BLEGATTSSRV:<srv_index>,<start>,<srv_uuid>,<srv_type>
③AT+BLEGATTCINCLSRV=<conn_index>,<srv_index>
+BLEGATTCCHAR:"char",<conn_index>,<srv_index>,<char_index>,<char_uuid>,<char_prop>
+BLEGATTCCHAR:"desc",<conn_index>,<srv_index>,<char_index>,<desc_index>,<desc_uuid>
④+BLEGATTSCHAR:"char",<srv_index>,<char_index>,<char_uuid>,<char_prop>
+BLEGATTSCHAR:"desc",<srv_index>,<char_index>,<desc_index>,<desc_uuid>
•<conn_index>:Bluetooth LE 连接号,范围:[0,2]。
•<srv_index>:服务序号,从 1 开始递增。
•<srv_uuid>:服务的 UUID。
•<srv_type>:服务的类型:
0: 次要服务;
1: 首要服务。
•<start>:
0: 服务未开始;
1: 服务已开始。
•<char_index>:服务特征的序号,从1起始递增。
•<char_uuid>:服务特征的UUID。
•<char_prop>:服务特征的属性。
•<desc_index>:特征描述符序号。
•<desc_uuid>:特征描述符的UUID。
2. char_prop特征值权限
表1 特征值权限
3. char_prop和特征值对应关系
例如从机 发送NOTIFY (0xc305)服务特征值给主机端 ,是通过如下命令实现:
AT+BLEGATTSNTFY=1 0,1,6,len
原始命令参数格式: AT+BLEGATTSNTFY=<conn_index>,<srv_index>,<char_index>,<length>
我们是如何确定指令中的参数的呢,具体操作如下:
1) conn_index ,是【2.3 连接】中主机端发起连接时设置的连接号
2)查看 表-1 特征值权限,找到权限对应的char_prop,例如notify权限的char_prop为0x10
3)在【2.4 查询本地服务/特征值】中的④从机端 数据可以获取char_prop为0x10的特征参数如下图3.1
特征参数格式如图3.2,其中<srv_index> :1; <char_index> :6;
图3.1 从极端特征值参数
图3.2 +BLEGATTSCHAR返回参数格式 |