读取 RSSI
在 TI 给的 SimpleBleCentral demo 里,读取 RSSI 的原理是:按 CC2540EM 的下键,然后调用 GapCentralRole 里的函数,启动定时器,不断向 OSAL 层发送 Message ,然后调用 HCI 层的 CMD 读取 RSSI ,最后将值传回 APP 层。
初步了解过程后,我很疑惑一个问题,为什么读取 RSSI 的整个过程要在 GapCentralRole 里,这属于 profile 吗?这应该是 GAP 层,GAP 的主要用途是控制连接的发现、建立、中断等。那么现在就有两个问题要解决:1. GAP 层和 APP 层是怎么联系起来的? 2. RSSI 是否有特殊的含义,就好像在 HCI 层专门有 API 读取 RSSI 一样,是否 RSSI 就是 GAP 层所特有的?
Q&A:
解答1:要弄明白 GAP 和 APP 的联系,那么现在就去看看在建立连接时两者的关系。发现在主设备扫描时用到了 API :GAPCentralRole_StartDiscovery( DEFAULT_DISCOVERY_MODE,DEFAULT_DISCOVERY_ACTIVE_SCAN,DEFAULT_DISCOVERY_WHITE_LIST );
解答2:TBD
-----------------------------------------------Divider---------------------------------------
读取 RSSI 的代码部分流程如下:
1. 在 APP 层调用函数: GAPCentralRole_StartRssi( simpleBLEConnHandle, DEFAULT_RSSI_PERIOD )。
2. 函数 GAPCentralRole_StartRssi() 里启用定时器 osal_CbTimerStart( gapCentralRole_timerCB, (uint8 *) pRssi,period, &pRssi->timerId )。时间到了会调用 gapCentralRole_timerCB()回调函数。
3. 在函数 gapCentralRole_timerCB() 里向 OSAL 层发送消息 osal_msg_send ( gapCentralRoleTaskId, (uint8 *) pMsg ), 消息事件为:GAPCENTRALROLE_RSSI_MSG_EVT。
4. 在 OSAL 层收到消息后,在事件 GAPCENTRALROLE_RSSI_MSG_EVT 中调用 HCI 层的 CMD 读取 RSSI :VOID HCI_ReadRssiCmd( pRssi->connHandle )。
5. HCI 层的命令执行完成后,会发送命令完成事件 HCI_COMMAND_COMPLETE_EVENT_CODE ,然后调用函数 pGapCentralRoleCB->rssiCB( connHandle, rssi )。
6. 此时响应 APP 层的回调函数:static void simpleBLECentralRssiCB( uint16 connHandle, int8 rssi ),这样在应用程序中就得到了 RSSI 的值。
static void simpleBLECentralRssiCB( uint16 connHandle, int8 rssi )
{
...... //get the RSSI value
}
----------->Tips: pGapCentralRoleCB->rssiCB() 是怎么到 static void simpleBLECentralRssiCB()的???----------->TBD
在 GAP 层:
typedef struct
{
pfnGapCentralRoleRssiCB_t rssiCB; //!< RSSI callback.
pfnGapCentralRoleEventCB_t eventCB; //!< Event callback.
} gapCentralRoleCB_t;
typedef void (*pfnGapCentralRoleRssiCB_t)
(
uint16 connHandle, //!< Connection handle.
int8 rssi //!< New RSSI value.
);
typedef void (*pfnGapCentralRoleEventCB_t)
(
gapCentralRoleEvent_t *pEvent //!< Pointer to event structure.
);
static gapCentralRoleCB_t *pGapCentralRoleCB;
pGapCentralRoleCB->rssiCB( connHandle, rssi );
在 APP 层:
static const gapCentralRoleCB_t simpleBLERoleCB =
{
simpleBLECentralRssiCB, // RSSI callback
simpleBLECentralEventCB // Event callback
};
static void simpleBLECentralRssiCB( uint16 connHandle, int8 rssi )
{
......get RSSI
}
读取 RSSI的更多相关文章
- 蓝牙防丢器原理、实现与Android BLE接口编程
本文是对已实现的蓝牙防丢器项目的总结,阐述蓝牙防丢器的原理.实现与android客户端的蓝牙BLE接口编程.在这里重点关注如何利用BLE接口来进行工程实现,对于BLE的协议.涉及到JNI的BLE接口内 ...
- 【转】BLE_CC2540_初学者入门指导
原文网址:http://www.deyisupport.com/question_answer/wireless_connectivity/bluetooth/f/103/t/61462.aspx 看 ...
- [yueqian_scut]蓝牙防丢器原理、实现与Android BLE接口编程
本文是对已实现的蓝牙防丢器项目的总结,阐述蓝牙防丢器的原理.实现与Android客户端的蓝牙BLE接口编程.在这里重点关注如何利用BLE接口来进行工程实现,对于BLE的协议.涉及到JNI的BLE接口内 ...
- ESP-IDF3.0
发行版v3.0的文档可在http://esp-idf.readthedocs.io/en/v3.0/上找到. 这是自发布v3.0-rc1以来的更改列表. 如果从以前的稳定版本V2.1进行升级,请检查v ...
- Micro:Bit手柄试用之一MagicPad (解决蓝牙与gamePad包共存)
前言 原创文章,转载引用务必注明链接.由于本人初次接触Micro:Bit,水平有限,如有疏漏,欢迎指正. Micro:Bit真好玩! DFRobot的论坛相关资料算是国内比较丰富的了,个人感觉MB比A ...
- cc2540 cc2541 开发板资料更新日志
经过多次PCB打样和全面调试.已经完毕了cc2540 cc2541的开发板的批量贴片.硬件告一段落, 接下来是全面完好软件方面的工作.眼下已经针对没有开发经验的用户编写完毕0基础基础实验代码和教程.接 ...
- Python之threading初探
threading库主要用于基于线程的并行,核心就是Thread类 class threading.Thread(group=None, target=None, name=None, args= ...
- Android 读取蓝牙设备信息开发
(1)Android手机一般以客户端的角色主动连接SPP协议设备(接上蓝牙模块的数字传感器),连接流程是: 1.使用registerReceiver注册BroadcastReceiver来获取蓝牙状态 ...
- Madwifi Mad coding:自底向上分析associated_sta的更新过程 —— RSSI和MACADDR等信息获取的底层原理
Madwifi驱动工作在AP模式下时,可以在/proc/net/madwifi/ath0/associated_sta文件中得到所有接入的用户的MAC地址.实时平均RSSI,和last_rx三个信息. ...
随机推荐
- xml资源getStringArray(R.array.xxx)方法
在res/values/下新建menu_names.xml 代码如下: <?xml version="1.0" encoding="utf-8"?> ...
- java高薪之路__003_集合
Java集合可分为Collection和Map两大体系 Collection接口 |---- Set: 元素无序.不可重复 |---- List: 元素有序.可重复 (动态数组) |---- Queu ...
- linux之iptables
from http://www.geekfan.net/6921/ Iptables是专为Linux操作系统打造的极其灵活的防火墙工具.对Linux极客玩家和系统管理员来说,iptables非常有用. ...
- svn查看代码作者的命令
svn blame **.java | grep ** svn查看代码作者的命令
- iOS开发 ReactiveCocoa入门教程 第二部分
ReactiveCocoa 是一个框架,它允许你在你的iOS程序中使用函数响应式(FRP)技术.加上第一部分的讲解,你将会学会如何使用信号量(对事件发出数据流)如何替代标准的动作和事件处理逻辑.你也会 ...
- Head First 设计模式--2 观察者模式 解耦
观察者模式定义了对象之间一对多的依赖,这样依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新. 假如有这么一个项目,监控每天的天气状况WeatherData(温度,湿度,气压).有布告板 ...
- SurfaceOutput
下面着重分析一下surface shader中是如何使用BlinnPhong光照模型的,为以后写代码做铺垫.源文件取自Unity3D官网下载的builtin_shaders, 源文件名为Normal- ...
- netbean快捷键
1.Application应用程序的参数args的设置,在Build->Set Main Projects Configuration 2.程序运行快捷键F6 3.@Deprecated 4.代 ...
- null 和 undefined 的区别
null表示"没有对象",即该处不应该有值. (1) 作为函数的参数,表示该函数的参数不是对象. (2) 作为对象原型链的终点. undefiend 就是一个缺少值,此处应该有的值 ...
- linux下打包命令的使用
Unix系统业务使用(特别是数据管理与备份)中,经过一番研究.整理后,充分利用Unix系统本身的命令tar.cpio和compress等来做到打包和压缩,使之充当类似DOS下的压缩软件,同时在Unix ...