用户工具

站点工具


cc2640r2f:gap_role_task

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

cc2640r2f:gap_role_task [2017/09/09 18:35]
wuyl
cc2640r2f:gap_role_task [2021/06/22 23:14]
行 1: 行 1:
-<markdown> 
  
-# 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 包括命令、可配置参数、事件和回调。 
- 
-使用此模块的步骤如下: 
- 
-1. 初始化 GAPRole 参数,这部分代码在 simple_peripheral.c 的 SimpleBLEPeripheral_init 中能够找到。 
- 
-````C 
-    // 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 表示一直进行广播。上述代码还设置了广播响应数据、广播数据、参数更新请求、广播连接间隔、广播从机延迟、连接超时。 
- 
-2. 初始化 GAPRole 任务并将应用程序回调函数传递给 GAPRole ,应该在 simple_peripheral.c 的 SimpleBLEPeripheral_init 中能够找到。其目的是当设备状态改变的时进行响应,设备一旦改变都会通过这个回调函数改变 event 。同时 SimpleBLEPeripheral_taskFxn 里面一直在检测 event 事件的状态,发现状态改变则进行一些任务处理。 
- 
-````C 
- `VOID  GAPRole_StartDevice (&SimpleBLEPeripheral_gapRoleCBs );` 
-```` 
- 
-3. 回调函数注册并初始化之后就能在应用程序接收 GAPRole 命令了,图 1 是 GAPRole_terminateConnection() 的程序上下文示意图。 
- 
-![](http://www.leconiot.com/md_res/cc2640r2f/ble_stack_app/stack/gap_role_task/Images/TerminateConnection.png) 
- 
-图1. GAPRole_terminateConnection()上下文示意图 
- 
-图 1 可以看出应用程序直接调用 GAPRole 层 API GAPRole_TerminateConnection(),GAPRole 负责和协议栈通讯,然后接收到协议栈返回的状态,之后又通过回调函数发送给应用程序,应用程序接收到状态之后再进行自己的逻辑处理。 
- 
-注意:返回值仅指示终止连接的尝试是否成功启动。连接终止实际是异步返回,并通过上面注册的回调传递给应用程序。 
- 
-4. GAPRole 任务处理从协议栈传递给它的大多数 GAP 相关事件。GAPRole 任务还将一些事件转发到应用程序(例如上面的 GAPROLE_WAITING )。当链接终止时,GAPRole 会自动重新启动广播。 
- 
-以下代码片段可以在 peripheral.c 中找到 
- 
-````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 示例项目。 
- 
-使用此模块的步骤如下: 
- 
-1. 初始化 GAPRole 参数。初始化可以在应用程序初始化函数中出现(例如 in SimpleBLECentral_init ),也可以在此初始化功能中设置 GAP 参数。 
- 
-````C 
- // 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 个外围设备的广播响应。 
- 
-2. 启动 GAPRole 任务。这涉及将应用程序回调函数的函数指针传递给 Central GAPRole ,是在应用程序初始化函数中出现的。和 Peripheral Role 类似,协议栈返回一些事件,GAPRole 再通过回调函数异步返回给应用程序。 
- 
-````C 
- `VOID  GAPCentralRole_StartDevice (&SimpleBLECentral_roleCB );` 
-```` 
- 
-3. 从应用程序发送 GAPRole 命令。图 2 是使用 GAPCentralRole_StartDiscovery()的应用程序上下文。 
- 
-![](http://www.leconiot.com/md_res/cc2640r2f/ble_stack_app/stack/gap_role_task/Images/StartDiscover.png) 
- 
-图2. GAPCentralRole_StartDiscovery()上下文示意图 
- 
-图 2 中应用程序直接调用 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 X n个字节)。 
- 
-例如,如果 GAPCENTRALROLE_MAX_SCAN_RES 设置为 10,则必须至少有 878 字节可用于从堆分配,包括一个完全填充的 GAP_DEVICE_DISCOVERY_EVENT 。如果分配失败,会尝试分配错误状态的 GAP_DEVICE_DISCOVERY_EVENT 。因此,为了使系统在上述情况下保持运行,堆必须具有至少分配(8 + 79 * n个字节)的空间。 
- 
-## 加入我们 ## 
- 
-文章所有代码、工具、文档开源。加入我们[**QQ群 591679055**](http://shang.qq.com/wpa/qunwpa?idkey=d94f12d37c3b37892af4b757c6dc34bea140f3f3128a8d68e556a3d728148e85)获取更多支持,共同研究CC2640R2F&BLE5.0。 
-<div> 
-<p align="right"> 
-<a target="_blank" href="http://shang.qq.com/wpa/qunwpa?idkey=d94f12d37c3b37892af4b757c6dc34bea140f3f3128a8d68e556a3d728148e85"><img border="0"  src="http://pub.idqqimg.com/wpa/images/group.png" alt="CC2640R2F&BLE5.0-乐控畅联" align="right" title="CC2640R2F&BLE5.0-乐控畅联"></a> 
-© Copyright 2017, 成都乐控畅联科技有限公司.   
-</p> 
-</div> 
-</markdown> 
cc2640r2f/gap_role_task.txt · 最后更改: 2021/06/22 23:14 (外部编辑)