你好;da14585可以同时扫描和广告吗?如果是,如何实现它?
嗨btdev,
根据蓝牙LE规范,不可能同时扫描(GAP中心角色)和广告(GAP外围角色)。由于您正在使用DA14585,因此可以执行从外围设备到中央GAP配置的角色切换,反之亦然。这可以通过将角色设置为GAP_ROLE_ALL来实现,以便您可以发布或扫描。不可能同时做这两件事。
谢谢,PM_Dialog
谢谢你的支持。我有一个问题。我如何在扫描和广告之间切换?
让我们以SDK的ble_app_peripheral示例为起点。默认情况下,DA14585被配置为外设,所以它开始发布(无定向)。您可以使用app_easy_timer(),并在其到期时停止广告。一旦它停止,您就可以将设备配置为Central并开始扫描。您可以等待扫描完成(如果您在GAP_GEN_DISCOVERY中进行扫描),或者设置一个额外的计时器并取消扫描过程。当扫描完成后,也许你可以重新开始做广告。请按以下步骤进行角色转换。
—在“user_config.h”文件中将“user_gapm_conf”结构中的“。role”成员修改为“GAP_ROLE_ALL”。
创建一个user_scan_start()函数来开始扫描:
void user_scan_start(void) {struct gapm_start_scan_cmd* cmd = KE_MSG_ALLOC(gapm_start_scan_cmd, TASK_GAPM, TASK_APP, gapm_start_scan_cmd);cmd - > op。代码= GAPM_SCAN_ACTIVE;cmd - > op。addr_src = GAPM_STATIC_ADDR;cmd - >间隔= 16384;cmd窗口- > = 16384;cmd - >模式= GAP_GEN_DISCOVERY;cmd - > filt_policy = SCAN_ALLOW_ADV_ALL;cmd - > filter_duplic = SCAN_FILT_DUPLIC_EN; // Send the message ke_msg_send(cmd); // We are now connectable ke_state_set(TASK_APP, APP_CONNECTABLE); }
-在user_app_adv_start()函数中,有一个计时器,它启动的目的是在大约30秒后停止广告,所以我们将使用它来停止广告。
-所以在计时器adv_data_update_timer_cb()的回调中,调用app_easy_gap_advertise_stop()函数而不是更新广告字符串。
—在user_app_adv_undirect_complete()函数中调用user_scan_start()函数,以便当设备停止发布时开始扫描。
为了停止扫描,将不会使用额外的计时器来取消命令,但扫描本身的超时将被使用。
-一旦扫描结束就开始发布,创建函数user_on_scanning_completed(),并从该函数调用user_app_adv_start();
希望我的建议对你有所帮助!如果你发现任何有用的答案,请标记为“接受”。请把你的意见反馈给我。
谢谢你的支持。我之前想到过这个算法。但我担心数据丢失
谢谢你接受我的回答!问候,PM_Dialog
嗨btdev,
根据蓝牙LE规范,不可能同时扫描(GAP中心角色)和广告(GAP外围角色)。由于您正在使用DA14585,因此可以执行从外围设备到中央GAP配置的角色切换,反之亦然。这可以通过将角色设置为GAP_ROLE_ALL来实现,以便您可以发布或扫描。不可能同时做这两件事。
谢谢,PM_Dialog
谢谢你的支持。我有一个问题。我如何在扫描和广告之间切换?
嗨btdev,
让我们以SDK的ble_app_peripheral示例为起点。默认情况下,DA14585被配置为外设,所以它开始发布(无定向)。您可以使用app_easy_timer(),并在其到期时停止广告。一旦它停止,您就可以将设备配置为Central并开始扫描。您可以等待扫描完成(如果您在GAP_GEN_DISCOVERY中进行扫描),或者设置一个额外的计时器并取消扫描过程。当扫描完成后,也许你可以重新开始做广告。请按以下步骤进行角色转换。
—在“user_config.h”文件中将“user_gapm_conf”结构中的“。role”成员修改为“GAP_ROLE_ALL”。
创建一个user_scan_start()函数来开始扫描:
-在user_app_adv_start()函数中,有一个计时器,它启动的目的是在大约30秒后停止广告,所以我们将使用它来停止广告。
-所以在计时器adv_data_update_timer_cb()的回调中,调用app_easy_gap_advertise_stop()函数而不是更新广告字符串。
—在user_app_adv_undirect_complete()函数中调用user_scan_start()函数,以便当设备停止发布时开始扫描。
为了停止扫描,将不会使用额外的计时器来取消命令,但扫描本身的超时将被使用。
-一旦扫描结束就开始发布,创建函数user_on_scanning_completed(),并从该函数调用user_app_adv_start();
希望我的建议对你有所帮助!如果你发现任何有用的答案,请标记为“接受”。请把你的意见反馈给我。
谢谢,PM_Dialog
谢谢你的支持。我之前想到过这个算法。但我担心数据丢失
谢谢你接受我的回答!问候,PM_Dialog