6626实现多个广播,每个链接上报不同gatts profile

wenbw · 26次点击 · 7天前
一、发射多个广播
6626 发射多个广播时,需要进行如下配置:

1、需要在omble_init 初始化协议栈参数时设置最大广播数量和最大连接数量,协议栈用于计数所需分配内存空间和管理对应通道

image.png

2、需要将每个广播参数里的adv_idx和local_addr设置不同的值。
adv_idx是6626用于区分不同广播通道

local_addr主要是给主机端(比如手机)用来区分扫描的是哪个广播,以及连接的时候发起连接请求

image.png


二、实现不同广播通道连接,上报不同gatts profile

1、实现不同的gatts profile

在一些多广播和多链接的应用场景中,针对不同的广播通道连接时,要求slave提供给对端不同gatts profile。这时需要使用更加底层的函数来创建服务。

image.png

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、启动对应通道的广播

image.png

向GATTS DB增加服务

image.png

3、ble evt蓝牙连接事件处理逻辑

3.1、每次触发上报ble事件时,先去判断ble事件对于该蓝牙链接是否有效,上报的事件是否匹配本蓝牙的adv_idx和conn_idx,具体处理逻辑如下:

image.png

3.2、在上报的connect事件中,将协议栈分配的conn_idx保存起来;并设置该连接对应gatts profile,用于给主机发现服务和特性

image.png


三、测试结果

设备串口log

image.png

app操作截图

image.png


四、注意事项

1、存储每个链接的conn_idx的变量需要初始化为大于连接总数的无效值(因为协议栈默认上报的con_idx为0~max_con_num-1)这里设置为0xFF。并在对应蓝牙连接事件里保存协议栈上报的con_idx,断开事件里将变量恢复成无效值
2、注意每一路广播的adv_idx和addr
3、需要将每一路蓝牙的连接事件-断开事件-广播状态事件回调处理函数优先注册。demo提供一路蓝牙一个事件,实际应用中,一个服务就可以设置一个回调事件。注意每个回调函数都需先进行判断是否为该链接的事件,再进行处理。
4、应用场景:HID应用,不同系统可以使用不同HID服务;findmy加私有APP蓝牙;


ble_app_multi_adv_and_gatts_profile-202504113099.zip
被收藏 0  ∙  0 赞  
加入收藏
点赞
0 回复  
善言善语 (您需要 登录 后才能回复 没有账号 ?)

请先登录网站