CC2640R2F BLE5.0 蓝牙协议栈GAPRole 任务
来源:互联网 发布:淘宝代付一天多少次 编辑:程序博客网 时间:2024/05/23 23:42
GAPRole 任务
GAP层始终处于下面4种角色之一运行:
- Broadcaster(广播者):设备发送不可连接的广播。
- Observer(观察者):设备扫描广播但无法启动连接。
- Peripheral(外围设备):该设备是可连接的广播,并在单一链路层连接中作为从设备运行。
- Central(中央设备):设备扫描广告并启动连接,并在单个或多个链路层连接中作为主服务器运行。蓝牙低功耗中央协议栈支持多达三个并发连接。
蓝牙核心规范5.0版允许多角色,这是由蓝牙低功耗协议栈所支持的某些组合。也就是说一个设备可以同时作为中央和外围设备,这其实就是蓝牙组网的基础。
注意:一般Broadcaster和Observer作为一组设备使用,Peripheral和Central作为一组设备使用。比如一个温度计,它作为broadcaster每隔1S 发送一次温度值,然后一个显示器作为observer不断的接收广播并显示,但是不连接,只显示温度值。或者peripheral作为一个计步器,手机作为一个central,他们之间需要建立连接之后再进行数据传输。
下面我们以peripheral Role和central Role来进行说明
peripheral Role
外设GAPRole任务在peripheral.c和peripheral.h中定义。有关完整的API外设角色API,请参阅BLE Stack API参考,包括命令,可配置参数,事件和回调。使用此模块的步骤如下:
- 初始化GAPRole参数,这部分代码在simple_peripheral.c的SimpleBLEPeripheral_init中能够找到。
// Setup the GAP Peripheral Role Profile { uint8_t initialAdvertEnable = TRUE; uint16_t advertOffTime = 0; uint8_t enableUpdateRequest = DEFAULT_ENABLE_UPDATE_REQUEST; uint16_t desiredMinInterval = DEFAULT_DESIRED_MIN_CONN_INTERVAL; uint16_t desiredMaxInterval = DEFAULT_DESIRED_MAX_CONN_INTERVAL; uint16_t desiredSlaveLatency = DEFAULT_DESIRED_SLAVE_LATENCY; uint16_t desiredConnTimeout = DEFAULT_DESIRED_CONN_TIMEOUT; // Set the GAP Role Parameters GAPRole_setParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t),&initialAdvertEnable); GAPRole_setParameter(GAPROLE_ADVERT_OFF_TIME, sizeof(uint16_t), &advertOffTime); GAPRole_setParameter(GAPROLE_SCAN_RSP_DATA,sizeof(scanRspData), scanRspData); GAPRole_setParameter(GAPROLE_ADVERT_DATA, sizeof(advertData), advertData); GAPRole_setParameter(GAPROLE_PARAM_UPDATE_ENABLE,sizeof(uint8_t), &enableUpdateRequest); GAPRole_setParameter(GAPROLE_MIN_CONN_INTERVAL,sizeof(uint16_t), &desiredMinInterval); GAPRole_setParameter(GAPROLE_MAX_CONN_INTERVAL,sizeof(uint16_t), &desiredMaxInterval); GAPRole_setParameter(GAPROLE_SLAVE_LATENCY, sizeof(uint16_t), &desiredSlaveLatency); GAPRole_setParameter(GAPROLE_TIMEOUT_MULTIPLIER,sizeof(uint16_t), &desiredConnTimeout); }
上述代码使能了广播,设置了广播关闭时间,这里advertOffTime是0,就是一直进行广播。设置广播响应数据,设置广播数据,设置参数更新请求,设置广播连接间隔,设置广播从机延迟,设置连接超时。
- 初始化GAPRole任务并将应用程序回调函数传递给GAPRole。这也应该在simple_peripheral.c的SimpleBLEPeripheral_init中能够找到。其目的是当设备状态改变的时候进行响应,设备一旦改变都会通过这个回调函数改变event。然后SimpleBLEPeripheral_taskFxn里面一直在检测event事件的状态,发现状态改变则进行一些任务处理。
`VOID GAPRole_StartDevice (&SimpleBLEPeripheral_gapRoleCBs );`
- 回调函数注册并初始化之后我们就能在应用程序接收GAPRole命令了,下面是使用GAPRole_terminateConnection()的程序上下文示意图。
上图中可以看出应用程序直接调用GAPRole层API GAPRole_TerminateConnection(),GAPRole负责和协议栈通讯,然后接收到协议栈返回的状态之后又通过回调函数发送给应用程序,应用程序接收到状态之后再进行自己的逻辑处理。
注意:返回值仅指示终止连接的尝试是否成功启动。连接终止实际是异步返回,并通过上面注册的回调传递给应用程序。
- GAPRole任务处理从协议栈传递给它的大多数GAP相关事件。GAPRole任务还将一些事件转发到应用程序(例如上面的GAPROLE_WAITING)。当链接终止时,GAPRole会自动重新启动广播。以下代码片段可以在peripheral.c中找到
case GAP_LINK_TERMINATED_EVENT: { //....... //....... //....... // If device was advertising when connection dropped if (gapRole_AdvNonConnEnabled) { // Continue advertising. gapRole_state = GAPROLE_ADVERTISING_NONCONN; } // Else go to WAITING state. else { if(pPkt->reason == LL_SUPERVISION_TIMEOUT_TERM) { gapRole_state = GAPROLE_WAITING_AFTER_TIMEOUT; } else { gapRole_state = GAPROLE_WAITING; } // Start advertising, if enabled. gapRole_setEvent(START_ADVERTISING_EVT); } } break;
central Role
GAPRole中心任务在central.c和central.h中定义。有关完整的中央角色API,请参阅BLE Stack API参考,包括命令,可配置参数,事件和回调。有关实现中央GAPRole的示例,请参阅simple_central示例项目。使用此模块的步骤如下。
- 初始化GAPRole参数。这种初始化应该在应用程序初始化函数中出现(例如in SimpleBLECentral_init)。也可以在此初始化功能中设置GAP参数。
// Setup Central Profile { uint8_t scanRes = DEFAULT_MAX_SCAN_RES ; GAPCentralRole_SetParameter (GAPCENTRALROLE_MAX_SCAN_RES , sizeof (uint8_t ), &scanRes ); }
相比较peripheral Role,central Role的参数设置就很少了,只需要设置最大扫描响应数量。在程序中设置的8,也就是最多能接收8个外围设备的广播响应。
- 启动GAPRole任务。这涉及将应用程序回调函数的函数指针传递给Central GAPRole。这也应该在应用程序初始化函数中出现。和peripheral Role类似,协议栈返回一些事件,GAPRole在通过回调函数异步返回给应用程序。
`VOID GAPCentralRole_StartDevice (&SimpleBLECentral_roleCB );`
- 从应用程序发送GAPRole命令。下图是使用GAPCentralRole_StartDiscovery()的应用程序上下文。
上图中可以看出应用程序直接调用GAPRole层API CAPCrentralRole_StartDiscovery(),GAPRole负责和协议栈通讯,然后接收到协议栈返回的状态之后又通过回调函数发送给应用程序,应用程序接收到状态之后再进行自己的逻辑处理。
注意:返回值仅指示是否启动了设备发现的尝试。发现的实际设备以GAP_DEVICE_INFO_EVENT异步方式返回,并通过上面注册的回调传递给应用程序。
请注意,在扫描期间,如蓝牙核心规范版本5.0所定义,单个广播/扫描响应将返回为GAP_DEVICE_INFO_EVENT。默认情况下,重复的报告被过滤,以便每个唯一地址和数据对只有一个事件返回给应用程序。这可以通过TGAP_FILTER_ADV_REPORTS配置。扫描完成后,发现的报告将作为GAP_DEVICE_DISCOVERY_EVENT返回给应用程序。
可以使用GAPCENTRALROLE_MAX_SCAN_RES参数设置在一次扫描期间可以发现的最大扫描响应量。如果在充斥着广播的环境中,这可能会对堆的使用产生重大影响,从而潜在地破坏堆栈。因此,对于在扫描期间发现最大扫描响应量的情况,必须对应用程序进行配置。
在最坏的情况下,在扫描期间发现最大数量的广告/扫描响应(n),所有这些都具有最大数据大小,其中应用程序一直在处理它,使得它不处理任何堆栈的消息,堆可以增长:(8 + 87 * n个字节)。例如,如果 GAPCENTRALROLE_MAX_SCAN_RES设置为10,则必须至少有878字节可用于从堆分配。这包括一个完全填充的GAP_DEVICE_DISCOVERY_EVENT。如果此分配失败,则会尝试分配错误状态的GAP_DEVICE_DISCOVERY_EVENT。因此,为了使系统在上述情况下保持运行,堆必须具有至少分配(8 + 79 * n个字节)的空间。
加入我们
文章所有代码、工具、文档开源。加入我们QQ群 591679055获取更多支持,共同研究CC2640R2F&BLE5.0。
© Copyright 2017, 成都乐控畅联科技有限公司.
- CC2640R2F BLE5.0 蓝牙协议栈GAPRole 任务
- CC2640R2F BLE5.0 蓝牙协议栈概述
- CC2640R2F BLE5.0 蓝牙协议栈OAD功能问题集锦
- CC2640R2F BLE5.0 蓝牙协议栈Off-Chip OAD功能
- CC2640R2F BLE5.0 蓝牙协议栈OAD功能概述
- CC2640R2F BLE5.0 蓝牙协议栈GATTServApp模块
- CC2640R2F BLE5.0 蓝牙协议栈通用访问配置文件(GAP)
- CC2640R2F BLE5.0 蓝牙概述
- CC2640R2F BLE5.0 蓝牙协议栈逻辑链路控制和适配层协议(L2CAP)
- CC2640R2F BLE5.0 蓝牙协议栈OAD功能常见问题解决指南
- CC2640R2F BLE5.0 蓝牙协议栈数据长度扩展功能(LE Data Length Extension)
- CC2640R2F BLE5.0 蓝牙协议栈LE 2M PHY功能
- CC2640R2F BLE5.0 蓝牙协议栈Host控制接口(HCI)
- CC2640R2F BLE5.0 蓝牙协议栈GAP Bond管理和LE安全连接
- CC2640R2F BLE5.0 蓝牙协议栈信道选择算法#2(CSA#2)
- CC2640R2F BLE5.0 蓝牙协议栈通用属性配置文件(GATT)
- CC2640R2F BLE5.0 蓝牙协议栈GAP GATT 服务(GGS)
- CC2640R2F BLE5.0 使用IAR开发蓝牙应用
- 智能路由的思考
- JS获取客户端IP地址、MAC和主机名的方法汇总
- 第十一篇 文件的打包压缩与备份
- PythonTip--8.3
- HDU 2112 HDU Today
- CC2640R2F BLE5.0 蓝牙协议栈GAPRole 任务
- 15,SpringMVC中添加Interceptor (JavaConfig方式)
- rocketmq-remoting源码分析NettyRemotingClient
- 以太坊开发:如何在Windows下开发一个简易Dapp
- 淘宝定时任务 tbschedule实战
- IPMB接口协议总结
- HTTPS协议和原理
- Event事件处理机制和原理
- Java JDK 动态代理(AOP)使用及实现原理分析