zoukankan      html  css  js  c++  java
  • 读取 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

    }

    当你坚持做一件完全正确的事情,有可能在很长一段时间内,你的价值都是零。
  • 相关阅读:
    Firebird 用查询结果集更新数据,merge
    wcf 登录认证 angular 认证重定向
    WOSA/XFS PTR Form解析库—xfsptrdata.h
    WOSA/XFS PTR Form解析库—头文件
    2019,开启新征程
    VC中添加头文件以及库
    .net4.0多进程间共享内存实现通信(VB.Net)
    共享内存操作类(C#源码)
    VC++ 共享内存读写操作
    c#实现内存映射文件共享内存
  • 原文地址:https://www.cnblogs.com/lweleven/p/rssi.html
Copyright © 2011-2022 走看看