嗨,对话框的团队,
我是BLE的新手,尝试在DA14580上运行基于SDK5.0.4的ble_app_peripheral项目。中心设备是iPhone应用程序LightBlue。我的最终目标是读取iPhone控制的加速器传感器值。
作为第一步,我想看看是否可以捕获DA14580上的事件,为此,在回调函数中设置了几个断点,如文件custs1_task.c中的gattc_write_cmd_ind_处理程序、custs1_val_ind_req_处理程序和custs1_val_ntf_req_处理程序。
之后,如果我在LightBlue中按下“write new value”,那么我可以看到程序在gattc_write_cmd_ind_handler函数中停止,这也是预期的。但是如果我按下浅蓝色的“读”键,程序中什么也不会发生。浅蓝色也表示“没有价值”,原因是什么?
例如,我知道已经有几个线程在讨论这个问题了
-使用通知而不是读,因为读直接访问BLE堆栈
SDK 5.0.4会修复的
-以ble_app_peripheral为例
等等
这些我都试过了,但都没有成功。所以
1.您能告诉我哪个示例代码可以处理LightBlue中的“读取”吗
2.如果没有这样的例子,请告诉我接下来要做哪些步骤?多说一点细节对我很有帮助
3.LightBlue是否适合测试“阅读”?如果没有,你会推荐哪款应用呢?
非常感谢
安东
关键词:
设备:
我读了SDK5.0.4的发布说明,发现GATTC_READ_CMD_IND现在也支持SDK5.0.4。所以我尝试对GATTC_WRITE_CMD_IND做如下模拟:
1.在custs1_task.c中添加GATTC_READ_CMD_IND的处理程序定义
{GATTC_READ_CMD_IND (ke_msg_func_t) gattc_read_cmd_ind_handler}
2.在custs1\u task.c中实现gattc\u read\u cmd\u ind\u处理程序
在这一步中,我只发送custs1_val_read_ind消息(模拟custs1_val_write_ind),消息ID为custs1_val_read_ind
3.然后实现切换用例,读取文件user_peripherl .c中user_catch_rest_hndl函数中的第二个ADC值
...
案例CUSTS1_VAL_READ_IND:
{
结构custs1_val_read_ind const*msg_param=(结构custs1_val_read_ind const*)(参数);
开关(味精参数->手柄)
{
案例CUST1_IDX_ADC_VAL_2_VAL:
int sta = 0;
打破
默认值:
打破
}
}中断;
...
4.我将断点设置为int sta=0,然后运行LightBlue将ADC第二个值的“再次读取”。(iPhone和DA14580之间的连接可以很好地建立)如前所述,此时,我没有看到程序跳转到断点,并且在LightBlue中显示“no value”。
但是对于“写”,我可以看到程序跳转到写处理程序,并且没有断点,它可以打开/关闭LED。
所以它告诉我GATTC_READ_CMD_IND仍然不起作用。“READ”处理有什么问题吗?你能告诉我更多细节吗?
谢谢
安东
你好,
请参考RW-BLE-GATT-IS。GATTC_READ_CMD_IND不是有效命令。请参阅接口规范第21页,使用GATTC_READ_IND进行回调。
此外,在ble_app_peripheral的基本版本中,没有向值特征中写入任何内容。但是,描述属性是由浅蓝色应用程序写入和读取的。在应用程序的连接上,iPhone会读取所有的描述特征,你应该在这里得到一个回调。
试着替换上面的小变化,然后在580上,试着改变值特征并验证你能读懂值。
使用下面的处理程序设置值:
静态整数custs1_val_set_req_handler(ke_msg_id_t const msgid,
结构custs1\u val\u set\u req const*param,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
你好,
根据你的建议,我先试着找出描述特征在哪里会被阅读,但是没有成功:
-在整个项目中搜索例如“CUST1_ADC_VAL_2_USER_DESC”->仅在客户数据库定义中显示(USER_custs1_def.c)
-在整个项目中搜索“GATTC_READ_IND”->“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_外围项目的帮助下,我仍然无法捕捉到读取流
请您告诉我浅蓝色和DA14580之间的读取流程是什么?关于描述特征,请再详细一点?
谢谢
似乎来自Light Blue的读请求从来没有传递到DA14580用户应用层,这就是为什么我不能捕捉到这样的事件。(但是为什么可以写呢?)如果是真的,请问我在外设用户应用层的中心设备上处理这样的读请求的工作流程是怎样的?这个问题我已经花了一个星期了,请帮我解决。非常感谢
安东
我验证了可以设置ADC_VAL2_CHAR,并且可以使用custs1_val_set_req从lightBlue操作系统读取它。
我还确认了您发现的消息,关于消息没有传递到应用层。我正在深入研究这一问题,并将在找到解决方案后立即作出回应。
我不知道如何使用custs1_val_set_req(),但在研究了DSPS示例后,我还确认可以使用custs1_val_set_req设置值。然后LightBlue可以读取该值。我正在等待有关用户应用层读取指示的解决方案。谢谢
很抱歉耽搁了您的时间,我只是想得到一些关于thsi的答案。另外,我可以问一下为什么您的应用程序需要此功能吗?另外,您是否进一步阅读了软件发行说明,其中描述了注册活动?以下是如何实现此功能的基本原则:
***********************************************************************************************************************
引入了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()来应答。有两个用例:
任务决定请求有效,(可选)修改数据库中的值,并最终通过在dg_atts_read_cfm()的status_code参数中传递ATT_ERR_NO_ERROR进行响应。这将导致向对等设备发送ATT read respone。
任务确定读取请求无效,并通过将ATT错误代码传递给dg_atts_read_cfm()进行响应。这将导致向对等设备发送ATT错误响应。
我想向我们的客户演示,读取传感器数据可以由他的iPhone控制。我想既然有用于写入的GATTC_WRITE_CMD_IND,那么必须有用于读取的模拟指示。发行说明中提到的部分似乎比GATTC_WRITE_CMD_IND更复杂,所以我不确定这样做是否正确。谢谢您的帮助提示,至少我现在知道发行说明中的部分是正确的。票可以关闭。