嗨对话框,
我正在开发一对BLE设备,两个服务器和从站,基于DA14580。在彼此连接之后,即使我留下这些处理器闲置(没有读/写/通知,否I2C,GPIO ...处于活动状态),但它们仍然断开随机连接。它看起来像链接层中的一个腐败,因为在断开连接后,它们无法再次重新连接。以下是我为此连接设置的参数以及一些Wireshark捕获。
msg->nb_peers=1;
Memcpy((void *)和msg->对等体[0] .addr,(void *)peer_addr,bd_addr_len);
msg->对等体[0] .addr_type = peer_addr_type;
味精- > con_intv_max = 10;
msg->con_intv_min=10;
味精- > ce_len_max = 0 x20;
味精- > ce_len_min = 0 x20;
味精- > con_latency = 0;
msg->superv_to=100;
msg->scan_interval=0x180;
msg->scan_window=0x160;
msg->op.code=GAPM\u CONNECTION\u DIRECT;
Wireshark捕获:
9796 61.273854000主从BLE Data 26空数据PDU
9797 61.275295000从站主机BLE数据26空数据PDU
9798 61.286603000主从机BLE数据26空数据PDU
9799 61.287569000从主BLE数据26空数据PDU
9800 61.298855000主从BLE数据26空数据PDU
9801 61.299789000从站主机BLE数据26空数据PDU
9802 62.320227000 AB_MAT5 BLE ADV 48 ADV_IND
9803 62.321788000 AB_MAT5 BLE ADV 48 ADV_IND
服务器和客户端保持连接60秒,不能再相互连接。
我仍然可以看到奴隶侧广告,但甚至使用iPhone使用LightBlue应用程序,我无法再连接到奴隶。
Wireshark捕获:
25 6.273182000 AB_MAT4 BLE ADV 48 ADV_IND
26 6.274736000 50:0b:f8:18:ac:29 80:ea:ca:00:00:41 BLE ADV 60 CONNECT_REQ
27 6.276461000主从BLE数据26空数据PDU
28 6.303327000主从可编程逻辑器件数据26空数据PDU
29 6.333342000主从BLE数据26空数据PDU
30 6.363329000主从BLE数据26空数据PDU
31 6.393384000主从BLE数据26空数据PDU
32 6.423327000主从可编程逻辑器件数据26空数据PDU
33 6.453367000主从BLE数据26空数据PDU
34 6.483385000主从BLE数据26空数据PDU
35 6.513421000主从BLE数据26空数据PDU
36 6.543378000主从BLE数据26空数据PDU
37 6.573448000主从BLE数据26空数据PDU
38 6.603361000主从机BLE数据26空数据PDU
39 6.633361000主从机BLE数据26空数据PDU
40 7.640482000 ab_mat4 ADV 48 ADV_IND
41 7.642505000 ab_mat4 BLE ADV 48 ADV_IND
在此测试中,我将连接间隔设置为12.5 ms。在这种情况下,服务器和客户端将在60秒到45分钟后随机断开连接。
在后一个测试中,我将连接间隔更改为30ms。他们可以保持更长的连接时间(超过10个小时),但仍然断开连接。
我想假设我在空闲状态下将处理器留下,一切都应该自动通过BLE堆栈处理并发送空以保持连接应与我的应用程序代码无关。此外,我在断开连接时没有任何应用活动。
请帮助我找到断开连接的原因以及如何提高连接的稳定性。
谢谢。
一些更新,
从我的隔夜测试中,它看起来像BLE定时器无法适当地工作。
首先,它可以正常工作大约3个小时(可能更多)。我们可以看到主设备每30毫秒向从设备发送一个空的PDU,就像我设置的值一样。
726216 10926.699285000主从BLE数据26空数据PDU
726217 10926.699861000从机主BLE数据26空数据PDU
726218 10926.729275000主从BLE数据26空数据PDU
726219 10926.729815000从机主BLE数据26空数据PDU
726220 10926.759274000主从机BLE数据26空数据PDU
726221 10926.760253000 Slave Master BLE Data 26空数据PDU
726222 10926.789250000主从BLE Data 26空数据PDU
726223 10926.79021900从机主BLE数据26空数据PDU
726224 10926.818524000主从BLE数据26空数据PDU
我猜嗅探者在这里丢失了一个捕获。。
726225 10926.848719000主从机BLE数据26空数据PDU
726226 10926.850223000从机主BLE数据26空数据PDU
由于某种原因,我失去了大约10个小时的捕获。幸运的是,就在他们断开连接之前,嗅探器再次收到信号。但在这个时候,主端似乎表现得很疯狂,它每隔大约2毫秒或者在从端收到一个空的PDU后,就向客户端发送一个空的PDU。
726227 47816.865216000主从BLE数据26空数据PDU
726228 47816.866244000从机主BLE数据26空数据PDU
726229 47816.867143000主从机BLE数据26空数据PDU
726230 47816.868015000 Slave Master BLE Data 26空数据PDU
726231 47816.868887000主从BLE数据26空数据PDU
726232 47816.869742000从站主机BLE数据26空数据PDU
726233 47816.870613000主从BLE数据26空数据PDU
726234 47816.871492000从站主机BLE数据26空数据PDU
.......
726560 47817.196839000主从BLE数据26空数据PDU
726561 47817.197927000从主BLE数据26空数据PDU
726562 47817.198787000主从BLE数据26空数据PDU
726563 47817.199657000从机主BLE数据26空数据PDU
726564 47817.201497000资产负债表ADV 48 ADV工业
72656547817.202433000 ab_mat5 ADV.48 ADV_IND
我希望这些信息给你们对这个问题更有意义,非常感谢。
谢谢
zwang308,
您在当前实施中使用的SDK以及您拥有的开发套件是什么?据我所知,您使用的连接参数与DSP项目几乎相同。当您与设备连接时,您的假设是正确的,堆栈将通过在不要求应用程序执行任何操作时通过交换空数据包来保持连接。
从第一个日志中,我可以看到您的主机停止发送空数据包,以保持连接处于活动状态,因此从机端没有响应,超时发生,连接丢失。如果发生这种情况,您应该检查主机的状态。
从第二个日志来看,从属设备似乎没有响应主机的连接请求,请在外围代码中检查您如何处理连接请求,并检查设备是否达到连接确认。
关于第3个日志,这似乎很奇怪,我无法想象为什么中央将以如此高的速率开始发送空的数据包,特别是如果没有数据发送,中央本身或设备。
谢谢你的对话
我正在使用SDK 3.0.10.1。
问题是连接随机中断。
对于12ms连接间隔,有时连接进展超过一小时;但有时他们会在2分钟后断开连接。
当我将连接间隔更改为30毫秒后,平均连接时间会变得更长。但它们仍然是随机断开的,
当它们断开连接时,实际上没有应用程序活动。我假设BLE堆栈将负责连接,在此期间自动发送/确认空PDU。
此外,即使他们断开连接,它们也应该能够重新连接。但是一旦他们断开连接,就无法再连接到奴隶,无论我使用我的主应用程序还是使用一些标准设备。苹果手机。
在我看来,从服务器的BLE堆栈的一部分被搞糟了:从服务器可以收到来自主服务器的连接请求(它停止发布消息),但它不能发送ack。所以两边在1s之后就断开了。之后,奴隶又开始做广告。
这些是我测试中得到的一切。
非常感谢你的帮助!
顺便说一下,我对所有测试使用相同的代码库。我确信从属侧发送连接请求确认,否则它们不会连接。同样,问题是Connect -----保持随机时间的连接---断开连接,从不能够重新连接。
谢谢,
zwang308,
我已经在SDK 3.0.10.1(不包括配置文件)上实现了中央和外围设备。我已经将主机的连接参数设置为与您的相同,pro和基本套件之间的连接间隔为12.5 ms。到目前为止,一切似乎都是正确的,连接持续了我可以看的时间(超过两个小时),而且我能够重新连接到主机(在延长睡眠模式下)。您是否实施了任何配置文件或任何其他功能,以尝试重现您的问题?
谢谢你的对话
嗨,MT_dialog,
我所做的就像你的DSP项目一样。
当我收到包时,我开发I2C驱动程序并将数据放入NVRAM。在app_asynch_trim函数中,我拉动缓冲区并通过ble发送数据。
但在我的测试中,我禁用APP_ASYNCH_TRIM中的I2C驱动程序和拉动功能。在测试中,两个DA14580S在断开连接时真的无所畏惧。
从我的观察开始,他们一直在发送空的PDU一段时间,突然将主站暂停发送空的PDU。我们有方法要知道为什么大师停止发送空的PDU吗?我们可以从内核那里收到一条消息,以知道他们为什么断开连接。
对我来说,似乎他们随机断开连接。我们上周做了很多测试,有时联系良好超过16小时;有时他们会在2分钟后断开连接。
它真的很困惑我。
谢谢!
zwang308,
你能运行你的主窗体keil和检查当这个问题发生时,你的主窗体是什么状态?同样,你的处理程序表明有一个断开,要么是由主人或至少是由你的奴隶,当他停止接收数据从你的主机。你可以在你的设备上设置一个断点,并检查你得到的断开原因。没有办法检查为什么主服务器不发送任何数据,错误指示或类似的东西,因为这应该不会发生,堆栈应该总是保持连接。
谢谢你的对话
嗨MT_Dialog,
他们第一次断开了联系。外设上的错误码是0x13(REMOTE USER TERMINATED CONNECTION),而中央端的错误码是0x08(CONNECTION TIMEOUT)。
之后,外围侧的错误代码始终为0x08,中央侧的错误代码始终为0x3e(无法建立连接)。
我不认为代码实际上在某一点上停止,因为双方都在广告/扫描和连接状态之间切换。
我们知道为什么会发生这种情况吗?
我们有一个方法软复位芯片(运行固件从一开始没有重新加载固件或只是重置BLE堆栈)?
谢谢。
zwang308,
在我们执行的测试中,我们没有观察到任何类似的情况(即中央停止发送数据包),尽管我们成功地跟踪了在特定情况下外围设备无法连接的cornercase,但特定cornercase的补丁尚未发布。对于这种情况,我们建议对580执行sw重置或重置堆栈。
您可以尝试通过使用SYS_CTRL_REG的SW_reset字段进行重置,并将起始地址设置为sysram(请查看数据表),尽管这不是一个好主意,而且最好从原始映像重新启动(使用引导加载程序下载580中的代码),您也可以尝试发送GAPM_reset命令以进行重置那一堆。
也是可以共享一些代码(中央和设备),以便看看,因为我们无法在我们身边复制问题?
谢谢你的对话
嗨mt_dialog,
你能给我一个发送代码的电子邮件地址吗?你可以通过电子邮件亲自联系我。
谢谢,
zwang308,
问题是由于过时的SDK。
谢谢你的对话
嗨,MT_dialog。
我犯了和zwang308先生一样的错误。我使用的是sdk版本V3.0.8。你说因为SDK已经过时了,请告诉我哪个SDK是可以的。谢谢。
嗨,门森,
最新的SDK是580设备的5.0.4。
谢谢你的对话