本文共 1614 字,大约阅读时间需要 5 分钟。
BLE协议栈中的数据发送与接收机制
在之前的内容中,我们已经初步了解了BLE协议栈的基础知识。在本文中,我们将深入探讨数据的发送和接收过程。
一、数据发送
在BLE协议栈中,数据的发送主要分为两种情况:主机主动向从机发送数据,以及从机主动向主机发送数据。为了方便理解,我们可以将其简化为"主机向从机发送数据"和"从机向主机发送数据"两种情况。
要实现主机向从机发送数据,可以调用GATT_WriteCharValue函数。该函数接收三个参数:
在传输过程中,协议栈会自动处理与射频模块相关的操作,如开关天线、调节发射功率等。用户无需手动编写相关代码,仅需掌握如何使用GATT_WriteCharValue函数即可。
发送数据时,需要注意以下结构体:
typedef struct { uint16 handle; // 要写入的属性句柄(必须第一个) uint8 len; // 数据长度 uint8 value[ATT_MTU_SIZE-3]; // 存储数据的数组 uint8 sig; // 身份验证签名状态 uint8 cmd; // 命令标记} attWriteReq_t; 从机向主机发送数据时,不使用GATT_WriteCharValue函数,而是调用GATT_Notification函数。这种方式特别适用于串口透传等项目。在实现时,需要注意以下代码结构:
if (events & SYS_EVENT_MSG) { uint8 *pMsg = osal_msg_receive(simpleBLETaskId); if (pMsg != NULL) { simpleBLECentral_ProcessOSALMsg((osal_event_hdr_t *)pMsg); osal_msg_deallocate(pMsg); }} 二、数据接收
与数据发送类似,数据接收也分为两种情况:主机接收从机发送的数据,以及从机接收主机发送的数据。
在接收过程中,可以使用GATT_ReadCharValue函数。传递的参数包括:
对应的结构体定义如下:
typedef struct { uint16 handle; // 要读取的属性句柄(必须第一个)} attReadReq_t; 从机会通过GATT Profile Callback接收来自主机的数据。在从机初始化时,需要向Profile注册回调函数。
三、代码分析
在实际开发中,接收到数据后,需要进行以下处理:
if (events & SYS_EVENT_MSG) { uint8 *pMsg = osal_msg_receive(simpleBLETaskId); if (pMsg != NULL) { simpleBLECentral_ProcessOSALMsg((osal_event_hdr_t *)pMsg); osal_msg_deallocate(pMsg); }} 具体处理逻辑包括:
通过上述机制,应用程序可以接收到从机发送的数据,并进行相应处理。整个过程主要依赖于BLE协议栈的自动化处理,开发者无需手动完成复杂操作。
注:本文内容基于实际项目经验总结,旨在为开发者提供实用指导。
转载地址:http://nkyz.baihongyu.com/