嗨
我修改DA1458x_SDK \ 5.0.4 \ \ target_apps \ ble_examples \ prox_reporter项目。
请解释prox_reporter项目中指示和通知的区别。
说明是如何解决丢包问题。
请告诉我显示功能的调用过程。
谢谢!
嗨lewuyouc,
区别是指示有接收数据的确认,而通知没有。
嗨PW_Dialog
DA1458x_SDK\5.0.4\projects\target_apps\ble_examples\prox_reporter如何确认数据接收?
如果发送失败,如何解决?
谢谢
为了确认数据是否被接收,数据接收方可以将数据发送回给发送方,如果发送方在一定的时间内没有收到ack,则可以重新发送数据。
谢谢你的支持。
如果断开连接,发送者发送数据到电话总是失败,所以从属总是再次发送数据?或断开连接,slave使用指示错误?
为了确认数据接收良好,数据接收方可以将数据发送回给发送方,发送方如果在一定的时间内没有收到ack,可以重复发送数据。“你能给我一些源代码参考吗?”
这可以看作是一个状态机流程,如果断开连接,状态也会改变,那么相应的操作(而不是重发数据)将在断开状态下执行(例如准备重新连接)。
谢谢,但我需要一个完整的例子。
DA1458x_SDK\5.0.4\projects\target_apps\ble_examples\ble_app_all_in_one about indication是不完整的。
从用户的角度来看,IND和NOTF没有任何区别。用户所能做的只是向SDK发送一个命令,然后等待它的反馈。用户无法看到进程的源代码。
要发送NOTF,需要将带有GATTC_NOTIFY参数的GATTC_SEND_EVT_CMD从用户层发送到SDK层。
要发送一个IND,带有GATTC_INDICATE参数的GATTC_SEND_EVT_CMD从用户层发送到SDK层。
以上命令发送后,SDK层会将结果反馈给用户层:
对于NOTF, NO_ERROR状态意味着数据已经从BLE外设发送。我们不知道BLE中心是否收到了。
对于IND, NO_ERROR状态意味着数据已经从BLE外设发送到中心。毫无疑问,数据已经被中央接收。
Br
宜宾
我使用信息发送我的数据到电话。
struct custs1_val_ind_req* req = KE_MSG_ALLOC_DYN(custs1_val_ind_req, task_cust1, TASK_APP, custs1_val_ind_req, DEF_CUST1_INDICATEABLE_CHAR_LEN);申请- > conhdl = app_env - > conhdl;申请- >处理= CUST1_IDX_INDICATEABLE_VAL;申请- >长度= DEF_CUST1_INDICATEABLE_CHAR_LEN;memcpy(请求- >值、&status_value DEF_CUST1_INDICATEABLE_CHAR_LEN);ke_msg_send(要求的);
发出以上命令后,SDK层会将结果反馈给用户层:“我不知道如何得到结果。”
要将数据发送到sdk层,你可以在sdk中找到以下API:
void prf_server_send_event(prf_env_struct *p_env, bool indication, uint16_t handle){//分配GATT通知消息struct gattc_send_evt_cmd *req = KE_MSG_ALLOC(gattc_send_evt_cmd, KE_BUILD_ID(TASK_GATTC,p_env->con_info.conidx), p_env->con_info.conidx);prf_id gattc_send_evt_cmd);//填写参数结构req->req_type = ((indication) ?GATTC_INDICATE: GATTC_NOTIFY);申请- >处理=处理;//发送事件ke_msg_send(req);}
要在发送数据后从SDK层获得结果,你可以在回调函数中处理gattc_cmp evet:
static int gattc_cmp_evt_handler(ke_msg_id_t const msgid, struct gattc_cmp_evt const *param, ke_task_id_t const dest_id, ke_task_id_t const src_id) {if (param->req_type == GATTC_NOTIFY){//通知应用程序通知PDU已经通过空中发送。struct custs1_val_ntf_cfm *cfm = KE_MSG_ALLOC(custs1_val_ntf_cfm, custs1_env.con_info. cfm);appid custs1_env.con_info。prf_id custs1_val_ntf_cfm);cfm - >处理= custs1_env.ntf_handle;cfm - > conhdl = gapc_get_conhdl (custs1_env.con_info.conidx);cfm - >状态=参数- >状态;ke_msg_send (cfm);} else if (param->req_type == GATTC_INDICATE){//通知应用程序指示已被对端设备确认。struct custs1_val_ind_cfm *cfm = KE_MSG_ALLOC(custs1_val_ind_cfm, custs1_env.con_info. conf);appid custs1_env.con_info。prf_id custs1_val_ind_cfm); cfm->handle = custs1_env.ind_handle; cfm->conhdl = gapc_get_conhdl(custs1_env.con_info.conidx); cfm->status = param->status; ke_msg_send(cfm); } return (KE_MSG_CONSUMED); }
BR
CYibin
嗨CYibin
Void user_catch_rest_hndl(ke_msg_id_t const msgid,空白const *参数,ke_task_id_t const dest_id,ke_task_id_t const src_id)
case CUSTS1_VAL_IND_CFM:在user_catch_rest_hndl()中可以得到反馈结果。
不客气
“区别是指示有数据接收确认,而通知没有。”
但是函数void user_catch_rest_hndl(ke_msg_id_t const msgid, void const *param, ke_task_id_t const dest_id,ke_task_id_t const src_id)
案例CUSTS1_VAL_NTF_CFM:Struct custs1_val_ntf_cfm const *msg_param = (Struct custs1_val_ntf_cfm const *)(param);
/// @ref CUSTS1_VAL_NTF_CFM信息的参数struct custs1_val_ntf_cfm{/ / /连接句柄uint16_t conhdl;///已更新属性的句柄uint16_t处理;/ / /确认状态uint8_t状态;};
为什么我们可以得到通知反馈状态?
如果通知发送成功,则msg_param->status=0x00,否则msg_param->status=0x8B。
通知也可以确认数据接收吗?
嗨lewuyouc
是的,PW_Dialog是正确的,不同的是,指示有数据接收的确认,但通知没有。CUSTS1_VAL_NTF_CFM是来自堆栈的确认,您已成功将CUSTS1_VAL_NTF_REQ消息推入BLE堆栈。这不是来自中央的数据已成功接收的确认。每当您发送一个通知时,您将获得CUSTS1_VAL_NTF_CFM(用于自定义概要文件),一旦您得到这个,您将知道刚刚发送的通知将被传递到中央,因此您可以直接放置第二个通知。你将不得不等待CUSTS1_VAL_NTF_CFM到达之前发送的下一个通知相同的特点,如果不是您将更新值的数据库与后者价值时,内核将通知到缓冲与相同的值,它将把两个通知因为通知的值是从数据库中获取的。如果你发现其中任何一个答案有用,请标记为“接受”。
谢谢,PM_Dialog
谢谢你的回复。
CUSTS1_VAL_IND_CFM和CUSTS1_VAL_NTF_CFM一样吗?确保发送下一个事件。
请告诉我,我的ble设备如何知道手机接收数据成功?
期待您的回复!
为了确认接收数据,可以使用指示而不是通知。首先,指示是从外围设备(就像通知一样,但当值到达外围设备时需要应用程序确认)而不是从中心设备开始的,因此外围设备只能向中心发送指示,而不是反过来。为了从外设你只需要发送一个信号从您的应用程序发送消息,中央不读indicatable价值,它只是表明价值中心的外围,中央就确认他收到消息从外围发送。当您发送一个指示时,您应该发出一个GATTC_SEND_EVT_CMD,并且该消息应该有一个GATTC_CMP_EVT作为响应。之后,GATTC_CMP_EVT将从custs1_task.c触发gattc_cmp_evt_handler()。请注意,当中央确认指示已被正确接收时,指示将被触发。为了了解如何声明可公诉特性,请查看SDK的ble_app_peripheral示例。
谢谢,我会试试看的。
可以使用malloc()函数吗?我需要建立一个长链接。
我能理解你想要完成什么,但是你可以利用它。您也可以使用ke_malloc。
嗨lewuyouc,
区别是指示有接收数据的确认,而通知没有。
嗨PW_Dialog
DA1458x_SDK\5.0.4\projects\target_apps\ble_examples\prox_reporter如何确认数据接收?
如果发送失败,如何解决?
谢谢
嗨lewuyouc,
为了确认数据是否被接收,数据接收方可以将数据发送回给发送方,如果发送方在一定的时间内没有收到ack,则可以重新发送数据。
嗨PW_Dialog
谢谢你的支持。
如果断开连接,发送者发送数据到电话总是失败,所以从属总是再次发送数据?或断开连接,slave使用指示错误?
为了确认数据接收良好,数据接收方可以将数据发送回给发送方,发送方如果在一定的时间内没有收到ack,可以重复发送数据。“你能给我一些源代码参考吗?”
嗨lewuyouc,
这可以看作是一个状态机流程,如果断开连接,状态也会改变,那么相应的操作(而不是重发数据)将在断开状态下执行(例如准备重新连接)。
嗨PW_Dialog
谢谢,但我需要一个完整的例子。
DA1458x_SDK\5.0.4\projects\target_apps\ble_examples\ble_app_all_in_one about indication是不完整的。
谢谢!
嗨lewuyouc,
从用户的角度来看,IND和NOTF没有任何区别。用户所能做的只是向SDK发送一个命令,然后等待它的反馈。用户无法看到进程的源代码。
要发送NOTF,需要将带有GATTC_NOTIFY参数的GATTC_SEND_EVT_CMD从用户层发送到SDK层。
要发送一个IND,带有GATTC_INDICATE参数的GATTC_SEND_EVT_CMD从用户层发送到SDK层。
以上命令发送后,SDK层会将结果反馈给用户层:
对于NOTF, NO_ERROR状态意味着数据已经从BLE外设发送。我们不知道BLE中心是否收到了。
对于IND, NO_ERROR状态意味着数据已经从BLE外设发送到中心。毫无疑问,数据已经被中央接收。
Br
宜宾
嗨
我使用信息发送我的数据到电话。
发出以上命令后,SDK层会将结果反馈给用户层:“我不知道如何得到结果。”
谢谢!
嗨lewuyouc,
要将数据发送到sdk层,你可以在sdk中找到以下API:
要在发送数据后从SDK层获得结果,你可以在回调函数中处理gattc_cmp evet:
BR
CYibin
嗨CYibin
谢谢你的支持。
Void user_catch_rest_hndl(ke_msg_id_t const msgid,
空白const *参数,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
case CUSTS1_VAL_IND_CFM:在user_catch_rest_hndl()中可以得到反馈结果。
谢谢!
嗨lewuyouc,
不客气
BR
CYibin
嗨
“区别是指示有数据接收确认,而通知没有。”
但是函数void user_catch_rest_hndl(ke_msg_id_t const msgid, void const *param, ke_task_id_t const dest_id,ke_task_id_t const src_id)
案例CUSTS1_VAL_NTF_CFM:
Struct custs1_val_ntf_cfm const *msg_param = (Struct custs1_val_ntf_cfm const *)(param);
/// @ref CUSTS1_VAL_NTF_CFM信息的参数
struct custs1_val_ntf_cfm
{
/ / /连接句柄
uint16_t conhdl;
///已更新属性的句柄
uint16_t处理;
/ / /确认状态
uint8_t状态;
};
为什么我们可以得到通知反馈状态?
如果通知发送成功,则msg_param->status=0x00,否则msg_param->status=0x8B。
通知也可以确认数据接收吗?
嗨lewuyouc
是的,PW_Dialog是正确的,不同的是,指示有数据接收的确认,但通知没有。CUSTS1_VAL_NTF_CFM是来自堆栈的确认,您已成功将CUSTS1_VAL_NTF_REQ消息推入BLE堆栈。这不是来自中央的数据已成功接收的确认。每当您发送一个通知时,您将获得CUSTS1_VAL_NTF_CFM(用于自定义概要文件),一旦您得到这个,您将知道刚刚发送的通知将被传递到中央,因此您可以直接放置第二个通知。你将不得不等待CUSTS1_VAL_NTF_CFM到达之前发送的下一个通知相同的特点,如果不是您将更新值的数据库与后者价值时,内核将通知到缓冲与相同的值,它将把两个通知因为通知的值是从数据库中获取的。如果你发现其中任何一个答案有用,请标记为“接受”。
谢谢,PM_Dialog
嗨PW_Dialog
谢谢你的回复。
CUSTS1_VAL_IND_CFM和CUSTS1_VAL_NTF_CFM一样吗?确保发送下一个事件。
请告诉我,我的ble设备如何知道手机接收数据成功?
期待您的回复!
嗨lewuyouc,
为了确认接收数据,可以使用指示而不是通知。首先,指示是从外围设备(就像通知一样,但当值到达外围设备时需要应用程序确认)而不是从中心设备开始的,因此外围设备只能向中心发送指示,而不是反过来。为了从外设你只需要发送一个信号从您的应用程序发送消息,中央不读indicatable价值,它只是表明价值中心的外围,中央就确认他收到消息从外围发送。当您发送一个指示时,您应该发出一个GATTC_SEND_EVT_CMD,并且该消息应该有一个GATTC_CMP_EVT作为响应。之后,GATTC_CMP_EVT将从custs1_task.c触发gattc_cmp_evt_handler()。请注意,当中央确认指示已被正确接收时,指示将被触发。为了了解如何声明可公诉特性,请查看SDK的ble_app_peripheral示例。
谢谢,PM_Dialog
嗨PW_Dialog
谢谢,我会试试看的。
可以使用malloc()函数吗?我需要建立一个长链接。
嗨lewuyouc,
我能理解你想要完成什么,但是你可以利用它。您也可以使用ke_malloc。
谢谢,PM_Dialog