博客
关于我
蓝牙4.0 BLE 数据传输 (二)
阅读量:87 次
发布时间:2019-02-26

本文共 1614 字,大约阅读时间需要 5 分钟。

BLE协议栈中的数据发送与接收机制

在之前的内容中,我们已经初步了解了BLE协议栈的基础知识。在本文中,我们将深入探讨数据的发送和接收过程。

一、数据发送

在BLE协议栈中,数据的发送主要分为两种情况:主机主动向从机发送数据,以及从机主动向主机发送数据。为了方便理解,我们可以将其简化为"主机向从机发送数据"和"从机向主机发送数据"两种情况。

  • 主机向从机发送数据
  • 要实现主机向从机发送数据,可以调用GATT_WriteCharValue函数。该函数接收三个参数:

    • 连接句柄(connection handle)
    • 要发送的数据包
    • 任务ID(task ID)

    在传输过程中,协议栈会自动处理与射频模块相关的操作,如开关天线、调节发射功率等。用户无需手动编写相关代码,仅需掌握如何使用GATT_WriteCharValue函数即可。

    发送数据时,需要注意以下结构体:

    typedef struct {    uint16 handle;      // 要写入的属性句柄(必须第一个)    uint8 len;        // 数据长度    uint8 value[ATT_MTU_SIZE-3]; // 存储数据的数组    uint8 sig;       // 身份验证签名状态    uint8 cmd;       // 命令标记} attWriteReq_t;
    1. 从机向主机发送数据
    2. 从机向主机发送数据时,不使用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);    }}

      二、数据接收

      与数据发送类似,数据接收也分为两种情况:主机接收从机发送的数据,以及从机接收主机发送的数据。

    3. 主机接收来自从机的数据
    4. 在接收过程中,可以使用GATT_ReadCharValue函数。传递的参数包括:

      • 连接句柄(connection handle)
      • 属性句柄(characteristic handle)
      • 任务ID(task ID)

      对应的结构体定义如下:

      typedef struct {    uint16 handle; // 要读取的属性句柄(必须第一个)} attReadReq_t;
      1. 从机接收主机发来的数据
      2. 从机会通过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);    }}

        具体处理逻辑包括:

      3. 检查连接状态
      4. 判断消息类型(读响应/错误响应)
      5. 提取并显示数据
      6. 通过上述机制,应用程序可以接收到从机发送的数据,并进行相应处理。整个过程主要依赖于BLE协议栈的自动化处理,开发者无需手动完成复杂操作。

        注:本文内容基于实际项目经验总结,旨在为开发者提供实用指导。

    转载地址:http://nkyz.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现Dinic算法(附完整源码)
    查看>>
    Objective-C实现disjoint set不相交集算法(附完整源码)
    查看>>
    Objective-C实现DisjointSet并查集的算法(附完整源码)
    查看>>
    Objective-C实现djb2哈希算法(附完整源码)
    查看>>
    Objective-C实现DNF排序算法(附完整源码)
    查看>>
    Objective-C实现double factorial iterative双阶乘迭代算法(附完整源码)
    查看>>
    Objective-C实现double factorial recursive双阶乘递归算法(附完整源码)
    查看>>
    Objective-C实现double hash双哈希算法(附完整源码)
    查看>>
    Objective-C实现double linear search recursion双线性搜索递归算法(附完整源码)
    查看>>
    Objective-C实现DoublyLinkedList双链表的算法(附完整源码)
    查看>>
    Objective-C实现DPLL(davisb putnamb logemannb loveland)算法(附完整源码)
    查看>>
    Objective-C实现Edmonds-Karp算法(附完整源码)
    查看>>
    Objective-C实现EEMD算法(附完整源码)
    查看>>
    Objective-C实现EM算法(附完整源码)
    查看>>
    Objective-C实现EM算法(附完整源码)
    查看>>
    Objective-C实现entropy熵算法(附完整源码)
    查看>>
    Objective-C实现euclidean distance欧式距离算法(附完整源码)
    查看>>
    Objective-C实现Euclidean GCD欧几里得最大公约数算法(附完整源码)
    查看>>
    Objective-C实现euclideanDistance欧氏距离算法(附完整源码)
    查看>>
    Objective-C实现euler method欧拉法算法(附完整源码)
    查看>>