具体来说,一个设备可以通过空气发送的字节数受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,但是你可以使用下面的代码片段:
请查看附件的截图。我已经实现了一个256字节的“无响应写入”特性。此外,.max_mtu=259,我在user_on_connection中使用了上面的代码片段。为了让您了解,我研究了SDK5.0.4的ble_app_peripheral示例。正如您在附件的快照中所看到的,256字节被分成了更小的数据包。256字节以1个连接间隔从BLE通用应用程序发送到外设。您可以看到,当通过空中发送数据时,只使用了Channel-30,这意味着只有一个连接间隔。通过的有效负载是7400比特/秒。您获得较小吞吐量的可能原因是您可能没有进行MTU交换,因此发送256字节需要超过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_config.h中的参数user_gapm_conf和user_connection_param_conf,但是对实际传输速度没有任何影响。你对此有什么想法/建议吗?它确实很慢。是否有一种方法可以告诉在运行时使用了哪些参数?
嗨pvmellor,
你能查一下MTU的最大尺寸是多少吗?请将user_config.h中user_gapm_conf结构的max_mtu项设置为256。
谢谢,PM_Dialog
好吧,我试过了,恐怕没有什么区别。任何其他想法?你能复制这个吗?一个简单的应用程序重复编写一个256byte的特征应该可以证明这个问题。
我们在这方面做了很多工作。我们可以成功地发送L2CAP连接参数更新请求
我们看到主服务器(智能手机)更改了连接间隔,新参数与我们在Response消息中看到的参数匹配
这些也匹配GTL流的开/关轮询周期。这些都工作得很好,我们可以把连接间隔设为15ms。
然而,它仍然需要太多的连接事件周期来传输数据:大约44个256字节的特征写入。即使我们将特征的大小减少到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,但是你可以使用下面的代码片段:
Static user_gattc_exc_mtu_cmd(uint8_t conidx)
{
struct gattc_exc_mtu_cmd *cmd = KE_MSG_ALLOC(gattc_exc_mtu_cmd,
TASK_APP KE_BUILD_ID (TASK_GATTC conidx),
gattc_exc_mtu_cmd);
cmd - > req_type = GATTC_MTU_EXCH;
ke_msg_send (cmd);
}
请查看附件的截图。我已经实现了一个256字节的“无响应写入”特性。此外,.max_mtu=259,我在user_on_connection中使用了上面的代码片段。为了让您了解,我研究了SDK5.0.4的ble_app_peripheral示例。正如您在附件的快照中所看到的,256字节被分成了更小的数据包。256字节以1个连接间隔从BLE通用应用程序发送到外设。您可以看到,当通过空中发送数据时,只使用了Channel-30,这意味着只有一个连接间隔。通过的有效负载是7400比特/秒。您获得较小吞吐量的可能原因是您可能没有进行MTU交换,因此发送256字节需要超过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