问题使用通知

⚠️
大家好. .谢谢你来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台,它将提供更好的功能,包含在主对话网站中。所有岗位和账户都已迁移。我们现在只接受新论坛的流量-请在上面发布任何新帖子//www.xmece.com/support.我们将在未来几天修复bug /优化搜索和标记。
5个职位/ 0个新
最后发表
Max44
离线
最后看到:11个月2周之前
加入:2016-02-08等等
问题使用通知

你好,对话框,

我最近在使用通知时遇到了一个问题,希望您能帮助我。

一段时间以来,我一直在运行基于ble_app_peripheral示例的定制应用程序,该示例将传感器数据记录在外部内存中。我在一个Android应用程序中执行了一个命令,检索记录的数据并将其存储在一个Android平板电脑上的文件中。为了做到这一点(基于本论坛的建议),我使用了一个20字节的特征与读、写和通知属性。程序是启用Android应用程序的通知,然后发送自定义命令到DA开始数据传输。这只是用一个通知消息发送20个字节,然后等待通过CUSTS1_VAL_NTF_CFM确认该通知,然后再用另一个通知消息发送20个字节。然后重复此过程,直到发送所有预期的数据。这是伟大的工作,我已经发送了大量的数据使用这种技术。

最近,我尝试将通知添加到另一个特性中,以便在传感器数据发生变化时显示。这个特性已经定义了notify属性,但我还没有使用它。这似乎也可以工作。当通知被启用时,传感器数据变化被检测到时发送,我可以在Android平板电脑上显示它。这是以每秒一次的缓慢速度发生的。然而,在测试中,我发现如果禁用传感器数据通知,然后尝试如上所述的数据传输,它将启动,传输几千字节,然后停止。当发生这种情况时,需要重置DA。到目前为止,我还不知道为什么会这样。我不明白为什么启用/禁用另一个特性的通知会导致我的数据传输特性出现故障。根据我使用DA14580的经验,这似乎与消息没有被消费和积累直到系统失败类似。 I don't know how to verify if that's what is happening or not though ..... or if the problem is something else.

有什么可能导致这种情况或者我可能会看到什么吗?到目前为止,我已经仔细查看了user_custs1_def.c中的数据库描述和user_custs1_impl.c中的处理程序,到目前为止还没有看到任何不正确的内容。我使用了ble_app_peripheral中的ADC示例作为指南,了解需要做什么。

谢谢你,马克斯

设备:
MT_dialog
离线
最后看到:4个月2周之前
工作人员
加入:2015-06-08 34
嗨Max44,

嗨Max44,

从你描述的行为,我将假设相同的事情,你是生成消息,而不是消费他们(显然设备命中了一个断言不能分配内存),可能当前连接的连接间隔不够频繁,因此您正在发送的数据不是实际发送,而是累积。我不确定我是否完全理解您执行的测试。检查断言,你得到并确保你击中失败分配内存断言,因为你已经确保,这是你的设备停止响应的原因,如果你意外地以某种方式生成数据,而没有实际发送它们。

由于MT_dialog

Max44
离线
最后看到:11个月2周之前
加入:2016-02-08等等
太,

太,

对不起。我只是想简明扼要,不要给你太多信息。我将对我的测试进行更详细的描述,希望能让您更清楚地了解我试图做什么以及我所遇到的故障。

我不认为我得到了如上所述的断言错误,但我将再次讨论这个问题。我试着查看我在Keil调试器中停在哪里,但并不清楚。我确实能让数据传输在通电状态下正常运行。也就是说,我从SPI flash中读取并传输17000字节(**见下文)到我的Android平板电脑,并将数据存储在平板电脑上的一个文件中。经过检查,平板文件中的数据看起来是正确的。这似乎表明连接间隔是足够的,但是我把它放在ble_app_peripheral示例设置中,我认为是10分钟和20分钟。我原以为custs1代码会根据custs1_task.c中的以下注释调整连接间隔:
GATTC_CMP_EVT消息,表示GATTC_NOTIFY完成
*一旦通知PDU发送完毕,操作就被返回
*空气。
因此,这将发送我在user_peripheral.c中获得的CUSTS1_VAL_NTF_CFM,我使用它来指示我可以发送下一个通知。这是不是意味着BLE数据包已经被传输了?在我的例子中,因为我发送了20个字节,它应该在一个BLE传输中发出。

让我困扰的是,数据传输本身可以工作,可以向Android平板电脑发送大量数据。如果我去激活另一个特性的通知,它会导致数据传输程序失败。我很难弄清楚互动是什么.....或者我做了什么愚蠢的事情,或者代码中的某个地方出现了错误。到目前为止,我还没有在代码中发现错误,但我会继续寻找。

谢谢你,马克斯

(* * 17000字节)。17000可能看起来是一个奇怪的数字,但我真正需要的是16384字节。由于20字节的特性(如你所知,这是由BLE数据有效负载决定的),我的数据传输算法从flash读取1000字节,并将其推送到Android平板电脑,并带有50 x 20字节的通知。我认为最简单的做法是运行17次循环,让平板电脑或PC数据分析程序筛选数据,丢弃多余的数据。BLE模块和Android平板电脑设置为固定的1.7万个字节的发送和接收循环。

Max44
离线
最后看到:11个月2周之前
加入:2016-02-08等等
太,

太,

我终于发现了问题所在。事实证明,Android应用程序并没有发送一个描述符来禁用通知,即使用户界面上的一个按钮被触动了。我使用的应用程序是由蓝牙开发者工作室+ Android工作室生成,行为类似于蓝色放大镜。我的传感器数据特性具有用于读取和写入的GUI按钮,并允许通知与我实现的DA14580自定义服务交互。触摸启用通知按钮会发送一个带有启用值的描述符,并将按钮更改为禁用通知。Android应用只是在你点击按钮禁用通知时重新发送启用值。因为我每秒更新一次传感器数据,所以我预计禁用通知将切换回更新特征数据库进行读取。相反,当它们在平板电脑上被禁用时,我继续发送通知,导致出现错误。

我发现禁用通知是其他使用Android BLE服务的Android开发者遇到的一个问题,如果这个论坛上的其他人遇到这个问题,可以在网上提出一些修复建议。

我做了更正,现在看起来我正在接收描述符值来禁用DA14580上的通知。在启用和禁用传感器数据特性的通知后,数据传输现在似乎正在工作。

现在我们可以结束这个话题了。谢谢聆听!

问候,马克斯

MT_dialog
离线
最后看到:4个月2周之前
工作人员
加入:2015-06-08 34
嗨Max44,

嗨Max44,

谢谢你的分享。

MT_dialog问好