你好,
以下背景(使用SDK 5.0.4):
我们建立了一个广告客户发送5条消息在相同的信道的脉冲串,每2秒。(上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(10毫秒)3(10ms)的4(10ms)的5(大约2秒)1(10ms)的2(10毫秒)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通信的地区,你很可能不会注意到这个bug。
消息似乎被SDK接收和收集,但直到有足够的消息排队或类似的消息时才释放。你能证实吗?或者让我知道是否有一种方法可以迫使SDK释放接收到的消息?
2.并请提供一些SDK的文档。这是非常糟糕的文件!
3.修正登录到支持网站,我必须按“请求新密码”每次我登录到这里。
设备:

嗨塞巴斯蒂安,
由于MT_dialog
谢谢您的快速回复,
接收被设定为如下:
CMD-> op.code = GAPM_SCAN_PASSIVE;
CMD-> op.addr_src = GAPM_PUBLIC_ADDR;
CMD->间隔= LLM_SCAN_INTERVAL_MAX;
cmd窗口- > = 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_descripbing_the_reception _problem.zip)显示了在更“拥挤”的环境中的接收情况(一些设备每80ms发布一次广告)。
第一行(蓝色)是消息的传输(当函数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号已被接收)。然后它们被处理成数14〜16。
的2到4的接收被延迟,直到编号13的接收(或扫描窗口,其被设置为10秒的可能的端部)。
有什么办法号0.13已经来临之前发布消息2到4?如发送触发的释放,或模拟2个消息或类似的接收一个ke_message?
或者看着前台,.app_on_adv_report_ind功能总是连续执行的4倍,这将表明接收缓冲器是4个消息大,是否有可能将这一数字减少到1条消息?
传送:是的,我们停下来又重新开始,这将每四五秒产生一条信息。
- >我输入的字母,并按下保存
Didnt注意到,密码未更新,因为用户没有注意到红色ALTER框,告诉他们自己的密码不符合安全标准的。
->它被标记为强
用他们的浏览器自动密码的建议,这是他们新的不同。
- >我一直有这个功能关闭
记错密码或用户名
>我甚至在保存后直接尝试。它仍然没有工作。
你有什么可以让我试试的吗?
嗨塞巴斯蒂安,
由于MT_dialog
你好MT_dialog,
是否有一种方法来触发在扫描期间缓冲区中接收到的消息的释放?例如:我能以某种方式发出一个内部消息,以便堆栈相信它正在接收第4个消息,从而释放缓冲区吗?或者我能触发提前扫描结束吗?
或者是有没有办法设置在扫描窗口结束回调,这样我可以从那里取消了吗?
嗨塞巴斯蒂安,
没有没有办法扫描窗口结束之前释放缓冲区或迫使设备直接显示的数据是可用的那一刻,在扫描过程配置扫描如何操作在堆栈上,你只能接口特定的消息。关于扫描一个频道,您可以实现和强制扫描过程尽快结束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();
如果(app_last_ble_event ! = temp_last_ble_event)
{
app_last_ble_event = temp_last_ble_event;
if(app_last_ble_event == BLE_EVT_END) //最后一个无线电事件是一个扫描事件(因为它在扫描)
{
/ /停止扫描
结构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。这是一个可以接受的妥协,而且它几乎按照预期运行。如预期的那样,缓冲区中的消息在窗口端释放,并由应用程序进行处理。这意味着我们现在接收消息的最大延迟为100毫秒,这比以前好多了。
但是,一段时间(30-60秒)的扫描挂起不知何故,在一切并不再接收消息后。这似乎发生每次我们(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分钟)。对我来说,这表明某种竞争状态,我想知道当它发生时我如何识别和如何修复它。这究竟是为什么,你告诉我,保持窗口比间隔略低?这是一个已知的问题,你能否详细说明?
嗨塞巴斯蒂安,
我已经推荐你执行只是一种方式,以扫描只有一个频道“傻瓜”堆栈,因为扫描到只有一个通道不被SDK支持,所以这只是未正式支持的解决方法和一般不推荐使用,但它的我是知道的,你可以实现你想要什么的唯一方式。关于您的问题,这正是我已经建议有从窗口相当长的时间间隔,因为显然是原因,存在栈竞争条件,并且您遇到什么期望这项工作各地。所以,为了避免您必须确保你给的扫描窗口的结束和扫描间隔之间的一些空间,也这样做并不保证设备不会走到那特定的条件,这就是为什么它明智的做法是实行somekind的当不存在用于广告的迹象相当一段时间切换回普通扫描了一会儿,然后回到一个通道的扫描故障安全机制。但同样我要提醒你,这是唯一的解决方法,而不是扫描一个通道上的正式和验证的解决方案。
由于MT_dialog
你好MT_dialog,
谢谢你真诚的回答,这不是我们所希望的,如果能在我们开始这个项目时记录下这段对话的部分内容,那就太好了。光是这个问题就可以让我们少试一个星期。请理解这个提示,写一份关于接收/扫描芯片的文件。
无论如何,因为这个问题和其他一些类似的问题,我们决定去与你的竞争对手。
问候
塞巴斯蒂安
PS。登录仍不能正常工作,我只好按“重设密码”写这个。
嗨塞巴斯蒂安,
很抱歉听到这个消息,我将把你的意见传递给文档团队以及支持站点的管理员,无论如何,希望你的项目一切顺利。
由于MT_dialog