嗨
我修改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发送回发件人,并且发送者可以重复发送数据如果在某个时段之后无法获得ACK。”你能给我一些源代码参考吗?
这可以被视为状态机流,如果断开状态也会被改变,则将在断开状态(例如,准备重新连接)中进行相应的动作(而不是重新发送数据)。
谢谢,但我需要一个完整的例子。
da1458x_sdk \ 5.0.4 \ projects \ target_apps \ ble_example \ ble_app_all_in_one关于指示是不完整的。
从用户的角度来看,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外设发送到Central。毫无疑问,中央收到了数据。
布尔
宜宾
我用信息把我的数据发送到手机。
struct custs1_val_ind_req* req = KE_MSG_ALLOC_DYN(custs1_val_ind_req, TASK_CUSTS1, 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 =((指示)?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. con_info.)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. con_info.)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 Musts1_Val_ind_cfm:在user_catch_rest_hndl()中可以获得反馈结果。
不客气
“区别在于,指示有数据接收确认,而notify没有。”
但函数void user_catch_rest_hndl(ke_msg_id_t const msgs,void const * param,ke_task_id_t const dest_id,ke_task_id_t const src_id)
案例CUSTS1_VAL_NTF_CFM:struct musts1_val_ntf_cfm const * msg_param =(struct custs1_val_ntf_cfm const *)(param);
/// @ref custs1_val_ntf_cfm按摩的参数struct musts1_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.
感谢你的回复。
SO CUSTS1_VAL_IND_CFM与CUSTS1_VAL_NTF_CFM相同?custs1_val_ind_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,
为了确认数据是否收到,数据接收方可以将数据发送回发送方,发送方如果在一定时间后得不到确认,可以再次发送数据。
嗨PW_Dialog
谢谢你的支持。
如果断开连接,发送者向手机发送数据总是失败,那么从机将总是再次发送数据?还是断开连接,从机使用指示错误?
“要确认数据很好,数据接收器可以将ACK发送回发件人,并且发送者可以重复发送数据如果在某个时段之后无法获得ACK。”你能给我一些源代码参考吗?
嗨Lewuyouc,
这可以被视为状态机流,如果断开状态也会被改变,则将在断开状态(例如,准备重新连接)中进行相应的动作(而不是重新发送数据)。
嗨PW_Dialog
谢谢,但我需要一个完整的例子。
da1458x_sdk \ 5.0.4 \ projects \ target_apps \ ble_example \ ble_app_all_in_one关于指示是不完整的。
谢谢!
嗨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外设发送到Central。毫无疑问,中央收到了数据。
布尔
宜宾
嗨
我用信息把我的数据发送到手机。
“在发送上面的命令后,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 Musts1_Val_ind_cfm:在user_catch_rest_hndl()中可以获得反馈结果。
谢谢!
嗨Lewuyouc,
不客气
BR
CYibin
嗨
“区别在于,指示有数据接收确认,而notify没有。”
但函数void user_catch_rest_hndl(ke_msg_id_t const msgs,void const * param,ke_task_id_t const dest_id,ke_task_id_t const src_id)
案例CUSTS1_VAL_NTF_CFM:
struct musts1_val_ntf_cfm const * msg_param =(struct custs1_val_ntf_cfm const *)(param);
/// @ref custs1_val_ntf_cfm按摩的参数
struct musts1_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
感谢你的回复。
SO CUSTS1_VAL_IND_CFM与CUSTS1_VAL_NTF_CFM相同?custs1_val_ind_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.