具体来说,一个设备可以通过空气发送的字节数受MTU (Maximum Transfer Unit)的限制,MTU默认限制在23字节,包括ATT层开销,所以有效载荷是20字节。通过增加MTU的大小,这意味着您可以通过空气发送更多的字节。在您的情况下,最大传输单元应该是您希望发送的字节数+ 3个额外字节。您应该修改user_config.h头文件的user_gapm_conf结构的.max_mtu。在此之后,为了与中央执行交换,当您有一个连接(在user_on_connection中)时,应该发送GATTC_EXC_MTU_CMD,并且580将执行交换。没有实现MTU交换功能的API,但是你可以使用下面的代码片段:
请检查附带的截图。我已经实施了256bytes - “没有回复写作”特征。此外,.max_mtu = 259,我在user_on_connection中使用上面的代码片段。为您的信息,我工作在SDK5.0.4的BLE_APP_PERITELAL示例上。正如您可以在附加的快照中看到的,则256bytes划分为较小的数据包。256bytes以1个连接间隔从BLE通用应用程序发送到外设。您可以看到,在空中发送数据时,仅使用通道-30,这意味着只有1个连接间隔。有效载荷通过7400位/秒。为什么您获得较小吞吐量的可能原因是您可能没有完成MTU Exchange,因此对于发送256bytes,需要超过1个以上的连接间隔。请注意,可能会发生重新传输。 You are able to use API uint16_t gattc_get_mtu(uint8_t idx) to poll the negotiated MTU. Regarding you question for the sniffer; I used the Frontline sniffer products for debugging BLE protocol.
嗨pvmellor,
谢谢你的截图。让我查一下,我会尽快给您答复。你能解释一下你是如何发送数据的吗?你在使用通知吗?另外,一个嗅探日志将非常有助于了解数据包是如何通过空气交换的。
谢谢,PM_DIALOG.
数据从智能手机(Android和iOS)发送到DA14850。它通过一个简单的特征WRITE发送,不需要响应(或发送)。我们已经订购了数据包嗅探器,但是我们希望你可以帮助我们从DA14580软件侧追踪这个过程。
我们已经尝试更改user_gapm_conf和user_connection_param_conf的user_config.h中的参数,但没有任何对实际传输速度的差异。您有任何想法/建议可以帮助吗?它的速度很慢。有没有办法讲述运行时在运行时使用的参数?
嗨pvmellor,
你能检查一下我的最大mtu大小吗?请在user_config.h中设置user_gapm_conf结构的max_mtu项到256。
谢谢,PM_DIALOG.
好吧,我试过了,恐怕没有什么区别。任何其他想法?你能复制这个吗?一个简单的应用程序重复编写一个256byte的特征应该可以证明这个问题。
我们现在已经完成了很多工作。我们可以成功发送L2CAP连接参数更新请求
我们看到主服务器(智能手机)更改了连接间隔,新参数与我们在Response消息中看到的参数匹配
这些也匹配GTL流开/关投票时间。所以这一切都在正常工作,我们可以设置15ms的连接间隔让我们说。
但是,对于256字节特性写入,它仍然需要太多的连接事件期限:约44。即使我们将特性的大小降低到64字节,也需要10个连接事件以将其写入DA14580。如果需要,我可以提供追踪(遗憾我们不能只添加JPEG到这些票证)。并且只需16个字节,特征仍然需要2个连接事件来传输。
所以我有一些问题:
感谢您及时支持客户等待......
谢谢,
保罗
嗨pvmellor,
让我检查你的问题并尝试复制你的问题,我会尽快回复你。
谢谢,PM_DIALOG.
嗨,抱歉唠叨,但是你能够在这个方面取得任何进展吗?我们现在被困在你最后等待回复/帮助。请参阅上面的具体问题。
谢谢!
嗨pvmellor,
设备在连接间隔期间发送的数据量取决于中央允许外设发送的数据包。每个选择标准MTU的数据包的有效负载是20字节。所以你发送的每个数据最多可以携带20个字节。您无法控制BLE在连接间隔期间将发送多少数据包,因为这取决于连接的主人,如果他不想接受数据,他只是不会接受它,即使您表示有更多的数据要发送。如果您希望发送超过20字节的数据,那么您必须增加您的MTU大小,然后L2CAP将获取剩余的数据,切掉数据,并将它们放入多个数据包中。
具体来说,一个设备可以通过空气发送的字节数受MTU (Maximum Transfer Unit)的限制,MTU默认限制在23字节,包括ATT层开销,所以有效载荷是20字节。通过增加MTU的大小,这意味着您可以通过空气发送更多的字节。在您的情况下,最大传输单元应该是您希望发送的字节数+ 3个额外字节。您应该修改user_config.h头文件的user_gapm_conf结构的.max_mtu。在此之后,为了与中央执行交换,当您有一个连接(在user_on_connection中)时,应该发送GATTC_EXC_MTU_CMD,并且580将执行交换。没有实现MTU交换功能的API,但是你可以使用下面的代码片段:
静态void user_gattc_exc_mtu_cmd(uint8_t conidx)
{
struct gattc_exc_mtu_cmd * cmd = ke_msg_alloc(gattc_exc_mtu_cmd,
ke_build_id(task_gattc,conidx),task_app,
gattc_exc_mtu_cmd);
cmd-> req_type = gattc_mtu_exch;
ke_msg_send(cmd);
}
请检查附带的截图。我已经实施了256bytes - “没有回复写作”特征。此外,.max_mtu = 259,我在user_on_connection中使用上面的代码片段。为您的信息,我工作在SDK5.0.4的BLE_APP_PERITELAL示例上。正如您可以在附加的快照中看到的,则256bytes划分为较小的数据包。256bytes以1个连接间隔从BLE通用应用程序发送到外设。您可以看到,在空中发送数据时,仅使用通道-30,这意味着只有1个连接间隔。有效载荷通过7400位/秒。为什么您获得较小吞吐量的可能原因是您可能没有完成MTU Exchange,因此对于发送256bytes,需要超过1个以上的连接间隔。请注意,可能会发生重新传输。 You are able to use API uint16_t gattc_get_mtu(uint8_t idx) to poll the negotiated MTU. Regarding you question for the sniffer; I used the Frontline sniffer products for debugging BLE protocol.
谢谢,PM_DIALOG.