嗨,对话框中,
我知道你说过“简而言之,DA1458x现在正式成为BT 4.2设备,不支持可选特性”,但我不清楚BLE PDU扩展到251字节是否被认为是可选特性。如果SDK 5.0.3支持它,是否需要进行一些配置?
我确实读了使用GATT_EXC_MTU_CMD来定义一个更大的MTU的帖子,我正在研究。
谢谢你,马克斯
嗨Max44,
4.2的新特性将LE的链路层PDU从27字节扩展到251字节的负载,这在580上是不支持的,因为它是4.2的可选特性。当选择一个更大的MTU时,你不改变LE的PDU,但上层,在L2CAP之上接受更大的有效负载的能力,发送数据包的实际有效负载保持不变。
由于MT_dialog
太,
好的,谢谢。
正如您从前面的问题中猜测的那样,我正在试验将一些记录到EEPROM的传感器数据发回。我想发送EEPROM数据页(256字节)。我尝试着使用bl_app_peripheral中设置的20字节数据的自定义特性发送带有多次读取的单个页面,它花费了几乎1秒的时间。
我不确定创建一个具有更大字节数的特征并增加MTU值是否会导致更快的数据传输。你觉得会有帮助吗?
问候,马克斯
您应该使用无响应写而不是有响应写,以便能够在一个连接事件中发送多个20字节的数据包。这将为您提供与增加MTU相同的性能。
Joacimwe,
感谢输入,我的数据流是从DA到Android平板/手机,它正在读取存储在连接到DA14580的EEPROM中的数据。我曾考虑使用notify读取数据,但从最近与MT_Dialog的讨论中,没有任何反馈表明平板电脑/手机已经读取和存储了数据。我担心这可能导致数据丢失,如果我只是将数据推入数据特征,所以我实现了一个流控制特征作为确认。当然,这增加了BLE开销,并进一步减慢了数据传输。如果你知道一些更好的处理方法,请告诉我。现在,我计划增加数据特性....中的字节数如果这似乎没有多大作用,可能会增加MTU值。这对我来说是新领域,所以我在小步前进。
我明白了。我以为你写的是另一个方向的数据。
如果您只是推送带有通知的数据(一个一个地发送它们并等待GATTC_CMP_EVT发送下一个),它们将以最大的速度按顺序发送,并且由于链路层在发送下一个包之前等待前一个包的确认,因此不会在空中丢弃数据包。
Android也有这样一种构建方式,它永远不会丢弃传入的通知,而是将所有通知以正确的顺序转发给正在监听该特性的应用程序。
唯一可能发生的情况是连接丢失,这意味着传输被终止,但所有接收到的通知仍然按照正确的顺序被接收。最简单的方法就是重新启动一切。
如果你想让外围设备知道Android设备已经收到了所有的通知,只需在任何特征上写一些值来表明这一点。您不需要确认中间数据包,只需要确认最后一个数据包。
谢谢你!我会试一试。
不幸的是,我没能成功。我修改了DA代码,向数据特征添加了一个notify属性,并确保它能按预期推出数据。然而,Android端没有工作。我不能启用通知,在过程中得到写声明错误。我被困在这里了。
我用的是三星Galaxy Tab a平板电脑,安装的是Android 6.0.1系统。测试应用程序是由蓝牙开发者工作室生成的,相当简单。每个自定义特性(仅从ble_app_peripherals SDK示例中稍加修改)都有用于写、读和启用特性定义的通知的按钮。所以…我可以扫描,连接,读和写其他特征,但当我点击按钮启用通知的数据特征,它导致写入声明错误(通过Android Studio的调试模式看到)。应用程序中启用通知的BLE代码看起来几乎与Android Developer示例.....相同所以我不明白为什么它没有像宣传的那样有效。错误消息没有任何帮助....状态码129。
如果你知道任何可以纠正这个错误的微妙方法,请告诉我。我不认为在这里详细讨论Android是合适的,但如果你想离线讨论,我可以发布一个电子邮件地址。我在网上看到了很多关于三星版棉花糖的抱怨,所以我可能遇到了它里面的什么东西不能用。我没有其他安卓设备可以尝试,但可以考虑在三星平板电脑上改用安卓5。
你是如何在DA14580端启用通知的?您既需要设置ATT权限,也需要在GATT特性声明上设置一点。客户端特性配置描述符也必须存在。
最简单的方法是遵循具有通知特性的现有示例代码。
在Android端,您既需要编写描述符,也需要本地注册通知。
好叫!我回过头来,在user_custs_config.h文件中发现了一些错误。我按照您的建议使用了一个现有的示例,但它用于指示属性。我错过了编辑所有要更改为通知的地方。
我现在可以成功地在Android端编写描述符,至少可以启用通知。我还有一些工作要做,以确定我是否可以在测试用例中完成数据传输,但是我会报告结果。
谢谢你一直以来的帮助。非常感谢。
马克斯
我的测试用例发送200字节(10次连续读取20字节)在纠正启用通知问题后正常工作。我在Android平板电脑上测量了30毫秒,从我从一个写命令得到响应开始发送数据到从存储在平板电脑数组中的DA获得所有200字节。
这是一个巨大的进步!!再次感谢您的指导。
我将看看是否可以将测试扩展到1KB的传输。你知道我用这种方式传输的数据量有限制吗?我的EEPROM是一个2兆的,我也计划把它用作引导内存。我可能有大约230KB的日志数据要发送。
致以最诚挚的问候,Max
我猜BLE的吞吐量比EEPROM要小,所以EEPROM不是瓶颈。
一个技巧是降低连接间隔(寻找连接参数更新请求)以更快地发送数据。否则,据我所知,你可以流多少是没有限制的。
在一个更大的1KB块(820 msec)时,我的数据速率急剧下降。传输时间。我相当肯定这不是由于任何EEPROM计时,因为我在运行测试之前将数据读入一个大数组,但我将检查它。我想这可能是因为你提到的连接间隔?在DA端,我看到user_config.h中有连接间隔值,似乎是10 msec最小和20 msec最大。如果它们是默认连接参数,那么看起来没问题。我试着修改user_config.h中的值。如果我把两者都设为10毫秒,就会停止工作。如果我将最大值设置为11.25,我只能得到稍好的传输时间,即791 msec。在测试的迭代过程中,时间似乎也有所不同。
在连接时,我看到Android Studio调试器报告:onClientConnParamsChanged() - Device=80:EA:CA:00:00:03 interval=9 status=0
我想DA14580根据注释设置的间隔增量是1.25 msec,所以9应该是11.25 msec?
和最大的间隔在20 msec我得到:onClientConnParamsChanged() -设备=80:EA:CA:00:00:03 interval=15状态=0 15 x 1.25 = 18.75
因此,我似乎可以稍微调整一下,但没有太大的显著改进。
我意识到我在使用DA上的时间来编写UART上的调试消息。我将所有这些都配置为关闭,并关闭开发调试模式。现在,将连接间隔最大设置为上面提到的11.25 msec,对于每个20字节的50个包,我得到的传输时间为161 msec。这太好了!
嗨Max44,
4.2的新特性将LE的链路层PDU从27字节扩展到251字节的负载,这在580上是不支持的,因为它是4.2的可选特性。当选择一个更大的MTU时,你不改变LE的PDU,但上层,在L2CAP之上接受更大的有效负载的能力,发送数据包的实际有效负载保持不变。
由于MT_dialog
太,
好的,谢谢。
正如您从前面的问题中猜测的那样,我正在试验将一些记录到EEPROM的传感器数据发回。我想发送EEPROM数据页(256字节)。我尝试着使用bl_app_peripheral中设置的20字节数据的自定义特性发送带有多次读取的单个页面,它花费了几乎1秒的时间。
我不确定创建一个具有更大字节数的特征并增加MTU值是否会导致更快的数据传输。你觉得会有帮助吗?
问候,马克斯
您应该使用无响应写而不是有响应写,以便能够在一个连接事件中发送多个20字节的数据包。这将为您提供与增加MTU相同的性能。
Joacimwe,
感谢输入,我的数据流是从DA到Android平板/手机,它正在读取存储在连接到DA14580的EEPROM中的数据。我曾考虑使用notify读取数据,但从最近与MT_Dialog的讨论中,没有任何反馈表明平板电脑/手机已经读取和存储了数据。我担心这可能导致数据丢失,如果我只是将数据推入数据特征,所以我实现了一个流控制特征作为确认。当然,这增加了BLE开销,并进一步减慢了数据传输。如果你知道一些更好的处理方法,请告诉我。现在,我计划增加数据特性....中的字节数如果这似乎没有多大作用,可能会增加MTU值。这对我来说是新领域,所以我在小步前进。
问候,马克斯
我明白了。我以为你写的是另一个方向的数据。
如果您只是推送带有通知的数据(一个一个地发送它们并等待GATTC_CMP_EVT发送下一个),它们将以最大的速度按顺序发送,并且由于链路层在发送下一个包之前等待前一个包的确认,因此不会在空中丢弃数据包。
Android也有这样一种构建方式,它永远不会丢弃传入的通知,而是将所有通知以正确的顺序转发给正在监听该特性的应用程序。
唯一可能发生的情况是连接丢失,这意味着传输被终止,但所有接收到的通知仍然按照正确的顺序被接收。最简单的方法就是重新启动一切。
如果你想让外围设备知道Android设备已经收到了所有的通知,只需在任何特征上写一些值来表明这一点。您不需要确认中间数据包,只需要确认最后一个数据包。
谢谢你!我会试一试。
不幸的是,我没能成功。我修改了DA代码,向数据特征添加了一个notify属性,并确保它能按预期推出数据。然而,Android端没有工作。我不能启用通知,在过程中得到写声明错误。我被困在这里了。
我用的是三星Galaxy Tab a平板电脑,安装的是Android 6.0.1系统。测试应用程序是由蓝牙开发者工作室生成的,相当简单。每个自定义特性(仅从ble_app_peripherals SDK示例中稍加修改)都有用于写、读和启用特性定义的通知的按钮。所以…我可以扫描,连接,读和写其他特征,但当我点击按钮启用通知的数据特征,它导致写入声明错误(通过Android Studio的调试模式看到)。应用程序中启用通知的BLE代码看起来几乎与Android Developer示例.....相同所以我不明白为什么它没有像宣传的那样有效。错误消息没有任何帮助....状态码129。
如果你知道任何可以纠正这个错误的微妙方法,请告诉我。我不认为在这里详细讨论Android是合适的,但如果你想离线讨论,我可以发布一个电子邮件地址。我在网上看到了很多关于三星版棉花糖的抱怨,所以我可能遇到了它里面的什么东西不能用。我没有其他安卓设备可以尝试,但可以考虑在三星平板电脑上改用安卓5。
你是如何在DA14580端启用通知的?您既需要设置ATT权限,也需要在GATT特性声明上设置一点。客户端特性配置描述符也必须存在。
最简单的方法是遵循具有通知特性的现有示例代码。
在Android端,您既需要编写描述符,也需要本地注册通知。
好叫!我回过头来,在user_custs_config.h文件中发现了一些错误。我按照您的建议使用了一个现有的示例,但它用于指示属性。我错过了编辑所有要更改为通知的地方。
我现在可以成功地在Android端编写描述符,至少可以启用通知。我还有一些工作要做,以确定我是否可以在测试用例中完成数据传输,但是我会报告结果。
谢谢你一直以来的帮助。非常感谢。
马克斯
Joacimwe,
我的测试用例发送200字节(10次连续读取20字节)在纠正启用通知问题后正常工作。我在Android平板电脑上测量了30毫秒,从我从一个写命令得到响应开始发送数据到从存储在平板电脑数组中的DA获得所有200字节。
这是一个巨大的进步!!再次感谢您的指导。
我将看看是否可以将测试扩展到1KB的传输。你知道我用这种方式传输的数据量有限制吗?我的EEPROM是一个2兆的,我也计划把它用作引导内存。我可能有大约230KB的日志数据要发送。
致以最诚挚的问候,Max
我猜BLE的吞吐量比EEPROM要小,所以EEPROM不是瓶颈。
一个技巧是降低连接间隔(寻找连接参数更新请求)以更快地发送数据。否则,据我所知,你可以流多少是没有限制的。
在一个更大的1KB块(820 msec)时,我的数据速率急剧下降。传输时间。我相当肯定这不是由于任何EEPROM计时,因为我在运行测试之前将数据读入一个大数组,但我将检查它。我想这可能是因为你提到的连接间隔?在DA端,我看到user_config.h中有连接间隔值,似乎是10 msec最小和20 msec最大。如果它们是默认连接参数,那么看起来没问题。我试着修改user_config.h中的值。如果我把两者都设为10毫秒,就会停止工作。如果我将最大值设置为11.25,我只能得到稍好的传输时间,即791 msec。在测试的迭代过程中,时间似乎也有所不同。
在连接时,我看到Android Studio调试器报告:onClientConnParamsChanged() - Device=80:EA:CA:00:00:03 interval=9 status=0
我想DA14580根据注释设置的间隔增量是1.25 msec,所以9应该是11.25 msec?
和最大的间隔在20 msec我得到:onClientConnParamsChanged() -设备=80:EA:CA:00:00:03 interval=15状态=0 15 x 1.25 = 18.75
因此,我似乎可以稍微调整一下,但没有太大的显著改进。
我意识到我在使用DA上的时间来编写UART上的调试消息。我将所有这些都配置为关闭,并关闭开发调试模式。现在,将连接间隔最大设置为上面提到的11.25 msec,对于每个20字节的50个包,我得到的传输时间为161 msec。这太好了!