在http://support.dialog-semicondiondiond.com/resource/gatt-interface-pecific ...,我可以阅读以下内容以获取通知:
“发送通知:req_type应设置为gattc_notify。一旦通知PDU已通过空中发送通知PDU,就会发送GattC_CMP_EVT消息。”
但是,我怀疑这是真相。在我的代码中,我一次发送一个通知,并且在gattc_cmp_evt到达之后发送下一个通知(这应该指示先前的通知PDU已通过空中发送)。但在SmartSnippets中,我可以看到在单个连接间隔期间并使用嗅探器发送多个通知,我也看到越多的数据标志在除了最后一个通知之外的所有通知中都设置为true。但如果我在通过空中发送之后发送下一个通知,那么该标志可能会设置为true,因为它当时我将发送另一个通知时不知道。
我的问题是,何时是GattC_CMP_EVT消息真的是什么?也许当通知已经放入一些BLE TX缓冲区时?
关键词:
设备:
嗨Joacimwe,
抱歉耽搁了。我得到了以下建议。最初只存储最后一个PDU。
较大的字体部分反映了我们的变化:
/ **
****************************************************************************************
* @brief处理@ref gatt_write_cmd_ind消息的接收。
* @param [in]收到的消息的msgid ID(可能未使用)。
* @param [in] param指向消息的参数。
* @param [in]接收任务实例的dest_id ID(可能未使用)。
* @param [in]发送任务实例的src_id ID。
* @return如果邮件被消耗或不。
****************************************************************************************
* /
静态UINT8_T Sample128_1_Buffer [200];
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
{
uint8_t char_code = sample128_err_char;
uint8_t status = prf_app_error;
if(ke_idx_get(src_id)== sample128_env.con_info.conidx)
{
if(param-> handle == sample128_env.sample128_shdl + sample128_1_idx_val)
{
char_code = sample128_1_char;
}
if(param-> handle == sample128_env.sample128_shdl + sample128_2_idx_cfg)
{
char_code = sample128_2_cfg;
}
if(char_code == sample128_1_char)
{
//保存缓冲区中的值
memcpy(&sample128_1_buffer [param-> offset],&param->值[0],param->长度);
如果(param->最后)
{
sample128_send_val((uint8_t *)和sample128_1_buffer [0],param-> offset + param->长度);
attmdb_att_set_value(param->句柄,param-> offset + param->长度,(uint8_t *)和sample128_1_buffer [0]);
}
status = prf_err_ok;
}
否则if(char_code == sample128_2_cfg)
{
//书面价值
uint16_t ntf_cfg;
//在检查前提取值
ntf_cfg = co_read16p(&param-> value [0]);
//仅更新配置如果停止或通知启用的值
if((ntf_cfg == prf_cli_stop_ntfind)||(ntf_cfg == prf_cli_start_ntf))
{
//保存DB中的值
attmdb_att_set_value(param->句柄,sizeof(uint16_t),(uint8_t *)和param->值[0]);
//保存环境中的信息
if(ntf_cfg == prf_cli_start_ntf)
{
// ntf cfg bit设置为1
sample128_env.feature | = prf_cli_start_ntf;
}
别的
{
// ntf cfg bit设置为0
sample128_env.feature&=〜prf_cli_start_ntf;
}
status = prf_err_ok;
}
}
}
//发送写回复
ATTS_WRITE_RSP_SEND(Sample128_ENV.CON_INFO.CONIDX,PARAM->句柄,状态);
return(ke_msg_consumed);
}
对不起,但是与我关于通知和Gattc_cmp_evt的问题有关的碎片写作?
是的,你是对的。实际上在处理ble堆栈中,gattc_cmp_evt将在PDU包装时发送并提交给L2CC任务发送,不要等到PDU真的发出。因此,在到达下一个可传播的连接事件之前,可能多个PDU正在等待传输,并且它们将在一个连接事件中发送。
最好的问候,RVA
谢谢