嗨,对话小组,
我是BLE的新手,尝试在DA14580上运行基于SDK5.0.4的BLE_应用程序_外围设备项目。(EVK Pro)中央设备是iPhone应用程序LightBlue。我的最终目标是读取由iPhone控制的加速器传感器值。
作为第一步,我想看看能否捕获DA14580上的事件,为此,在回调函数中设置了几个断点,如custs1_task.c文件中的gattc_write_cmd_ind_handler、custs1_val_ind_req_handler和custs1_val_ntf_req_handler。
之后,如果我用浅蓝色按下“write new value”(写入新值),那么我可以看到程序在gattc_write_cmd_ind_处理程序函数中停止,这也是预期的。但是如果我用浅蓝色按下“read”,程序中什么也不会发生。浅蓝色也显示“无价值”原因是什么?
例如,我知道已经有几个线程讨论过这个问题
-使用通知而不是读取,因为读取访问可以直接访问堆栈
-SDK 5.0.4将修复此问题
-以ble_应用程序_外围设备为参考
等等
我尝试了所有这些,但没有成功。所以
1.你能告诉我哪个示例代码可以处理来自LightBlue的“read”吗
2.如果没有这样的例子,你能告诉我应该采取哪些步骤吗?多一点细节对我会很有帮助
3.LightBlue是测试“阅读”的合适移动应用程序吗?如果没有,你会推荐我哪款应用?
非常感谢你
安东
关键词:
设备:
我阅读了SDK5.0.4的发行说明,发现现在SDK5.0.4中也支持GATTC_read_CMD_IND。因此,我尝试对GATTC_WRITE_CMD_IND进行以下模拟:
1.在custs1\u task.c中添加GATTC\u READ\u CMD\u IND的处理程序定义
{GATTC_READ_CMD_IND,(ke_msg_func_t)GATTC_READ_CMD_IND_handler}
2.在custs1_task.c中实现gattc_read_cmd_ind_handler
在这一步中,我只发送消息ID为custs1\u val\u read\u ind的custs1\u val\u read\u ind消息(类似于custs1\u val\u write\u ind)
3.然后,我实现了用于读取文件user_peripal.c中user_catch_rest_hndl函数中的第二个ADC值的切换情况
...
案例客户1_VAL_READ_IND:
{
Struct custs1_val_read_ind const *msg_param = (Struct custs1_val_read_ind const *)(param);
开关(msg_param - >处理)
{
案例客户1\u IDX\u ADC\u VAL\u 2\u VAL:
int-sta=0;
打破;
违约:
打破;
}
}打破;
...
4.我将断点设置为int sta=0,然后运行LightBlue将ADC的“再次读取”值设置为第二个值。(可以很好地建立iPhone和DA14580之间的连接)如上所述,在这一点上,我看不到程序跳转到断点,并且“无值”显示为浅蓝色。
但对于“写入”,我可以看到程序跳入写入处理程序,在没有断点的情况下,它可以打开/关闭LED。
所以它告诉我GATTC_READ_CMD_IND仍然不能工作。“读”处理有什么问题?你能告诉我更多的细节吗?
谢谢
安东
你好
请参考RW-BLE-GATT-IS。GATTC_READ_CMD_IND不是有效的命令。请参阅接口规范第21页,并使用GATTC\u READ\u IND进行回调。
此外,ble_app_外围设备的裸骨版本中的值特征没有写入任何内容。但是,描述属性由浅蓝色应用程序写入和读取。在应用程序的连接上,iPhone将读取所有描述特征,您应该在这里得到一个回调。
尝试替换上面的小变化,然后在580上,尝试更改值特征,并验证您是否可以读取值。
使用此处理程序设置值:
Static int custs1_val_set_req_handler(ke_msg_id_t const msgid,
Struct custs1_val_set_req const *param,
KEU task\u id\u t const dest\u id,
ke_任务id_t常量src_id)
你好
根据您的建议,我试图首先找出描述特征的阅读位置,但没有成功:
在整个项目中搜索例如“CUST1_ADC_VAL_2_USER_DESC”——>只显示在客户数据库定义中(user_custs1_def.c)
——> "GATTC_READ_IND"可以由prf_utils.c文件中的prf_client_att_info_rsp()函数调用
——>,但它(prf_client_att_info_rsp())从未被其他函数调用。
-在函数prf_client_att_info_rsp()中设置断点,然后运行浅蓝色,可以很好地建立连接,但程序不会跳转
进入函数prf_client_att_info_rsp()
总结:
到目前为止,在你的帮助下,我明白
-GATTC_READ_IND是由浅蓝色激活的“READ”之后的事件
-应使用custs1_val_set_req_handler()设置值
但是在ble_app_peripheral项目的帮助下,我仍然不能捕捉到读流
请您再详细告诉我一下,关于描述特性,浅蓝色和DA14580之间的读流是什么?
谢谢
浅蓝色的读取请求似乎永远不会传递到DA14580用户应用层,这就是我无法捕获此类事件的原因。(但为什么写是可能的呢?)如果是真的,你能告诉我,我在外围的用户应用层处理这种来自中央设备的读请求的工作流程是什么吗?我已经花了一个星期来解决这个问题,请帮助我解决它。非常感谢你
安东
我验证了我可以设置ADC_VAL2_CHAR,并且可以使用custs1_val_set_req从lightBlue操作系统读取它。
我还确认了您的发现,即消息没有被传递到应用层。我正在深入研究这个问题,一旦找到解决方案,我会尽快做出回应。
我不知道如何使用custs1_val_set_req(),但是在研究了DSPS示例之后,我确认可以使用custs1_val_set_req设置值。然后,LightBlue可以读取该值。我正在等待您关于用户应用层读取指示的解决方案。谢谢
抱歉耽搁了,我只是想知道答案。另外,我能问一下为什么您的应用程序需要这个功能吗?另外,您是否已经深入阅读了描述注册活动的软件发布说明?下面是如何实现这个特性的基本原则:
***********************************************************************************************************************
引入了ATTS_READ_REQ_IND消息。消息包含对等设备请求读取的属性句柄。
需要此机制的任务通常会在DB创建时使用dg_register_task_for_read_request() C API注册ATTS_READ_REQ_IND消息。
收到ATTS_READ_REQ_IND消息后,任务可以修改ATT DB,然后必须通过调用dg_ATTS_READ_cfm()进行回复。有两个用例:
任务决定请求请求是有效的,(可选地)修改DB中的值,最后通过在dg_atts_read_cfm()的status_code参数中传递ATT_ERR_NO_ERROR来进行响应。这将导致向对端设备发送ATT读响应。
任务判定读请求无效,并通过传递一个ATT错误码给dg_atts_read_cfm()来响应。这将导致向对端设备发送ATT错误响应。
我想向我们的客户证明,读取传感器数据可以由他的iPhone控制。我认为既然有GATTC_WRITE_CMD_IND用于写,那么一定有一个模拟指示用于读。发布说明中提到的部分似乎比GATTC_WRITE_CMD_IND更复杂,所以我不确定这是否是正确的方法。谢谢你的提示,至少我现在知道发布说明的部分是正确的方式。票可以关闭了。