无法从iPhone应用程序读取特征值(浅蓝色)

9个员额/ 0个新员额
最后发表
muxf
离线
最后看到:3年5个月前
加入:2016-07-25事故发生
无法从iPhone应用程序读取特征值(浅蓝色)

嗨,对话框的团队,

我是BLE的新手,尝试在DA14580上运行基于SDK5.0.4的ble_app_peripheral项目。中心设备是iPhone应用程序LightBlue。我的最终目标是读取iPhone控制的加速器传感器值。

作为第一步,我想看看能否捕获DA14580上的事件,为此,在回调函数中设置了几个断点,如custs1_task.c文件中的gattc_write_cmd_ind_handler、custs1_val_ind_req_handler和custs1_val_ntf_req_handler。

之后,如果我在LightBlue中按下“write new value”,那么我可以看到程序在gattc_write_cmd_ind_handler函数中停止,这也是预期的。但是如果我按下浅蓝色的“读”键,程序中什么也不会发生。浅蓝色也表示“没有价值”,原因是什么?

例如,我知道已经有几个线程在讨论这个问题了

-使用通知而不是读,因为读直接访问BLE堆栈
SDK 5.0.4会修复的
-以ble_app_peripheral为例
等等

这些我都试过了,但都没有成功。所以

1.你能告诉我哪个示例代码可以处理来自LightBlue的“read”吗
2.如果没有这样的例子,请告诉我接下来要做哪些步骤?多说一点细节对我很有帮助
3.LightBlue是否适合测试“阅读”?如果没有,你会推荐哪款应用呢?

非常感谢

安东

关键词:
设备:
muxf
离线
最后看到:3年5个月前
加入:2016-07-25事故发生
我读了发布说明

我读了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_task.c中实现gattc_read_cmd_ind_handler
在这一步中,我只发送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:

Struct custs1_val_read_ind const *msg_param = (Struct custs1_val_read_ind const *)(param);
开关(msg_param - >处理)

案例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仍然不能工作。“读”处理有什么问题?你能告诉我更多的细节吗?
谢谢

安东

JK_Dialog
离线
最后看到:5个月1天前
工作人员
加入:2016-08-22 23:07
你好,

你好,

请参考RW-BLE-GATT-IS。GATTC_READ_CMD_IND不是有效命令。请参阅接口规范第21页,使用GATTC_READ_IND进行回调。

此外,在ble_app_peripheral的基本版本中,没有向值特征中写入任何内容。但是,描述属性是由浅蓝色应用程序写入和读取的。在应用程序的连接上,iPhone会读取所有的描述特征,你应该在这里得到一个回调。

试着替换上面的小变化,然后在580上,试着改变值特征并验证你能读懂值。

使用下面的处理程序设置值:

Static int custs1_val_set_req_handler(ke_msg_id_t const msgid,
Struct custs1_val_set_req const *param,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)

muxf
离线
最后看到:3年5个月前
加入:2016-07-25事故发生
你好,

你好,
根据你的建议,我先试着找出描述特征在哪里会被阅读,但是没有成功:

在整个项目中搜索例如“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之间的读流是什么?

谢谢

muxf
离线
最后看到:3年5个月前
加入:2016-07-25事故发生
似乎读到

似乎来自Light Blue的读请求从来没有传递到DA14580用户应用层,这就是为什么我不能捕捉到这样的事件。(但是为什么可以写呢?)如果是真的,请问我在外设用户应用层的中心设备上处理这样的读请求的工作流程是怎样的?这个问题我已经花了一个星期了,请帮我解决。非常感谢

安东

JK_Dialog
离线
最后看到:5个月1天前
工作人员
加入:2016-08-22 23:07
我验证了我可以设置

我验证了可以设置ADC_VAL2_CHAR,并且可以使用custs1_val_set_req从lightBlue操作系统读取它。

我还确认了您的发现,即消息没有被传递到应用层。我正在深入研究这个问题,一旦找到解决方案,我会尽快做出回应。

muxf
离线
最后看到:3年5个月前
加入:2016-07-25事故发生
我不知道怎么用

我不知道如何使用custs1_val_set_req(),但是在研究了DSPS示例之后,我确认可以使用custs1_val_set_req设置值。然后,LightBlue可以读取该值。我正在等待您关于用户应用层读取指示的解决方案。谢谢

JK_Dialog
离线
最后看到:5个月1天前
工作人员
加入:2016-08-22 23:07
抱歉耽搁了,只是

抱歉耽搁了,我只是想知道答案。另外,我能问一下为什么您的应用程序需要这个功能吗?另外,您是否已经深入阅读了描述注册活动的软件发布说明?下面是如何实现这个特性的基本原则:

***********************************************************************************************************************

引入了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错误响应。

muxf
离线
最后看到:3年5个月前
加入:2016-07-25事故发生
我想展示一下我们的

我想向我们的客户证明,读取传感器数据可以由他的iPhone控制。我认为既然有GATTC_WRITE_CMD_IND用于写,那么一定有一个模拟指示用于读。发布说明中提到的部分似乎比GATTC_WRITE_CMD_IND更复杂,所以我不确定这是否是正确的方法。谢谢你的提示,至少我现在知道发布说明的部分是正确的方式。票可以关闭了。