两个 BLE实现数据传输

时间:2022-06-01 17:51:33


通过TI BLE 1.3.2 协议栈安装后的主从通信实验,实现两个 BLE节点的通信,主机向 BLE 从机发送一个字节,然后再把写入的字节读回来,以测试主从之间的通信。

SimpleBLECentral 主机编程:

在 Bluetooth-LE 低功耗蓝牙中有四种设备类型:Central 主机、Peripheral 从机、Observer 观察者、Broadcaster 广播者。通常 Central 和 Peripheral 一起使用。然后 Observer和 Broadcaster 一起使用。Central 和 Peripheral 连接后交换数据,我们平时使用到的基本上都是这个模式,而像多个温度采集器(一般用于智能家居),通常采用 Observer 和Broadcaster 这种无需连接的方式。

在工程的文件布局中,例如SimpleBLECentral工程中,左侧有很多文件夹,如 App、HAL、LIB 等,这些文件夹对应了 BLE 协议栈中不同的层,使用 BLE 协议栈进行应用程序的开发,一般只需要修改 App 目录下的文件即可。

在 APP 组下通常可以看到四个文件:
OSAL_xxx.c
xxx.c
xxx.h
xxx_Main.c
OSAL_xxx.c 和 xxx_Main.c 是 OSAL 系统抽象层的一部分代码,留给了用户自定义,比如用户任务函数的初始化,这里的用户任务函数可以理解为操作系统里的一个进程。而 xxx.c 和 xxx.h 是刚才提到的用户任务函数初始化的主体。具体的代码均在这里,通常,整个协议栈里需要我们修改的也只有这两个文件。TI 已经帮我们做好了大部分工作。

下面介绍simpleBLECentral.c 中的任务初始化函数:


GAPCentralRole_SetParameter 函数,设置 GAPCENTRALROLE_MAX_SCAN_RES(最大的扫描回应)为 8 个(272 行宏定义为 8),也就是说如果广播的从机超过了 9个,我们的 central 也只能扫描到先 RSP(回应) 的从机, 因此, 说明我们的主机最大能扫描到8个从机。

GATT_InitClient 函数,初始化 GATT Client,GATT 有 Service 和 Client之分, Service 作为服务端, GATT Client 提供 read/write 接口, Central 作为 Client,对 一 般 情 况 下 , Peripheral 作 为 Service , 所 以 主 机 Central 会 调 用GATT_WriteCharValue 或 者GATT_ReadCharValue 来和作为 Service 端的 Peripheral从机通信,而 Peripheral 需要通过notify 的方式,也就是调用 GATT_Notification 发起和主机的通信,在后面我们会详细介绍他们, 一般来说,Peripheral notify 的方式,速度要比直接读写的速度要慢 。


GATT_RegisterForInd 函 数 , 注 册 当 前 任 务 为 GATT 的 notify 和indicate 的接收端。也就是说当从机 Peripheral 通过 GATT_Notification 发来数据时,当前的任务函数会接收到消息,如果不注册,则无法接收。


RegisterForKeys,注册按键服务,当开发板上的五向按键或者 S1 按键被按下时,会发送按键消息,只有注册了按键服务的任务 id 才会接收到该消息。本主机例子中的按键回调函数为 simpleBLECentral_HandleKeys 函数。

osal_set_event,该函数会启动一个事件,这里是 START_DEVICE_EVT,也就是任务函数的开始运行的地方,由此,会正式转入系统的运行, 当系统运行后, 将最先执行  uint16 SimpleBLECentral_ProcessEvent( uint8 task_id, uint16events ) 函数,  if ( events & START_DEVICE_EVT ) 会为真。



simpleBLECentral.c 中的任务处理函数: