.app_on_adv_report_ind未直接执行!

了解更多常见问题解答教程

10个帖子/ 0个新帖子
最后一篇
塞巴斯蒂安埃德曼
离线
最后一次露面:3年2个月前
加入:2017-05-29 12:02
.app_on_adv_report_ind未直接执行!

你好,

以下背景(使用SDK 5.0.4):
我们已经设置了一个广告客户,每2秒钟在同一频道上传输5条消息。(在BLE_POWERED回调时,我们等待从BLE_EVT_TX转换到BLE_EVT_END,然后我们取消使用app_advertise_stop_op()的传输,然后在UNDILECT_COMPLETE回调时重新启动它)。这是作品,我们通过当前测量验证了它们立即传输,中央设备接收所有消息,并且一切都很好,但是在接收时延迟消息,中央设备中的.app_on_adv_report_ind在中央设备中不会传递消息它到了。例如:

外围发送消息1 2,3,4和5,其中大约10ms中的约10ms,然后等待2秒将导致以下内容:
外周发射:1(10ms)2(10ms)3(10ms)4(10ms)5(约2秒)1(10ms)2(10ms)3(10ms)3(10ms)4(10ms)4(10ms)4(2秒)1 ...。
中央接收:1,2,3(约2秒)4,5,1,2,3,4(2秒)5,1 ....

消息4,5和下一个周期消息5被延迟了几秒钟!如果您添加另一个外围设备到此(或另一个BT设备在同一频道传输),您将注意到消息与那些消息一起接收。这意味着如果你在一个有大量BT通信的地区,你很可能不会注意到这个bug。

消息似乎被SDK接收和收集,但直到有足够的消息排队或类似的消息时才释放。你能证实吗?或者让我知道是否有一种方法可以迫使SDK释放接收到的消息?

2.并请提供一些SDK的文档。这是非常糟糕的文件!
3.修正登录到支持网站,我必须按“请求新密码”每次我登录到这里。

关键词:
设备:
mt_dialog.
离线
最后一次露面:16小时17分钟前
职员
加入:2015-06-08 34
嗨塞巴斯蒂安,

嗨塞巴斯蒂安,

  1. 通知应用程序已接收到广告字符串的回调不会直接触发,但也不等待填充缓冲区。一旦该特定频道结束的扫描窗口,回调将对应用程序执行并报告,并且还存在在特定扫描窗口在拥挤的环境情况下完成设备之前报告的情况。设备将在每个扫描窗口之间存在的间隔时段中报告任何广告字符串,通常在扫描窗口之后。关于你提到的2秒,我没有看到它背后的任何合理的解释,如果空气上有数据,并且设备将报告的广告数据没有过滤,那么设备将向应用程序通知所接收的数据在每个通道上完成扫描后,它不必等待要填充的任何缓冲区。也许您应该检查扫描设置(扫描间隔和窗口,如果应用任何过滤)。此外,除非您继续开始并停止广告过程,否则我不知道如何在10ms时使用10ms的间隔传输广告字符串。另请注意,广告并不能保证客户端将收到来自外设发送的所有消息。
  2. 如果您可以对文档提供一些特定评论,我很乐意将其传递在SDK和文档团队上。
  3. 关于登录不工作的事实,请注意以下几点,因为网站的管理员告诉我,机制是检查的,大多数时候,用户体验是由于:
    1. 输入新密码后忘记点击保存。
    2. 没有注意到密码没有得到更新,因为用户没有注意到红色改变框告诉他们他们的密码与安全标准不匹配。
    3. 使用他们的浏览器自动密码建议,与他们的新密码建议不同。
    4. 误读密码或用户名

谢谢mt_dialog.

塞巴斯蒂安埃德曼
离线
最后一次露面:3年2个月前
加入:2017-05-29 12:02
谢谢你的快速回复,

谢谢你的快速回复,

  1. 接收:
    接收设置为以下内容:
    cmd-> op.code = gapm_scan_passive;
    cmd-> op.addr_src = gapm_public_addr;
    cmd-> interval = llm_scan_interval_max;
    cmd窗口- > = LLM_SCAN_WINDOW_MAX;
    cmd-> mode = gap_observer_mode;
    cmd-> filt_policy = scan_allow_adv_all;
    cmd-> filter_duplic = scan_filt_duplic_dis;
    附加的图像(logic_analyzer_image_descripbing_the_reception _problem.zip)显示了在更“拥挤”的环境中的接收情况(一些设备每80ms发布一次广告)。
    第一行(蓝色)是消息的传输(当在外围设备中执行函数app_advertise_start_msg_send(cmd)时)
    第二行(棕色)是回调函数.app_on_adv_report_ind在中央执行的时间。
    第三行(红色)是在中央设备内处理正确的消息时。
    您可以在图像中看到,外设传输4条消息(蓝线,1.至4)。它们在部分(棕色线条,5.至8.至13页)中收到。前三条消息(第5.到7号)是其他一些广告,不适合我们,并收到我们的消息编号8.(并处理为第9号),其余(第2号。到4号延迟到第13号延迟)。然后它们被加工为14.到16。
    2.至4的接收延迟直到接收到数字13.(或可能是扫描窗口的结尾,该窗口设置为10秒)。

    是否有任何方法可以释放消息2.到4.之前.13已经到达?喜欢发送触发释放的KE_MESSAGE,或模拟2条消息的接收或类似的接收?

    或者看接收,.app_on_adv_report_ind函数总是连续4次执行,这表明接收缓冲区是4个邮件大,可以将此消息减少到1条消息吗?

    传送:是的,我们停下来又重新开始,这将每四五秒产生一条信息。

  2. 例如:
    • 扫描文档在哪里(上面参数的描述)
    • 解释如何处理不同的状态,例如ke_state_set(task_app,app_connectable)
  3. 输入新密码后忘记点击保存。
    - >我输入了这些字母,然后按下了
    没有注意到密码没有得到更新,因为用户没有注意到红色改变框告诉他们他们的密码与安全标准不匹配。
    ->它被标记为强
    使用他们的浏览器自动密码建议,与他们的新密码建议不同。
    - >我始终关闭了这个功能
    误读密码或用户名
    >我甚至在保存后直接尝试。它仍然没有工作。
    你有什么可以让我试试的吗?
mt_dialog.
离线
最后一次露面:16小时17分钟前
职员
加入:2015-06-08 34
嗨塞巴斯蒂安,

嗨塞巴斯蒂安,

  1. 减少扫描窗口和扫描间隔,您正在使用扫描过程的最大值,尝试使用像扫描窗口的间隔和5的值。如上所述设备将通常在扫描窗口的末尾报告,因此如果保持扫描窗口长(大约10秒)并且您具有与间隔相同的值,则报告将被延迟(从您延迟注意有一个缓冲功能功能,但这位于堆栈中的ROM代码中)。尝试使用上面提到的值,这应该解决您的问题。
  2. 关于文档:
    1. 不幸的是,没有涉及中央函数的程序没有文件,因为大多数用户都是面向外设的。
    2. 您可以查看文档UM-B-051 1458x软件平台参考文档5.3任务.PDF。
  3. 对不起,我将通知管理员,如果有其他事情发生,让你知道。

谢谢mt_dialog.

塞巴斯蒂安埃德曼
离线
最后一次露面:3年2个月前
加入:2017-05-29 12:02
你好MT_dialog,

你好MT_dialog,

  1. 因为我们只在一个通道上发送和接收,所以我们依赖GAPM_START_SCAN_CMD / GAPM_CANCEL_CMD架构。将扫描窗口减少到如此小的尺寸将使它无用,因为GAPM_CANCEL_CMD,似乎丢弃了缓冲区中的所有消息。这导致基本上没有收到任何消息!所以不幸的是,这不是一个选择,除非我们监督了一些东西。

    是否有一种方法来触发在扫描期间缓冲区中接收到的消息的释放?例如:我能以某种方式发出一个内部消息,以便堆栈相信它正在接收第4个消息,从而释放缓冲区吗?或者我能触发提前扫描结束吗?

    或者有没有办法在扫描窗口结束时设置回调,以便我可以从那里取消它?

  2. 和3.没有评论。
mt_dialog.
离线
最后一次露面:16小时17分钟前
职员
加入:2015-06-08 34
嗨塞巴斯蒂安,

嗨塞巴斯蒂安,

没有没有办法扫描窗口结束之前释放缓冲区或迫使设备直接显示的数据是可用的那一刻,在扫描过程配置扫描如何操作在堆栈上,你只能接口特定的消息。关于扫描一个频道,您可以实现和强制扫描过程尽快结束BLE_EVT_END,可以实现.app_on_ble_powered并检查美国的收音机使用arch_last_rwble_evt_get(),你可以看看下面的例子:

void user_app_on_ble_powered(void)

uint8_t temp_last_ble_event;

temp_last_ble_event = arch_last_rwble_evt_get();

如果(app_last_ble_event ! = temp_last_ble_event)

app_last_ble_event = temp_last_ble_event;

if(app_last_ble_event == BLE_EVT_END) //最后一个无线电事件是一个扫描事件(因为它在扫描)

/ /停止扫描
struct gapm_cancel_cmd * cmd = app_gapm_cancel_msg_create();
//发送消息
app_gapm_cancel_msg_send(cmd);


还要确保在扫描过程中放置​​的间隔和窗口值中有一定距离,例如,如果窗口为5,则确保间隔应为至少15个BLO,以便设备为设备能够在该期间之间运行并检索您的广告活动。

谢谢mt_dialog.

塞巴斯蒂安埃德曼
离线
最后一次露面:3年2个月前
加入:2017-05-29 12:02
你好mt_dialog,

你好mt_dialog,

我现在已经实现了你的建议,因为扫描重启(GAPM_CANCEL_CMD,等待回调,然后GAPM_START_SCAN_CMD)大约需要800µs,我们不会太经常这样做,所以我设置间隔为160 (100ms)和窗口为155。这是一个可以接受的妥协,而且它几乎按照预期运行。如预期的那样,缓冲区中的消息在窗口端释放,并由应用程序进行处理。这意味着我们现在接收消息的最大延迟为100毫秒,这比以前好多了。
但是,经过一段时间(30-60秒)扫描以某种方式挂起,并不再收到消息。当我们在窗口端之前(或期间)刚刚接收第4条消息(SDK缓冲区已满)时,似乎发生了第4条消息(以便与BLE_EVT_END的on_ble_powered回调延迟约0,7ms)。所有4条消息都被发送到应用程序,此后我们很快得到了预期的BLE_EVT_END,我们发送GAPM_CANCEL_CMD,等待回调,然后等于GAPM_START_SCAN_CMD,完全按照每次,但从这一点开始,我们没有收到一条消息。BLE_EVT_END按预期的一致,我们每次都会取消/ start_scan,但仍然没有任何内容?自从我们被取消到迟到以来,它会改变频道吗?或者缓冲区崩溃了吗?或者缓冲区崩溃?)。

首先,我们是否可以检查任何状态以确定扫描是否成功启动,是否扫描了第一个通道?带有状态或类似的回调?

其次,我试图将窗口减少到150(仍然具有间隔设置为160),那么挂起效果(不再接收)不会发生任何更长的(运行30分钟)。对我来说,这表明了某种竞赛条件,我想知道我如何识别它的发生以及如何修复它。这就是为什么你告诉我让窗户略低于间隔?这是一个已知的问题,你能详细说明吗?

mt_dialog.
离线
最后一次露面:16小时17分钟前
职员
加入:2015-06-08 34
嗨塞巴斯蒂安,

嗨塞巴斯蒂安,

我推荐的,你实现的只是一种“傻瓜”堆栈的方式,以便只扫描一个频道,因为SDK不支持只扫描一个频道,所以这只是一个逆行支持的解决方法通常不建议,但它是我所知道的唯一方法,你可以实现你想要的东西。关于你的问题,这正是我建议在窗口中拥有完全长度的时间,因为显然是的,堆栈中存在竞争条件,并且在这项工作中有什么历史。因此,为了避免您必须确保在扫描窗口的末尾和扫描间隔之间提供一些空间,也这样做并不保证设备不会达到特定条件,这就是为什么当没有广告迹象时,在没有广告迹象的情况下,在没有广告迹象的情况下,稍微扫描到普通扫描,然后返回到一个通道的扫描,这将是明智的。但我再次警告你,这只是一个解决方法,而不是扫描一个频道的官方和验证的解决方案。

谢谢mt_dialog.

塞巴斯蒂安埃德曼
离线
最后一次露面:3年2个月前
加入:2017-05-29 12:02
你好MT_dialog,

你好MT_dialog,

谢谢你真诚的回答,这不是我们所希望的,如果能在我们开始这个项目时记录下这段对话的部分内容,那就太好了。光是这个问题就可以让我们少试一个星期。请理解这个提示,写一份关于接收/扫描芯片的文件。

无论如何,因为这个和其他几个类似的问题,我们决定与竞争对手一起去。

问候
塞巴斯蒂安

PS。登录仍然不起作用,我不得不按下“请求新密码”写这一点。

mt_dialog.
离线
最后一次露面:16小时17分钟前
职员
加入:2015-06-08 34
嗨塞巴斯蒂安,

嗨塞巴斯蒂安,

很抱歉听到这个消息,我将把你的意见传递给文档团队以及支持站点的管理员,无论如何,希望你的项目一切顺利。

谢谢mt_dialog.