嗨,对话框中,
我正在开发一对基于DA14580的BLE设备,包括服务器和从服务器。在相互连接之后,即使我让这些处理器处于空闲状态(没有BLE读/写/通知,没有i2c, gpio…但它们仍然是随机断开的。看起来其中一个损坏在链接层,因为断开后,他们不能再次连接。下面是我为这个连接和一些wireshark捕获设置的参数。
MSG-> nb_peers = 1;
memcpy ((void *)味精- >[0]。addr, (void *)peer_addr, BD_ADDR_LEN);
味精- >[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_CONNECTION_DIRECT;
wireshark截图:
9796 61.273854000主从BLE Data 26空数据PDU
9797 61.275295000 Slave Master BLE Data 26空数据PDU
9798 61.286603000主从BLE Data 26空数据PDU
9799 61.287569000从主BLE数据26空数据PDU
9800 61.298855000主从BLE数据26空数据PDU
9801 61.299789000 Slave Master BLE Data 26空数据PDU
9802 62.320227000 ab_mat5 BLE ADV 48 ADV_IND
9803 62.321788000 ab_mat5 BLE ADV 48 ADV_IND
服务器和客户端保持连接60秒,不能再相互连接。
我仍然可以看到slave端广告,但即使使用带有LightBlue应用程序的Iphone,我也无法再连接到slave端。
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主从BLE数据26空数据PDU
29 6.333342000主从BLE数据26空数据PDU
30 6.363329000主从BLE数据26空数据PDU
31 6.393384000主从BLE数据26空数据PDU
32 6.423327000主从BLE数据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 BLE ADV 48 ADV_IND
41 7.642505000 ab_mat4 BLE ADV 48 ADV_IND
在这个测试中,我将连接间隔设置为12.5毫秒。在这种情况下,服务器和客户端将在连接60秒到45分钟后随机断开连接。
在我的测试后,我改变了连接时间间隔为30毫秒。他们可以保持连接更长的时间(超过10小时),但他们仍然断开。
我假设如果我让处理器处于空闲状态,一切都应该由BLE堆栈自动处理,并且发送空值来保持连接应该与我的应用程序代码无关。而且,当它们断开连接时,我没有任何应用程序活动。
请帮我找到原因断开,以及如何提高连接的稳定性的原因。
非常感谢。
一些更新,
从我的通宵测试来看,似乎ble定时器没有正常工作。
首先,它的工作原理好约3小时(甚至更多)。我们可以看到主机发送一个空的PDU到从每30毫秒的价值我集。
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 Data 26空数据PDU
726221 10926.760253000 Slave Master BLE Data 26空数据PDU
726222 10926.789250000主从BLE Data 26空数据PDU
726223 10926.790219000从主BLE数据26空数据PDU
726224 10926.818524000主从BLE Data 26空数据PDU
我想在这里嗅探失去一个捕捉..
726225 10926.848719000主从BLE Data 26空数据PDU
726226 10926.850223000从主BLE数据26空数据PDU
为了某种原因,我失去了约10小时的拍摄。幸运的是,他们断开之前,嗅探器再次得到信号。但就在这时,主控方似乎表现得疯狂,它发送一个空的PDU到客户端大约每2ms以上或许只要它接收来自从空PDU。
726227 47816.865216000主从BLE数据26空数据PDU
726228 47816.866244000从主BLE数据26空数据PDU
726229 47816.867143000主从BLE Data 26空数据PDU
726230 47816.868015000 Slave Master BLE Data 26空数据PDU
726231 47816.868887000主从BLE Data 26空数据PDU
726232 47816.869742000 Slave Master BLE Data 26空数据PDU
726233 47816.870613000主从BLE数据26空数据PDU
726234 47816.871492000 Slave Master BLE Data 26空数据PDU
.......
726560 47817.196839000主从BLE数据26空数据PDU
726561 47817.197927000从主BLE数据26空数据PDU
726562 47817.198787000主从BLE数据26空数据PDU
726563 47817.199657000 Slave Master BLE Data 26空数据PDU
726564 47817.201497000 ab_mat5 BLE ADV 48 ADV_IND
726565 47817.202433000 ab_mat5 BLE ADV 48 ADV_IND
我希望这些信息能让你们对这个问题有更多的认识,谢谢。
谢谢!
嗨zwang308,
您在当前实现中使用的是哪个SDK ?您拥有的开发工具包是什么?就我所知,你使用的连接参数几乎与DSPS项目相同。你的假设是正确的,当你连接到一个设备时,堆栈将通过交换空数据包来保持连接,而不要求应用程序做任何事情。
从第一日志,我可以看到你的主人停止发送空包,以保持连接活着所以从属面没有响应,超时发生,即使发生这种情况或许你应该检查你的主机的状态的连接丢失。
从第2日志似乎从没有响应从主机,检查你是如何处理你的外设代码的连接请求,并检查设备到达连接确认连接请求。
关于第3个日志,这似乎很奇怪,我不能想象为什么中央会开始发送空包在如此高的速率,特别是如果没有数据发送,中央本身或设备。
由于MT_dialog
我使用的SDK 3.0.10.1。
问题是连接中断随机。
12ms连接间隔,有时连接正常时间超过1小时;但有时两分钟后就断了。
当我将连接间隔更改为30毫秒后,平均连接时间会变得更长。但它们仍然是随机断开的,
当他们断开,实在是没有应用程序的活动。我假设BLE堆栈将在这段时间内自动处理的连接,发送/ ACK空PDU的。
而且,即使它们断开连接,也应该能够重新连接。但一旦它们断开,我就不能再连接到slave,无论我使用我的主应用程序或使用一些标准设备,如IPhone。
在我看来,从服务器的BLE堆栈的一部分被搞糟了:从服务器可以收到来自主服务器的连接请求(它停止发布消息),但它不能发送ack。所以两边在1s之后就断开了。之后,奴隶又开始做广告。
这是我考试的全部资料。
非常感谢您的帮助!
顺便说一下,我对所有测试使用相同的代码库。我确定从端发送连接请求确认,否则他们不会连接。同样,问题是connect-----保持连接的时间是随机的——断开连接,再也无法重新连接。
谢谢,
嗨zwang308,
我已经实现了一个中央和SDK 3.0.10.1上的外围设备(没有轮廓内含)我已经设置的连接参数到主机与您的与间隔等于12.5毫秒的亲和碱性试剂盒之间的连接是相同的。到目前为止,一切似乎是正确的,并且只要连接持续,因为我能看到(超过两小时)也是我能够重新连接到主机,(在扩展休眠模式还)。你有没有实现的任何资料或为了尝试和重现您的问题任何其他functionallity?
由于MT_dialog
嗨MT_dialog,
我所做的和你的DSPS项目差不多。
我开发了一个I2C驱动程序,并把数据放入nvram,当我收到一个包。在app_asynch_trim函数中,我提取缓冲区并通过BLE发送数据。
但在我的测试中,我禁用了app_asynch_trim中的I2C驱动程序和pull函数。在测试中,当两个da14580断开连接时,它们实际上什么都不做。
根据我的观察,他们持续发送空的PDU一段时间,突然主人停止发送空的PDU。我们有方法知道为什么主停止发送空PDU?我们能从内核得到一条消息来知道他们为什么断开连接吗?
在我看来,它们似乎是随机断开的。我们上周做了很多测试,有时连接良好超过16个小时;有时他们会在两分钟后断开连接。
这让我很困惑。
非常感谢!
嗨zwang308,
你能运行你的主窗体keil和检查当这个问题发生时,你的主窗体是什么状态?同样,你的处理程序表明有一个断开,要么是由主人或至少是由你的奴隶,当他停止接收数据从你的主机。你可以在你的设备上设置一个断点,并检查你得到的断开原因。没有办法检查为什么主服务器不发送任何数据,错误指示或类似的东西,因为这应该不会发生,堆栈应该总是保持连接。
由于MT_dialog
嗨MT_Dialog,
他们第一次断开了联系。外设上的错误码是0x13(REMOTE USER TERMINATED CONNECTION),而中央端的错误码是0x08(CONNECTION TIMEOUT)。
之后,在周侧上的错误代码是总是0×08和中央侧为0x3E的(连接失败被建立)。
我不认为代码实际上在这一点上停止,因为这两个方面是广告/扫描和连接状态之间切换保持。
我们知道为什么会这样吗?
我们有一个方法软复位芯片(运行固件从一开始没有重新加载固件或只是重置BLE堆栈)?
非常感谢。
嗨zwang308,
We haven't observed anything similar in tests we performed (i.e. the central to just stop sending packets) although we managed to track a cornercase where the peripheral isn't able to connect under specific circumstances, the patch for the specific cornercase isn't yet released. For this kind of situations we propose either to perform a sw reset to the 580 or reset the stack.
您可以通过使用SYS_CTRL_REG的SW_RESET领域尝试任何问题复位并设置起始地址到sysram(请查看数据表),虽然它不是从原始图像是一个好主意,并重启是首选(下载代码中580使用引导程序),你也可以尝试以重置堆栈发送GAPM_RESET命令。
是否有可能共享一些代码(中心和设备)以便查看,因为我们无法复制我们这边的问题?
由于MT_dialog
嗨MT_dialog,
你可向我们提供一个电子邮件地址发送的代码?你可以亲自通过电子邮件与我联系。
非常感谢,
嗨zwang308,
问题是由于过时的SDK。
由于MT_dialog
嗨,MT_dialog。
我犯了和zwang308先生一样的错误。我使用的是sdk版本V3.0.8。你说因为SDK已经过时了,请告诉我哪个SDK是可以的。谢谢。
喜门松,
最新的SDK是580设备的5.0.4。
由于MT_dialog