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

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

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

设备:
PM_Dialog
离线
最后看到:2天4小时前
工作人员
加入: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

我遵循这篇文章,将PERM(RI,ENABLE)添加到ADC1特性的值中当我试图读取ADC值1特征时触发了cust1_task.h的函数。我建议您检查DISS配置文件的实现情况,该配置文件使用了类似的选项,并且在读取DISS特征时是否触发了DISS_task.h的gattc_read_req_ind_handler()函数。

谢谢,PM_Dialog

离线
最后看到:8个月2天前
加入: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
离线
最后看到:2天4小时前
工作人员
加入: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()回调上实现它,这意味着,一旦触发gattc_read_req_ind_handler(),您就应该执行您想要计算值的任何任务,然后分配并发送一条gattc_read_CFM消息,该消息将包含您想要发送给主机的值(该值应该复制到CFM->value struct)。请检查下面的示例。

cfm=KE_MSG_ALLOC_DYN(GATTC_READ_cfm,src_id,dest_id,GATTC_READ_cfm,长度);

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

cfm - >状态= GAP_ERR_NO_ERROR;

cfm->长度=2;

status == GAP_ERR_NO_ERROR

测试+ +;

memcpy(cfm->value和test,2);

ke_msg_send (cfm);

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

谢谢,PM_Dialog

离线
最后看到:8个月2天前
加入:2018-04-19 13:53
嗨,对话:

嗨,对话:
我们测试你的代码,发现只是更新客户端特征配置值(测试在淡蓝色)和属性值总是“没有值”。
根据gattc_read_req_ind_处理程序(custs1_任务)中的代码,要更新的值来自custs1_get_ccc_值(conidx,att_idx),其长度始终为2,但
属性值可以长达20。有什么问题吗?
gattc_read_req_ind_handler的一些代码:
//如果已找到属性,则状态为GAP\u ERR\u NO\u ERROR
status == GAP_ERR_NO_ERROR

const struct cust_prf_func_callbacks *callbacks = custs_get_func_callbacks(TASK_ID_CUSTS1);

if(回调->att_db[att_idx].uuid\u size==att_uuid\u 16\u 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,长度);
cfm - >处理=参数- >处理;
cfm - >状态=状态;
cfm->长度=长度;

status == GAP_ERR_NO_ERROR

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

ke_msg_send (cfm);

PM_Dialog
离线
最后看到:2天4小时前
工作人员
加入:2018-02-08 11:03
嗨,嗯,

嗨,嗯,

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

谢谢,PM_Dialog

PM_Dialog
离线
最后看到:2天4小时前
工作人员
加入:2018-02-08 11:03
嗨,嗯,

嗨,嗯,

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

谢谢,PM_Dialog

离线
最后看到:8个月2天前
加入:2018-04-19 13:53
嗨,对话框:

嗨,对话框:
我的意思是,如果我为字符设置了一个值(attmdb_att_set_value(…),我就使用浅蓝色来读取字符,我将得到一个十六进制值,否则它将返回“无值”,然后如果我按下“再次读取”按钮,它将再次读取遥控器,现在它将再次返回一个值,但该值等于第一个值。我想在浅蓝色每次读取字符值时设置或更改返回值。