⚠️
你好。。谢谢你来到论坛。令人兴奋的消息!我们现在正在迁移到新的论坛平台,该平台将提供更好的功能,并包含在主对话网站中。所有员额和帐户都已迁移。我们现在只接受新论坛的流量-请在//www.wsdof.com/support. 我们将在未来几天内修复bug/优化搜索和标记。
5个职位/ 0个新职位
最后一篇文章
Max44
离线
最后看到:1年2个月前
加入:2016-02-08 15:58
问题使用通知

你好,对话框,

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

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

最近,我尝试在另一个特性中添加通知,以便在某些传感器数据发生变化时显示。这个特性已经定义了notify属性,但我没有使用它。这似乎也能正常工作。启用通知后,传感器数据更改将在检测到时发送,我可以将其显示在Android平板电脑上。这种情况以每秒一次的慢速发生。然而,在测试中,我发现如果我禁用传感器数据通知,然后尝试如上所述的数据传输,它将启动、传输数千字节并停止。发生这种情况时,需要重置DA。到目前为止,我还无法确定为什么会发生这种情况。为什么对另一个特性启用/禁用通知会导致我的数据传输特性出现故障,这对我来说毫无意义。根据我使用DA14580的经验,这似乎类似于在系统出现故障之前不会消耗和积累消息的行为。我不知道如何验证这是否是正在发生的事情,尽管。。。。。或者如果问题是其他的。

你知道是什么原因造成的吗?到目前为止,我已经仔细查看了user_custs1_def.c中的数据库描述和user_custs1_impl.c中的处理程序,到目前为止没有看到任何不正确的地方。我使用了ble_app_peripheral中的ADC示例作为指南,了解需要什么。

谢谢,麦克斯

设备:
MT_dialog
离线
最后看到:7个月6天前
职员
加入:2015-06-08 11:34
嗨,Max44,

嗨,Max44,

从您描述的行为来看,我会假设同样的事情,您正在生成消息,而不是使用它们(显然,设备遇到无法分配内存的断言),可能当前连接的连接间隔不够频繁,因此您发送的数据不是实际发送的,而是累积的。我不确定我是否完全理解您执行的测试。检查您得到的断言,并确保您点击了“分配内存失败”断言,并且由于您已确定这是设备停止响应的原因,请检查您是否意外地生成了数据而没有实际发送数据。

由于MT_dialog

Max44
离线
最后看到:1年2个月前
加入:2016-02-08 15:58
太,

太,

对不起。我尽量简短,不要给你太多的信息。我会更详细地描述我的测试希望能让你们更清楚地了解我在尝试做什么以及我遇到的故障。

我不认为我会得到一个assert错误,正如你上面提到的,但我会重新讨论。我试着查看我在Keil调试器中停在哪里,但并不清楚。我确实得到的数据传输运行没有错误,从一个电源的状态。也就是说,我从SPI flash读取并传输17000字节(**见下文)到我的Android平板电脑,并将数据存储在平板电脑上的一个文件中。经过检查,平板文件中的数据看起来是正确的。这似乎表明连接间隔是足够的,但是我将它保留在ble_app_peripheral示例设置中,我认为这个设置是10分钟,最大20分钟。我原以为custs1代码会调整到连接间隔,下面来自custs1_task.c的注释如下:
表示GATTC_NOTIFY完成的GATTC_CMP_EVT消息
*操作在通知PDU被发送后立即返回
*空气。
因此,它发送我在user_peripheral.c中获得的CUSTS1_VAL_NTF_CFM,我使用它来指示我可以发送下一个通知。这难道不意味着BLE数据包已经传输了吗?在我的例子中,由于我发送了20个字节,它应该在一个单一的BLE传输出去。

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

谢谢,麦克斯

(**17000字节)。17000似乎是个奇怪的数字,但我真的在寻找16384字节。由于20字节的特性(如你所知,这是由BLE数据有效负载决定的),我的数据传输算法从flash读取1000字节,并将其以50 x 20字节的通知发送到Android平板电脑。我决定最简单的方法是运行17次循环,让平板电脑或PC数据分析例行程序筛选数据并丢弃多余的数据。BLE模块和Android平板电脑是为固定的17000字节发送和接收环路而设置的。

Max44
离线
最后看到:1年2个月前
加入:2016-02-08 15:58
太,

太,

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

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

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

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

问候,马克斯

MT_dialog
离线
最后看到:7个月6天前
职员
加入:2015-06-08 11:34
嗨,Max44,

嗨,Max44,

谢谢你的分享。

MT_dialog问好