写入可变长度特征

⚠️
你好。。谢谢你来参加论坛。令人兴奋的消息!我们现在正在移动到我们的新论坛平台,将提供更好的功能,并包含在主对话网站的过程。所有帖子和账号都已迁移。我们现在只接受新论坛上的流量-请在//www.wsdof.com/support. 我们将在未来几天内修复bug/优化搜索和标记。
7个职位/0个新职位
最后一篇文章
mkelwood公司
离线
最后一次见到:4天21小时前
已加入:2017-05-19 18:27
写入可变长度特征

在我们的自定义配置文件中,我们有一个由客户机/中央设备在空中编写的特性。这个特征在user\u custs1\u def.h中定义为字符长度为254(这是它应该具有的最大大小)。在测试中我们发现,只要新的写值长度等于或短于以前的写值,那么一切都正常。但是,如果新值比以前写入的值长(即使新值仍然比初始字符254短得多),则写入失败,系统开始不稳定地运行。例如,在对该特性进行较长时间的写入之后,该特性就不能再通过无线方式读取,与客户端的连接变得不稳定。

在编写较长字符串的情况下,似乎从未调用custs1\u task.c中的gattc\u write\u req\u ind\u handler()函数,因此问题出现在代码的这一点之前。

我们如何实现期望的功能?也就是说,一个可写的特征可以从客户机获取任何值(最多254字节),而不管该特征的当前内容是什么?

设备:
PM\U对话框
离线
最后一次见到:3天6小时前
工作人员
已加入:2018-02-08 11:03
嗨,mkelwood,

嗨,mkelwood,

似乎向特性写入比以前写入的值更大的值不是问题,我无法复制它。请看一下我们可以在DSPS中写入247字节数据的DSPS应用程序>在DSPS中您可以拥有您想要的功能,因此请检查这些特性是如何在这个项目中实现的。

谢谢,下午好

mkelwood公司
离线
最后一次见到:4天21小时前
已加入:2017-05-19 18:27
你好,PM\U对话,

你好,PM\U对话,

谢谢你的回复。我有一些补充资料。我对这个问题的初步结论是错误的;并不是因为写的时间比以前的写的时间长而导致问题。更确切地说,是大于(MTU-3)字节的写操作,这需要写长特征值过程(Bluetooth spec 5.0 Vol 3 Part G section 4.9.4)。

我附上了一个显示该问题的OTA捕获文件截图。DA14585是从(GATT服务器)设备。目标特征具有句柄53。在连接和发现之后,我向特征写入一个短(长度小于MTU-3)值,该值成功(参见第4468和4473帧)。我读回正确的值(第6926帧和第6932帧)。然后我尝试写一个21字节长的值(比MTU-3多一个字节)。GATT客户机发送一个Prepare Write请求(第7334帧,突出显示的帧),并且没有来自DA14585的响应。奴隶现在已经崩溃,没有反应了。

我已尝试设置目标特征权限以写入\u REQ和写入\u命令。附加的捕获具有写入请求权限。使用WRITE\ u命令,GATT客户机将不允许我向特性写入长值(它抱怨错误的参数)。

所以我现在的问题是,为什么写长特征值程序不起作用?为什么DA14585没有用Prepare-Write响应来响应?我需要做什么特别的事情来支持GATT服务器端的准备写/执行写序列吗?

谢谢你的帮助!

mkelwood公司
离线
最后一次见到:4天21小时前
已加入:2017-05-19 18:27
我更新到SDK 6.0.10.511;

我更新到SDK 6.0.10.511;写长特征值的问题仍然存在。设备无法响应来自中心的准备写入请求,并且设备在断开/重新连接之前没有响应。

PM\U对话框
离线
最后一次见到:3天6小时前
工作人员
已加入:2018-02-08 11:03
嗨,mkelwood,

嗨,mkelwood,

如果您不使用或不想使用MTU交换,您应该在SDK的ble\u app\u peripheral示例中实现Write Long特征值。请看一下这个SDK示例。如果要写入的特征值的长度大于20字节,则会触发user\u catch\u rest\u hndl()函数中的user\u svc1\u long\u val\u att\u info\u req\u handler()。如果长度小于20字节,则将执行user\u svc1\u long\u val\u wr\u ind\u handler()。因此,如果您想在没有MTU交换的情况下发送超过20个字节,您应该执行与ble\u app\u peripheral示例的user\u svc1\u long\u val\u att\u info\u req\u handler()函数相同的实现。既然这样做了,那么主设备将发送一个“Prepare Write Request”,而从设备将用一个“Prepare Write response”进行响应。否则,如果您想执行一个简单的写请求并发送超过20个字节,则应该增加MTU的大小。

谢谢,下午好

mkelwood公司
离线
最后一次见到:4天21小时前
已加入:2017-05-19 18:27
谢谢你的对话

谢谢你提供这个信息!我已经按照您的建议实现了att\u info\u req\u处理程序代码,这解决了写长特征值问题。在接收到EXECUTE WRITE命令后,wr\u ind\u处理程序仍然被调用;这是预期和首选的行为。

我从来没有想到att\u info\u req\u处理程序是使编写长特征有效的代码。即使看到ble\u app\u外围应用程序中的代码,我也不会将其与Prepare Write/Execute Write序列联系起来。我在Dialog或Riviera Waves文档中的任何地方都找不到关于此的文档。我希望有更好的文档来描述这些更晦涩的回调。

PM\U对话框
离线
最后一次见到:3天6小时前
工作人员
已加入:2018-02-08 11:03
嗨,mkelwood,

嗨,mkelwood,

很高兴你解决了问题。

谢谢,下午好