在 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的更多相关文章

  1. 蓝牙防丢器原理、实现与Android BLE接口编程

    本文是对已实现的蓝牙防丢器项目的总结,阐述蓝牙防丢器的原理.实现与android客户端的蓝牙BLE接口编程.在这里重点关注如何利用BLE接口来进行工程实现,对于BLE的协议.涉及到JNI的BLE接口内 ...

  2. 【转】BLE_CC2540_初学者入门指导

    原文网址:http://www.deyisupport.com/question_answer/wireless_connectivity/bluetooth/f/103/t/61462.aspx 看 ...

  3. [yueqian_scut]蓝牙防丢器原理、实现与Android BLE接口编程

    本文是对已实现的蓝牙防丢器项目的总结,阐述蓝牙防丢器的原理.实现与Android客户端的蓝牙BLE接口编程.在这里重点关注如何利用BLE接口来进行工程实现,对于BLE的协议.涉及到JNI的BLE接口内 ...

  4. ESP-IDF3.0

    发行版v3.0的文档可在http://esp-idf.readthedocs.io/en/v3.0/上找到. 这是自发布v3.0-rc1以来的更改列表. 如果从以前的稳定版本V2.1进行升级,请检查v ...

  5. Micro:Bit手柄试用之一MagicPad (解决蓝牙与gamePad包共存)

    前言 原创文章,转载引用务必注明链接.由于本人初次接触Micro:Bit,水平有限,如有疏漏,欢迎指正. Micro:Bit真好玩! DFRobot的论坛相关资料算是国内比较丰富的了,个人感觉MB比A ...

  6. cc2540 cc2541 开发板资料更新日志

    经过多次PCB打样和全面调试.已经完毕了cc2540 cc2541的开发板的批量贴片.硬件告一段落, 接下来是全面完好软件方面的工作.眼下已经针对没有开发经验的用户编写完毕0基础基础实验代码和教程.接 ...

  7. Python之threading初探

    threading库主要用于基于线程的并行,核心就是Thread类   class threading.Thread(group=None, target=None, name=None, args= ...

  8. Android 读取蓝牙设备信息开发

    (1)Android手机一般以客户端的角色主动连接SPP协议设备(接上蓝牙模块的数字传感器),连接流程是: 1.使用registerReceiver注册BroadcastReceiver来获取蓝牙状态 ...

  9. Madwifi Mad coding:自底向上分析associated_sta的更新过程 —— RSSI和MACADDR等信息获取的底层原理

    Madwifi驱动工作在AP模式下时,可以在/proc/net/madwifi/ath0/associated_sta文件中得到所有接入的用户的MAC地址.实时平均RSSI,和last_rx三个信息. ...

随机推荐

  1. Shell终端配置

    Shell终端配置 How to: Change / Setup bash custom prompt (PS1) 参考链接:https://www.cyberciti.biz/tips/howto- ...

  2. 在不格式化原有系统盘的情况下,利用grub4dos+firadisk制作RamOS VHD Win7总结

    在不格式化原有系统盘的情况下,利用grub4dos+firadisk制作RamOS VHD Win7总结在不格式化原有系统盘的情况下,用grub4dos+firadisk安装WIN7到VHD,内存大的 ...

  3. 1 Spring MVC 原理

    1. 注解式  Spring MVC 响应流程: 重要的接口和类的简单说明: DispatcherServlet:前端控制器,用于接收请求. HandlerMapping接口:用于处理请求的映射. D ...

  4. wireshark过滤使用

    过滤器的区别 捕捉过滤器(CaptureFilters):用于决定将什么样的信息记录在捕捉结果中.需要在开始捕捉前设置.显示过滤器(DisplayFilters):在捕捉结果中进行详细查找.他们可以在 ...

  5. org.apache.commons.lang.StringUtils类

    org.apache.commons.lang.StringUtils类 本文摘自:(http://www.blogjava.net/japper/archive/2012/05/23/378946. ...

  6. HttpCache ETag与Last-Modified与Expires

    Last-Modified 是检查一个资源最后修改时间.如果时间过期了则返回资源内容.如果没过期,返回304.当Last-Modified更新了,但是资源本质上没有更新,比如资源是A,Last-Mod ...

  7. Node.js 函数

    Node.js 函数 在JavaScript中,一个函数可以作为另一个函数接收一个参数.我们可以先定义一个函数,然后传递,也可以在传递参数的地方直接定义函数. Node.js中函数的使用与Javasc ...

  8. Rhel6-vpn配置文档

    系统环境: rhel6 x86_64 iptables and selinux disabled 主机: 192.168.122.160 server60.example.com 192.168.12 ...

  9. MVC模型

    MVC:model.view.controller. 浏览器browser发出一个请求,被servlet(控制器controller)接收,由servlet去实例化一个模型层(JavaBean)的对象 ...

  10. SharePoint 2016 Beta 2 安装体验

    博客地址:http://blog.csdn.net/FoxDave 最近忙碌了一段时间,2016正式版快要发布了,想尽快熟悉熟悉.2016不再提供免费版Foundation的支持,只有Server版本 ...