一、发射多个广播
6626 发射多个广播时,需要进行如下配置:
1、需要在omble_init 初始化协议栈参数时设置最大广播数量和最大连接数量,协议栈用于计数所需分配内存空间和管理对应通道
2、需要将每个广播参数里的adv_idx和local_addr设置不同的值。
adv_idx是6626用于区分不同广播通道
local_addr主要是给主机端(比如手机)用来区分扫描的是哪个广播,以及连接的时候发起连接请求
二、实现不同广播通道连接,上报不同gatts profile
1、实现不同的gatts profile
在一些多广播和多链接的应用场景中,针对不同的广播通道连接时,要求slave提供给对端不同gatts profile。这时需要使用更加底层的函数来创建服务。
ob_gatts_db_create来创建一个gatts db,并根据服务个数,提前分配内存空间。最好在初始化时调用,避免空间不足
ob_gatts_db_add_service向指定的gatts db中逐一添加服务,使用方式和 ob_gatts_add_service相同 最好在初始化时调用
ob_gatts_set_custom_db就是设置某个连接对应的gatt_db,从而实现不同连接显示不同gatt service的功能,连接事件时调用
2、初始化步骤
2.1、针对该蓝牙通道,先注册一个包含蓝牙连接、断连、广播状态切换的ble evt事件回调函数
2.2、设置gatts profile服务参数,以及往该gatts db添加服务
2.3、启动对应通道的广播
向GATTS DB增加服务
3、ble evt蓝牙连接事件处理逻辑
3.1、每次触发上报ble事件时,先去判断ble事件对于该蓝牙链接是否有效,上报的事件是否匹配本蓝牙的adv_idx和conn_idx,具体处理逻辑如下:
3.2、在上报的connect事件中,将协议栈分配的conn_idx保存起来;并设置该连接对应gatts profile,用于给主机发现服务和特性
三、测试结果
设备串口log
app操作截图
四、注意事项
1、存储每个链接的conn_idx的变量需要初始化为大于连接总数的无效值(因为协议栈默认上报的con_idx为0~max_con_num-1)这里设置为0xFF。并在对应蓝牙连接事件里保存协议栈上报的con_idx,断开事件里将变量恢复成无效值
2、注意每一路广播的adv_idx和addr
3、需要将每一路蓝牙的连接事件-断开事件-广播状态事件回调处理函数优先注册。demo提供一路蓝牙一个事件,实际应用中,一个服务就可以设置一个回调事件。注意每个回调函数都需先进行判断是否为该链接的事件,再进行处理。
4、应用场景:HID应用,不同系统可以使用不同HID服务;findmy加私有APP蓝牙;