如何在中央尝试读取特定特征时更改值?

⚠️
嗨,...感谢您来论坛。令人兴奋的消息!我们现在正在迁至我们的新论坛平台,将提供更好的功能,并包含在主对话框网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量 - 请发布任何新线程https://www.dialog-seminile.com/support.。我们将在未来几天修复错误/优化搜索和标记。
8个职位/0个新职位
最后一篇
HM.
离线
最后一次露面:7个月4周前
加入:2018-04-19 13:53
如何在中央尝试读取特定特征时更改值?

您好,对话框,我需要更新值当中心尝试读取特定特征的值时,我已经在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选项,我就不能成功地写值。

设备:
PM_DIALOG.
离线
最后一次露面:10小时41分钟前
职员
加入:2018-02-08 11:03
嗨,嗯,

嗨,嗯,

你能看看论坛上以前的帖子吗?

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.

HM.
离线
最后一次露面:7个月4周前
加入:2018-04-19 13:53
嗨对话框:

嗨对话框:
我有进一步的研究,我发现如果我加上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值。

PM_DIALOG.
离线
最后一次露面:10小时41分钟前
职员
加入:2018-02-08 11:03
嗨,嗯,

嗨,嗯,

在我的设置和修改了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.

HM.
离线
最后一次露面:7个月4周前
加入:2018-04-19 13:53
嗨,对话:

嗨,对话:
我们测试为您的代码,并发现只需更新客户端特征配置值(在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.
离线
最后一次露面:10小时41分钟前
职员
加入:2018-02-08 11:03
嗨,嗯,

嗨,嗯,

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

谢谢,PM_DIALOG.

PM_DIALOG.
离线
最后一次露面:10小时41分钟前
职员
加入:2018-02-08 11:03
嗨,嗯,

嗨,嗯,

客户端特性配置长度为2个字节,它们用于启用通知或指示。我无法理解你的意思是该属性总是有“没有价值”。如果属性值特性,最大长度为20字节(23 - 3 = 20bytes),没有MTU交换。没有问题,但请注意,属性值为20,因为您不使用MTU Exchange。

谢谢,PM_DIALOG.

HM.
离线
最后一次露面:7个月4周前
加入:2018-04-19 13:53
嗨,对话框:

嗨,对话框:
我的意思是,我用浅蓝色来读取字符,如果我为字符设置一个值(attmdb\u att\u set\u value(…)),我将得到一个十六进制值,否则它将返回“No value”,然后如果我按read again按钮,它将再次读取遥控器,现在它将再次返回一个值,但是这个值等于第一个值,我想设置或更改返回值,而浅蓝色每次都读取字符值。