你好,
以下背景(使用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
谢谢您的快速回复,
接收设置为:
cmd - > op。代码= GAPM_SCAN_PASSIVE;
cmd - > op。addr_src = GAPM_PUBLIC_ADDR;
cmd - >间隔= LLM_SCAN_INTERVAL_MAX;
cmd->window=LLM\u SCAN\u window\u MAX;
cmd - >模式= GAP_OBSERVER_MODE;
cmd - > filt_policy = SCAN_ALLOW_ADV_ALL;
cmd - > filter_duplic = SCAN_FILT_DUPLIC_DIS;
附带的图像(logic_analyzer_image_描述_Receipty_problem.zip)显示了在更“拥挤”的环境中的接收(一些设备每80毫秒发布一次广告)。
第一行(蓝色)是消息的传输(当函数app_advertise_start_msg_send(cmd)在外围设备中执行时)
第二行(棕色)是回调函数.app_on_adv_report_ind在中央处理器中执行的时间。
第三行(红色)是在中心设备中处理正确的消息。
如图所示,外围设备发送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秒产生一条消息。
->我输入字母并按下保存
没有注意到密码没有更新,因为用户没有注意到红色的更改框告诉他们的密码不符合安全标准。
->它被标记为强壮
使用他们的浏览器自动密码建议,这是不同的,他们的新。
->我总是关闭这个功能
记错密码或用户名
->我甚至在保存后直接尝试过。它仍然不起作用。
你还有什么我可以试试的吗?
嗨,塞巴斯蒂安,
由于MT_dialog
你好,MT_dialog,
在扫描过程中,是否有方法触发释放缓冲区中接收到的消息?例如:我是否可以以某种方式发出一条内部消息,使堆栈认为它正在接收第四条消息,从而释放缓冲区?或者我可以触发一个提前扫描以某种方式结束吗?
或者有办法设置一个回调扫描窗口结束,以便我可以取消它从那里?
嗨,塞巴斯蒂安,
否在扫描窗口结束之前,无法释放缓冲区,也无法强制设备直接指示此时可用的数据。在扫描过程中,在堆栈中扫描操作的配置中,您只能将其与特定消息连接。关于在一个频道上的扫描,您可以实现这一点,并在获得BLE_EVT_端后强制结束扫描过程,您可以在.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;
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
你好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分钟)。对我来说,这表明了某种竞争条件,我想知道如何识别它何时发生,如何修复它。这就是你让我把窗户开得比间隔时间低一点的原因吗?这是一个众所周知的问题,你能详细说明吗?
嗨,塞巴斯蒂安,
我已经推荐,你只是一个“傻瓜”的方式实现堆栈为了扫描在只有一个频道,因为只有一个通道扫描不是SDK的支持下,这是一个解决方案不是官方支持,一般不推荐,但这是我所知道的唯一实现你想要的东西的方法。关于您的问题,这正是我建议您的间隔相当长的原因,从窗口,因为显然是,有竞争条件在堆栈中,你所经历的是预期与这个工作周围。为了避免这种情况你必须确保在扫描窗口的末端和扫描间隔之间留出一定的空间,这样做也不能确保设备不会出现这种情况,这就是为什么它将是明智的实施某种故障安全机制,当有相当长的一段时间没有广告指示切换回普通扫描一段时间,然后回到扫描一个频道。但再次我应该警告你,这只是一个变通,而不是一个官方和验证的解决方案扫描一个频道。
由于MT_dialog
你好,MT_dialog,
感谢您真诚的回答,这不是我们所希望的,在我们开始这个项目的时候,如果能将部分对话记录下来,那将是非常好的。光是这个问题就可以让我们省下一周的反复试验。请接受这个提示,写一份关于接收/扫描芯片的文件。
无论如何,由于这个和其他几个类似的问题,我们决定与你们的竞争对手合作。
问候
塞巴斯蒂安。
ps. login仍然不能工作,我必须按“请求新密码”来写这个。
嗨,塞巴斯蒂安,
很抱歉听到这个消息,我会将您的意见传递给文档团队以及支持站点的管理员,无论如何,希望您的项目一切顺利。
由于MT_dialog