.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()取消传输,然后在undirect_complete回调时再次启动它)。这个工作,我们已经与当前测量验证,他们立即传输,所有收到消息由一个中央设备和一切都很好,但被推迟的消息在接待,.app_on_adv_report_ind中央设备不传递消息到达时。例如:

外设在发送消息1 2 3 4 5之间约10ms,然后等待2秒,结果如下:
外围传输:1 (10ms) 2 (10ms) 3 (10ms) 4 (10ms) 5(约2秒)1 (10ms) 2 (10ms) 3 (10ms) 4 (10ms) 5(2秒)1....
中央接收:1,2,3(约2秒)4,5,1,2,3,4(2秒)5,1 ....

消息4,5和下一个周期消息5延迟几秒钟!如果将另一个外设添加到此(或在同一频道上发送的其他BT设备),您会注意到消息与这些消息接收到逾越节。这意味着如果你在空中有很多BT流量的地方,你很可能不会发现这个错误。

消息似乎被SDK收到并收集,但直到有足够的消息排队或类似的消息。你能验证这个吗?或者让我知道是否有一种方法来强制SDK释放收到的消息?

2.请提供SDK的一些文件。记录非常糟糕!
3.修复支持站点的登录,每次登录时,我都必须按“请求新密码”。

关键词:
设备:
MT_dialog
离线
最后看到:4小时16分钟前
工作人员
加入:2015-06-08 11:34
嗨,塞巴斯蒂安,

嗨,塞巴斯蒂安,

  1. 通知应用程序一个通告字符串已经被接收的回调不会被直接触发,而且它也不会等待缓冲区被填满。当特定通道的扫描窗口结束时,回调函数就会执行并报告给应用程序,在拥挤的环境中,设备也会在特定扫描窗口结束之前报告。设备将在每个扫描窗口之间的间隔时间内报告任何广告字符串,通常在扫描窗口之后。关于你提到的2秒,我不该这背后看到任何合理的解释,如果有数据在空气和没有过滤广告数据,设备将报告,设备将告知应用程序接收的数据正确的完成每个通道上的扫描后,它不需要等待任何缓冲区被填满。也许你应该检查你的扫描设置(扫描间隔和窗口,如果你应用任何过滤)。另外,我不知道你如何能够传输间隔为10毫秒的广告字符串,因为最小值是20毫秒,除非你继续启动和停止广告过程。还要注意的是,广告并不能保证客户端接收到所有外设发送的消息。
  2. 如果你能提供一些关于文档的具体评论,我很乐意把它传递给SDK和文档团队。
  3. 关于登录不起作用的事实,请注意下面的情况,因为目的网站的管理员告知我,检查机制,大部分时间都是用户体验所因为的内容:
    1. 忘记在新密码中键入后单击“保存”。
    2. 没有注意到密码没有更新,因为用户没有注意到红色的更改框告诉他们的密码不符合安全标准。
    3. 使用他们的浏览器自动密码建议,这是不同的,他们的新。
    4. 记错密码或用户名

由于MT_dialog

塞巴斯蒂安·埃德曼
离线
最后看到:3年2个月前
加入:2017-05-29 12:02
谢谢您的快速回复,

谢谢您的快速回复,

  1. 接收:
    接收设置为:
    cmd - > op。代码= GAPM_SCAN_PASSIVE;
    cmd - > op。addr_src = GAPM_PUBLIC_ADDR;
    cmd - >间隔= LLM_SCAN_INTERVAL_MAX;
    cmd-> window = llm_scan_window_max;
    cmd - >模式= GAP_OBSERVER_MODE;
    cmd - > filt_policy = SCAN_ALLOW_ADV_ALL;
    cmd-> filter_duplic = scan_filt_duplic_dis;
    附加图像(logic_Analyzer_Image_describing_the_reception_problus.zip)显示了更“拥挤”环境中的接收(某些设备每80ms广告)。
    第一行(蓝色)是消息的传输(当函数app_advertise_start_msg_send(cmd)在外围设备中执行时)
    第二行(棕色)是回调函数.app_on_adv_report_ind在Central中执行。
    第三行(红色)是在中心设备中处理正确的消息。
    如图所示,外围设备发送4条信息(蓝线,1号)。4)。它们被分成几份(棕色线,第5号)。8。和10。第13条),前三条信息(第5条)。到7)是一些其他的广告,不是为我们,我们的信息被接收为8。(并作为9号处理),其余的(2号。4。推迟到第13题。 has been received). Then they are processed as number 14. to 16.
    2。4。要等到13号来接。(或者可能是扫描窗口的末尾,设置为10秒)。

    有什么办法把这些信息公布于众吗?4。在13号到来之前?比如发送一个ke_message来触发释放,或者模拟接收2个消息或类似的?

    或者看看接收,.app_on_adv_report_ind函数总是在一行中执行4次,这意味着接收缓冲区有4条消息大,是否可以将其减少到1条消息?

    传输:是的,我们再次停止并重新开始,这会每4,5秒生成一次消息。

  2. 例如:
    • 用于扫描的文档在哪里(上面参数的描述)
    • 以及如何处理不同状态的解释在哪里,例如ke_state_set(TASK_APP, APP_CONNECTABLE)
  3. 忘记在新密码中键入后单击“保存”。
    ->我输入字母并按下保存
    没有注意到密码没有更新,因为用户没有注意到红色的更改框告诉他们的密码不符合安全标准。
    - >它被标记为强
    使用他们的浏览器自动密码建议,这是不同的,他们的新。
    ->我总是关闭这个功能
    记错密码或用户名
    - >我甚至在节省后直接尝试。它仍然没有工作。
    你有其他东西我可以尝试吗?
MT_dialog
离线
最后看到:4小时16分钟前
工作人员
加入:2015-06-08 11:34
嗨,塞巴斯蒂安,

嗨,塞巴斯蒂安,

  1. 减少扫描窗口和扫描间隔,您正在使用扫描过程的最大值,尝试使用值,如10的间隔和5的扫描窗口。如上所述设备通常会报告结束时扫描窗口,如果你请扫描窗口,长(约10秒)和你有相同的值作为间隔报告将延迟(因为你已经注意到有一个缓冲functionallity但这位于ROM代码深栈)。尝试使用上面提到的值,这应该可以解决您的问题。
  2. 关于文件:
    1. 不幸的是,由于大多数用户都是面向外设的,所以没有关于涉及中心功能的过程的文档。
    2. 您可以查看文档UM-B-051 1458x软件平台参考。pdf中的5.3段任务。
  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
离线
最后看到:4小时16分钟前
工作人员
加入:2015-06-08 11:34
嗨,塞巴斯蒂安,

嗨,塞巴斯蒂安,

否无法在扫描窗口结束之前释放缓冲区或强制设备直接指示此刻可用的数据,在扫描过程中的配置如何扫描在堆栈中运行,您只能接口它具有特定消息。关于一个通道上的扫描,您可以在获得BLE_EVT_END后立即实现该频道并强制扫描过程结束,可以在.app_on_ble_powered中实现,并使用ARCH_LAST_RWBLE_EVT_GET()检查无线电状态,您可以采取看下面的例子:

空白user_app_on_ble_powered(空白)
{
uint8_t temp_last_ble_event;

temp_last_ble_event = arch_last_rwble_evt_get ();

if(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 BLE槽为了使设备能够运行在那个时期和检索你的广告活动。

由于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.这可以接受可接受的妥协,它几乎按预期工作。缓冲区中的消息在窗口端时释放,如预期,并由应用程序处理。这意味着我们现在有100ms的最大延迟接收消息,这远远优于之前。
但是,一段时间后(30-60秒),扫描以某种方式挂起,根本不再接收消息。这似乎发生了每次我们收到第4条消息(SDK缓冲区满)刚好在窗口结束之前(或期间?)(所以on_ble_powered回调BLE_EVT_END被延迟约0.7毫秒)。所有4个消息被发送到应用程序,不久之后,我们得到BLE_EVT_END作为预期,我们发送GAPM_CANCEL_CMD,等待回调,然后GAPM_START_SCAN_CMD,完全像每一次,然而从这一点上,我们没有收到一个消息。BLE_EVT_END一直按照预期来,我们每次都取消/START_SCAN,但仍然没有收到任何东西(因为我们取消到晚了,它改变了通道吗?或者是缓冲区崩溃了?)

所以首先,我们是否可以检查是否可以检查扫描是否已成功启动,并且它扫描第一个通道?带有状态或类似的回调?

其次,我尝试将窗口减少到150(间隔仍然设置为160),然后悬挂效果(不再接收)不再发生(运行30分钟)。对我来说,这表明了某种竞争条件,我想知道如何识别它何时发生,如何修复它。这就是你让我把窗户开得比间隔时间低一点的原因吗?这是一个众所周知的问题,你能详细说明吗?

MT_dialog
离线
最后看到:4小时16分钟前
工作人员
加入:2015-06-08 11:34
嗨,塞巴斯蒂安,

嗨,塞巴斯蒂安,

我已经推荐,你只是一个“傻瓜”的方式实现堆栈为了扫描在只有一个频道,因为只有一个通道扫描不是SDK的支持下,这是一个解决方案不是官方支持,一般不推荐,但这是我所知道的唯一实现你想要的东西的方法。关于您的问题,这正是我建议您的间隔相当长的原因,从窗口,因为显然是,有竞争条件在堆栈中,你所经历的是预期与这个工作周围。为了避免这种情况你必须确保在扫描窗口的末端和扫描间隔之间留出一定的空间,这样做也不能确保设备不会出现这种情况,这就是为什么它将是明智的实施某种故障安全机制,当有相当长的一段时间没有广告指示切换回普通扫描一段时间,然后回到扫描一个频道。但再次我应该警告你,这只是一个变通,而不是一个官方和验证的解决方案扫描一个频道。

由于MT_dialog

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

你好mt_dialog,

谢谢你的真诚答案,这不是我们希望的,并且在我们开始这个项目时,在我们启动这个项目时会有一些这个谈话真的很好。这个主题将拯救我们一周的试验和错误。请提出此提示,并撰写有关接收/扫描的文档。

无论如何,由于这个和其他几个类似的问题,我们决定与你们的竞争对手合作。

问候
塞巴斯蒂安。

ps. login仍然不能工作,我必须按“请求新密码”来写这个。

MT_dialog
离线
最后看到:4小时16分钟前
工作人员
加入:2015-06-08 11:34
嗨,塞巴斯蒂安,

嗨,塞巴斯蒂安,

很抱歉听到这个消息,我会将您的评论传递给文档团队的支持者的管理员,无论如何希望一切顺利。

由于MT_dialog