当中心试图读取一个特定的特征时,如何改变值?

⚠️
大家好. .感谢来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台的过程中,它将提供更好的功能,并包含在主对话网站。所有的帖子和账号已经迁移。我们现在只接受新论坛的流量-请发布任何新的帖子在//www.wsdof.com/support.我们会在接下来的几天修复bug /优化搜索和标记。
8个职位/ 0个新职位
最后发表
离线
最后看到:7个月3个星期前
加入:2018-04-19 13:53
当中心试图读取一个特定的特征时,如何改变值?

Hi Dialog,我需要更新值,当中心试图读取特定特征的值时,我已经在user_custs1_def.c文件的数据库定义中应用了RI选项,如下所示:
//时间特征值
[SVC1_IDX_TIME_VAL] = {
Svc1_time_uuid_128, att_uuid_128_len, perm (rd, enable)| perm (wr, enable)| perm (write_req, enable),
烫(RI,启用)| DEF_SVC1_TIME_CHAR_LEN
},
但是我仍然没有在cust1_task.c文件中捕捉到gattc_read_req_ind_handler()函数上的msg。
此外,我发现如果我应用RI选项,我不能写值成功。

设备:
PM_Dialog
离线
最后看到:13小时1分钟前
工作人员
加入:2018-02-08 11:03
你好,嗯,

你好,嗯,

请您查看以下之前论坛上的帖子。

https://support.dialog-semiconductor.com/forums/post/dialog-smartbond-bluetooth-low-energy-%E2%80%93-software/changing-value-database-dinamically

我跟踪了那篇文章,并在ADC1特性的值中添加了PERM(RI, ENABLE)。通过这样做,当我试图读取ADC值1特征时,我能够获得cust1_task.h的gattc_read_req_ind_handler()函数。我建议你检查DISS配置文件的实现是否使用了类似的选项,以及diss_task.h的gattc_read_req_ind_handler()函数是否在读取DISS特征时被触发。

谢谢,PM_Dialog

离线
最后看到:7个月3个星期前
加入:2018-04-19 13:53
嗨对话框:

嗨对话框:
我有进一步的研究,我发现如果我添加PERM(RI, ENABLE),问题是我只能得到一旦触发gattc_read_req_ind_handler()函数,如果再次读取,它不会触发。更重要的问题是如果我尝试执行attmdb_att_set_value(…)函数,它将返回状态0x06 (ATT_ERR_REQUEST_NOT_SUPPORTED).这意味着如果我的特征像这样应用写权限:PERM(RD,ENABLE)|PERM(WR, ENABLE)|PERM(WRITE_REQ, ENABLE),我不能设置特征值。

PM_Dialog
离线
最后看到:13小时1分钟前
工作人员
加入:2018-02-08 11:03
你好,嗯,

你好,嗯,

在我的设置和修改ADC值特性,并添加了额外的权限,你提到的,我没有看到你在帖子中提到的。需要说明的是,SDK端没有实现来处理这类事务,这意味着您必须处理gattc_read_req_ind_handler()中的代码,因为SDK配置文件不会向应用程序传递任何消息,以确保有人从该特定特征中读取数据。那么,关于回调只发生一次的事实,你如何能够确定这个呢?你在使用断点吗?如果断点击中一次,那么链接就会丢失,而另一边的中心将会延迟,直到它意识到他无法找到从属并发出断开。在gattc_read_req_ind_handler()在一次读取后没有发生的情况下,设备将在30秒后断开连接(我不认为这是你这边的情况),断开连接的原因将是来自从服务器的确认消息不会被发送。在SDK的情况下,情况并非如此,因为当您启用了RI特性时,您总是会得到一个从响应,即使这是由于处理RI情况的自定义配置文件不完整而导致的错误。我相信回调会发生,在我这边测试过。关于attmdb_att_set_value(),你不需要这个,我觉得你想实现的是每次你得到一个阅读指示您想发送一个不同的值到主,为了这样做你会实现它的gattc_read_req_ind_handler()回调, that means that as soon as the gattc_read_req_ind_handler() is triggered you should perform whatever tasks you would like to compute the value and then allocate and send a GATTC_READ_CFM message that will contain the value that you would like to send to the master (the value should be copied to the cfm->value struct). Please check the example below.

cfm = KE_MSG_ALLOC_DYN(GATTC_READ_CFM, src_id, dest_id, GATTC_READ_CFM, length);

cfm - >处理=参数- >处理;

cfm - >状态= GAP_ERR_NO_ERROR;

cfm - >长度= 2;

status == GAP_ERR_NO_ERROR

测试+ +;

memcpy (cfm - >值,测试,2);

ke_msg_send (cfm);

这个测试是一个全局变量,每次读取一个特定的特征时都应该增加这个变量。

谢谢,PM_Dialog

离线
最后看到:7个月3个星期前
加入:2018-04-19 13:53
嗨,对话框:

嗨,对话框:
我们测试你的代码,发现只是更新客户端特征配置值(测试在淡蓝色)和属性值总是“没有值”。
而通过gattc_read_req_ind_handler(custs1_task)中的代码,要更新的值来自custs1_get_ccc_value(conidx, att_idx),它的长度总是2,但是长度
属性值可以长达20。有什么问题吗?
gattc_read_req_ind_handler的一些代码:
//如果已找到该属性,则状态为GAP_ERR_NO_ERROR
status == GAP_ERR_NO_ERROR

const struct cust_prf_func_callbacks *callbacks = custs_get_func_callbacks(TASK_ID_CUSTS1);

如果(回调- > att_db [att_idx]。uuid_size == ATT_UUID_16_LEN &&
* (uint16_t *)回调- > att_db [att_idx]。uuid = = ATT_DESC_CLIENT_CHAR_CFG)

Ccc_val = custs1_get_ccc_value(conidx, att_idx);
长度= 2;

其他的

状态= PRF_APP_ERROR;


//发送读响应
cfm = KE_MSG_ALLOC_DYN(GATTC_READ_CFM, src_id, dest_id, GATTC_READ_CFM, length);
cfm - >处理=参数- >处理;
cfm - >状态=状态;
cfm - >长度=长度;

status == GAP_ERR_NO_ERROR

memcpy (cfm - >值、&ccc_val长度);

ke_msg_send (cfm);

PM_Dialog
离线
最后看到:13小时1分钟前
工作人员
加入:2018-02-08 11:03
你好,嗯,

你好,嗯,

让我试着检查和复制你的问题,我会尽快让你知道。

谢谢,PM_Dialog

PM_Dialog
离线
最后看到:13小时1分钟前
工作人员
加入:2018-02-08 11:03
你好,嗯,

你好,嗯,

客户端特征配置长度为2字节,它们用于启用通知或指示。我不明白你说属性总是“No value”是什么意思。对于属性值特征,最大长度为20字节(23 - 3 =20字节),不需要进行MTU交换。没有什么问题,但是要注意属性值是20,因为您没有使用MTU交换。

谢谢,PM_Dialog

离线
最后看到:7个月3个星期前
加入:2018-04-19 13:53
嗨,对话框:

嗨,对话框:
我的意思是,我使用charactoristic lightblue读,如果我设定一个值charactoristic (attmdb_att_set_value(…)),我将得到一个十六进制值,否则它将返回“毫无价值”,然后如果我再次按下阅读按钮,它将再次读取远程,现在将再次返回一个值,但是价值等于第一个。我想设置或改变返回值,而浅蓝色每次读取特征值。