[求助] bluenrg如何在建立通信的同时,对外发送beacon广播?

SENSORTILE   2021-11-5 17:29 楼主

硬件:st的sensortile,其中使用了bluenrg芯片作为蓝牙通信

已经实现的功能:建立服务,实现读写

期待的新功能:在不影响原有通信的基础上,使得bluenrg仍然可以发送beacon广播。

问题:

经过我的测试,新功能中,aci_gap_set_non_connectable_IDB05A1(ADV_NONCONN_IND, STATIC_RANDOM_ADDR);设置成不可连接状态后,调用aci_gap_update_adv_data(31, data_array);这时能实现beacon功能。

但是原有的代码是aci_gap_set_discoverable(ADV_IND, 0, 0,。。。),建立连接后才能实现蓝牙服务的读写。

这两个功能单独测试都成功了,现在的问题是,两端代码放在一起就不能正常工作。

应该怎么做呢?

回复评论 (11)

代码的移植没有做好吧

点赞  2021-11-6 08:30

你连接之后,继续设置广播,获取设置成2从模式。

点赞  2021-11-7 14:23

你目前代码可能在连接之后关闭广播了,你可以看看。

点赞  2021-11-7 14:23
引用: wangerxian 发表于 2021-11-7 14:23 你目前代码可能在连接之后关闭广播了,你可以看看。

还是不知道为啥啊。。。芯片是bluenrg-ms,st官网上的en.X-CUBE-BLE1_v6.2.2示例代码,beacon那一部分,示例里面也是先调用aci_gap_set_discoverable函数将蓝牙设置为不可连接状态,然后再调用aci_gap_update_adv_data函数,发送beacon广播数据。问题是最开始我需要先建立蓝牙连接(可连接状态),建立连接后再准备发送beacon就会使得之前的连接中断了。

点赞  2021-11-9 15:50
引用: SENSORTILE 发表于 2021-11-9 15:50 还是不知道为啥啊。。。芯片是bluenrg-ms,st官网上的en.X-CUBE-BLE1_v6.2.2示例代码,beacon那一部分, ...

而且,也没有看到有关闭广播的代码。示例代码SampleApp那一章,建立连接的回调函数GAP_ConnectionComplete_CB中只是简单设置了几个全局flag,没有关闭广播。emmmmmm很是疑惑。。。

点赞  2021-11-9 15:57
引用: SENSORTILE 发表于 2021-11-9 15:50 还是不知道为啥啊。。。芯片是bluenrg-ms,st官网上的en.X-CUBE-BLE1_v6.2.2示例代码,beacon那一部分, ...

你可以看aci_gap_set_discoverable实现了什么,你连接之后,实现这个函数和aci_gap_update_adv_data函数就可以了。
你要实现的这个功能应该不是难事。

点赞  2021-11-9 16:25

首先可以确认的是你提及的应用场景是可以实现的,即先发送可连接广播,连接后再同时地发送不可连接广播。

 

需要先说明的是,发送广播的步骤为:

1. 配置广播参数:aci_gap_set_advertising_configuration

2. 提供广播数据:aci_gap_set_advertising_data 

3. 使能广播:aci_gap_set_advertising_enable

 

以上步骤,可在每一个广播链路(L2CAP 层)上启用,每个广播链路,通过 Advertising_Handle 来标识。

你在上述三个 API 中都可以找到 Advertising_Handle 参数。

 

对于你的应用场景,你可以先使能扩展广播 (EXTENDED_ADV ),然后:
一、

1. aci_gap_set_advertising_configuration(0, ...) // 可连接广播

2. aci_gap_set_advertising_data (0, ...)

3. aci_gap_set_advertising_enable(0, ...)

二、

1. aci_gap_set_advertising_configuration(1, ...) // 不可连接广播

2. aci_gap_set_advertising_data (1, ...)

3. aci_gap_set_advertising_enable(1, ...)

来实现。

点赞 (1) 2021-11-10 11:47

感谢大家回复。emmmm,sensortile的蓝牙芯片是支持4.2标准的bluenrg-ms芯片(不是-2这种蓝牙5.*的芯片)。我查阅了一下,应该是不支持多从模式,也不支持扩展广播。

现在我感觉,其中一个可行的方案是,利用4.2协议可以主从一体的特性。

1,sensortile作为central,连接我的遥控(esp32, 设置成peripheral)。然后不断去读esp32的服务。

2,sensortile作为peripheral,可以设置成disconnectable,然后发送beacon(项目中是为了室内基站定位)

点赞  2021-11-10 14:31
引用: SENSORTILE 发表于 2021-11-10 14:31 感谢大家回复。emmmm,sensortile的蓝牙芯片是支持4.2标准的bluenrg-ms芯片(不是-2这种蓝牙5.*的芯片)。 ...

你看8楼给你的回复了吗?

点赞  2021-11-10 14:48
引用: nmg 发表于 2021-11-10 14:48 你看8楼给你的回复了吗?

看了啊,我查了,扩展广播是5.0的新特性。。。在我这4.2的sdk中,广播那些api都没有广播句柄,不支持多个广播。

点赞  2021-11-10 14:53
引用: SENSORTILE 发表于 2021-11-10 14:53 看了啊,我查了,扩展广播是5.0的新特性。。。在我这4.2的sdk中,广播那些api都没有广播句柄,不支持多个 ...

广播包还是 legacy 的广播包,没有用到扩展广播相关的标志。

上述是借用了扩展广播的”能力“,而没有用到扩展广播包。

BlueNRG-1/2 的 SDK 的蓝牙 API 确实没 BlueNRG-LP 的那么灵活。

 

但是,BlueNRG-1/2 上,“多从”也是可以实现的。

 

你可以先发一个可连接广播出来;连上之后,再执行上述开启广播的步骤(不使用 adv handler),把不可连接广播发出来。

主要调试、实现操作如下:

1. 配置协议栈,使其支持多个链路

2. 实现两个函数:start_connectable_adv();  start_beacon_adv(); 然后单独验证其可行性。

3. 实现流程:先发可连接广播,连接成功后发 beacon 广播,断开连接后再发可连接广播

 

 

点赞  2021-11-10 17:46
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复