你好,
I am working on a project wherein the default state of the chip is extended sleep mode. On reception of a low signal gpio interrupt, the chip wakes up, advertises 5 packets. After this, the device switches to scan mode. Now, when the device receive an advertising report, it switches to advertisement mode advertises the received packet, and after advertisement, switches back to scan. This process continues until 5 BLE packets are sent from the device. Parallely, I have initiated a uart2_read() operation in the app_wakeupcb(). Now, after advertisement of 5th packet(ie, the device is in peripheral/advertisement mode), the uart data is checked, and if any data is received, that data is sent from the device. This flow works fine.
另一方面,如果没有接收到广告报告(即,没有发生角色切换),则在扫描程序中()在10S扫描超时以来使用的扫描超时以来,自过了一般发现模式扫描以来,则角色切换到ADV启动模式,检查UART数据,如果接收到任何数据,则从设备发送数据。虽然我正在使用断点验证代码流,但流程良好。但是,该设备未发送任何广告。在启动每个广告start命令后,我正在调用50ms的计时器以取消广告。流程甚至通过错误状态GAP_ERR_CANCELED达到此回调。为什么这发生了?
代码片段如下:
void scanning_completed(UINT8_T状态)
{
if(status == GAP_ERR_TIMEOUT){
user_app_configuration_func(gap_peripheral_slv);
}
}
void user_app_configuration_func(uint8_t角色)
{
struct gapm_set_dev_config_cmd * cmd = ke_msg_alloc
(
gapm_set_dev_config_cmd,
task_gapm,task_app,
gapm_set_dev_config_cmd
);
// Set device configuration
cmd->operation = GAPM_SET_DEV_CONFIG;
//设置角色
cmd->角色=角色;
memset( cmd->irk.key, 0, sizeof(struct gap_sec_key));
cmd->外观= 0;
cmd-> sepose_write_perm = gapm_write_disable;
cmd-> name_write_perm = gapm_write_disable;
ke_msg_send(cmd);
返回;
}
空白user_app_on_set_dev_config_complete(空白)
{
send_uart_status();
}
void send_uart_status(void){
struct gapm_start_advertise_cmd * cmd;
cmd = app_easy_gap_non_connectable_advertise_get_active();
memset(cmd->info.host.adv_data,0,28);
memset(cmd-> info.host.adv_data,0,28);
cmd-> info.host.adv_data_len = 28;
memcpy(cmd-> info.host.adv_data,header_data,sizeof(header_data));
memcpy(&(cmd-> info.host.addata [4]),sample_data,sizeof(sample_data));
app_easy_gap_non_connectable_advertise_start();
timer_50ms = app_easy_timer(5,handle_50ms_timer);
}
void handle_50ms_timer(void)
{
++ no_of_uart_pkts_sent;
app_easy_gap_advertise_stop();
}
void user_app_adv_nonconn_complete(UInt8_t状态)
{
if(no_of_uart_pkts_sent <5){
send_uart_status();
}
别的{
no_of_uart_pkts_sent = 0;
去睡觉();
}
}
void go_to_sleep(void)
{
ARCH_SET_SLEEP_MODE(ARCH_EXT_SLEEP_ON);
ARCH_BLE_EXT_WAKEUP_ON();
//配置唤醒按钮
app_button_enable();
}
The control is as per expectation.
即,在第10秒超时之后,控制到达Scanning_Completed(),以及成功的设备配置完成,到达send_uart_status()。
When the no_of_uart_packets_sent count becomes 5, the device enters the go_to_sleep() also.
但是,当我使用嗅探器验证时,广告似乎似乎没有出局。
请尽早提出同样的原因和解决方案,因为这是我们进一步发展的阻碍。
Thanks
Wisilica.
Hi wisilica,
如果我妥善了,请纠正我,如果我错了,有一个案例从中央到外设切换角色(当设备当设备作为中心时没有接收的广告数据包时,您就会发出一个启动通告命令和您在操作时,请不要从设备中操作,而是在外设时,您可以获得当前广告程序被取消的广告完整的回调。除非您正在调用取消命令以在50毫秒计时器回调之前取消广告程序,否则我不会看到这种情况下的任何明显原因,您必须尝试设置,以便了解为什么会发生这种情况,例如您如果您不设置50毫秒计时器,可以从以下实验开始取消广告或设置更大的计时器,这是否具有相同的效果?你还不能看到设备广告吗?你还在收到完工回调吗?有什么状态?
此外,我认为启动和停止广告程序的原因是因为您想根据宣传事件进行划分并基于辅助数据包的作用。作为一个建议,有一种更有效和更直接的方式来做,而不是启动和停止广告过程,请检查user_on_ble_powered()回调中的信标示例,您可以使用它来计算广告事件(功能实用性检查最后一个BLE事件是BLE_EVT_END,如果它是行动,所以你可以增加测量广告事件的计数器)。您也可以在user_on_ble_powered()中调用计数器的状态,并在该点附加功能。
谢谢mt_dialog.