您好,对话框,我需要更新值当中心尝试读取特定特征的值时,我已经在user\u custs1\u def.c文件的数据库定义中应用了RI选项,如下所示:
//时间特征值
[SVC1\u IDX\u TIME\u VAL]={
svc1_time_uuid_128,att_uuid_128_len,perm(rd,启用)| perm(wr,启用)|perm(write_req,启用),
PERM(RI,ENABLE)| DEF|u SVC1|u TIME|u CHAR|LEN
},
但我仍然没有在cust1_task.c文件中捕获gattc_read_req_ind_handler()函数上的msg。
此外,我发现如果我应用RI选项,我就不能成功地写值。
设备:
嗨,嗯,
你能看看论坛上以前的帖子吗?
https://support.dialog-semicondiondiondimicon.com/forums/post/dialog-smartbond-bluetooth-low-energy-%2%80%93-software/changing-value-database-dinamamly
我跟随那篇文章,在ADC1特性的值中添加PERM(RI,ENABLE)。通过这样做,我能够在尝试读取ADC值1特征时触发cust1\u task.h的gattc\u read\u req\u ind\u handler()函数。我建议您检查DISS配置文件的实现,该配置文件使用类似的选项,并且在读取DISS特性时是否触发DISS\U task.h的gattc\u read\u req\u ind\u handler()函数。
谢谢,PM_DIALOG.
嗨对话框:
我有进一步的研究,我发现如果我加上PERM(RI,ENABLE),问题是我只能一旦触发gattc\u read\u req\u ind\u handler()函数,如果我再次读取,它不会触发。更重要的问题是如果我试图执行attmdb_att_set_value(...)函数,它将返回0x06的状态(att_err_request_not_supported.)。这意味着,如果我的CharoStory应用程序写入权限如此:PERM(RD,ENABLE)| PERM(WR,ENABLE)|perm(write_req,启用),我无法设置charodoratival值。
嗨,嗯,
在我的设置和修改了ADC值特征,并添加了您提到的额外权限,我看不出您在帖子中提到了什么。需要说明的是,SDK端没有处理此类事务的实现,这意味着您将必须处理gattc\u read\u req\u ind\u handler()中的代码,因为SDK概要文件不会向应用程序传递任何消息,以便知道有人从该特定特征中读取。那么,关于回调只发生一次的事实,您如何确定这一点呢?你在使用断点吗?如果断点命中一次,则链路将丢失,而另一侧的中心将延迟监控超时,直到它意识到无法找到从机并发出断开连接。如果gattc\u read\u req\u ind\u handler()在一次读取之后没有发生,那么设备将在30秒后断开连接(我认为您的情况不是这样),断开连接的原因是从设备的确认消息不会被发送。在SDK的情况下,情况并非如此,因为当您启用RI特性时,您总是会得到从属响应,即使这是由于处理RI情况的不完整的自定义配置文件导致的错误。所以我相信回调会发生,在我这边测试过。关于attmdb\u att\u set\u value(),您不需要这样做,我假设您想要实现的是,每次您得到一个read指示时,您都希望向master发送一个不同的值,因此为了做到这一点,您必须在gattc\u read\u req\u ind\u handler()回调上实现它,这意味着一旦触发gattc\u read\u req\u ind\u handler(),您就应该执行任何您想要计算该值的任务,然后分配并发送一个gattc\u read\u CFM消息,该消息将包含您想要发送给主控器的值(该值应该复制到CFM->value struct)。请检查下面的例子。
cfm=KE\u MSG\u ALLOC\u DYN(GATTC\u READ\u cfm,src\u id,dest\u id,GATTC\u READ\u cfm,length);
cfm-> handle = param->手柄;
cfm-> status = gap_err_no_error;
cfm->长度=2;
if(status == gap_err_no_error)
{
测试++;
memcpy(cfm->value,&test,2);
}
KE_MSG_SEND(CFM);
测试是一个全局变量,每次读取特定特征时都应增加该变量。
谢谢,PM_DIALOG.
嗨,对话:
我们测试为您的代码,并发现只需更新客户端特征配置值(在LightBlue时测试)和属性值始终“无值”。
根据gattc\u read\u req\u ind\u handler(custs1\u task)中的代码,要更新的值来自custs1\u get\u ccc\u value(conidx,att\u idx),它的长度总是2,但是
属性值可以只要20.IS有问题?
gattc_read_req_ind_handler的一些代码:
//如果找到属性,则状态为GAP\u ERR\u NO\u ERROR
if(status == gap_err_no_error)
{
const struct cust_prf_func_callbacks * callbacks = custs_get_func_callbacks(task_id_custs1);
if(回调->att\u db[att\u idx].uuid\u size==att\u uuid\u 16\u LEN&&
*(UINT16_T *)回调 - > ATT_DB [ATT_IDX] .uuuid == ATT_DESC_CLIENT_CHAR_CHAR_CHAR_CHAR)
{
ccc_val = custs1_get_ccc_value(conidx,att_idx);
长度= 2;
}
别的
{
status = prf_app_error;
}
}
//发送读取响应
cfm=KE\u MSG\u ALLOC\u DYN(GATTC\u READ\u cfm,src\u id,dest\u id,GATTC\u READ\u cfm,length);
cfm-> handle = param->手柄;
cfm-> status = status;
cfm->长度=长度;
if(status == gap_err_no_error)
{
Memcpy(CFM->值,&CCC_Val,长度);
}
KE_MSG_SEND(CFM);
嗨,嗯,
让我试着检查并复制你的问题,我会尽快通知你。
谢谢,PM_DIALOG.
嗨,嗯,
客户端特性配置长度为2个字节,它们用于启用通知或指示。我无法理解你的意思是该属性总是有“没有价值”。如果属性值特性,最大长度为20字节(23 - 3 = 20bytes),没有MTU交换。没有问题,但请注意,属性值为20,因为您不使用MTU Exchange。
谢谢,PM_DIALOG.
嗨,对话框:
我的意思是,我用浅蓝色来读取字符,如果我为字符设置一个值(attmdb\u att\u set\u value(…)),我将得到一个十六进制值,否则它将返回“No value”,然后如果我按read again按钮,它将再次读取遥控器,现在它将再次返回一个值,但是这个值等于第一个值,我想设置或更改返回值,而浅蓝色每次都读取字符值。