CH582 Observer BLE示例讲解

  • Observer:又称为Scanner,可以监听广播数据或者搜索周围设备,

Observer:观察者角色例程,定时扫描,如果扫描结果不为空,则打印扫描到的广播地址

#define GAPROLE_MAX_SCAN_RES                    0x30E  //!< Maximum number of discover scan results to receive. Default is 0 = unlimited. 最大扫描个数

// Setup Observer Profile
{
uint8_t scanRes = DEFAULT_MAX_SCAN_RES;
GAPRole_SetParameter(GAPROLE_MAX_SCAN_RES, sizeof(uint8_t), &scanRes);
}
#define TGAP_DISC_SCAN   2   //!< Minimum time to perform scanning,Setting this parameter to 0 turns off the timeout.Default 10.24seconds. (n * 0.625 mSec)

执行扫描的最短时间

// Setup GAP
GAP_SetParamValue(TGAP_DISC_SCAN, DEFAULT_SCAN_DURATION);
/**
 * @brief   Start the device in Observer role.  This function is typically
 *          called once during system startup.
 *
 * @param   pAppCallbacks - pointer to application callbacks
 *
 * @return  SUCCESS: Operation successful.<BR>
 *          bleAlreadyInRequestedMode: Device already started.<BR>
 */
extern bStatus_t GAPRole_ObserverStartDevice( gapRoleObserverCB_t *pAppCallbacks );

    if(events & START_DEVICE_EVT)    
    {
        // Start the Device
        GAPRole_ObserverStartDevice((gapRoleObserverCB_t *)&ObserverRoleCB);  //启动扫描并指定回调函数

        return (events ^ START_DEVICE_EVT);
    }

初始化完成,触发扫描开启

static void ObserverEventCB(gapRoleEvent_t *pEvent)
{
    switch(pEvent->gap.opcode)
    {
        case GAP_DEVICE_INIT_DONE_EVENT:
        {
            PRINT("Begin %d\n",RTC_GetCycle32k());
            GAPRole_ObserverStartDiscovery(DEFAULT_DISCOVERY_MODE,
                                           DEFAULT_DISCOVERY_ACTIVE_SCAN,
                                           DEFAULT_DISCOVERY_WHITE_LIST);
            PRINT("Discovering...\n");
        }

扫描设备可以获取广播包和扫描应答包,如下:

        case GAP_DEVICE_INFO_EVENT:
        {
            ObserverAddDeviceInfo(pEvent->deviceInfo.addr, pEvent->deviceInfo.addrType);
            uint8 i;
            for(i=0;i<pEvent->deviceInfo.dataLen;i++)
            {
              PRINT(" %x",pEvent->deviceInfo.pEvtData[i]);
            }
            PRINT("\n");
        }

其中  pEvent->deviceInfo  还有以下设备信息可以获取(不建立连接获取设备信息)

typedef struct
{
    tmos_event_hdr_t hdr;             //!< GAP_MSG_EVENT and status
    uint8_t opcode;                   //!< GAP_DEVICE_INFO_EVENT
    uint8_t eventType;                //!< Advertisement Type: @ref GAP_ADVERTISEMENT_REPORT_TYPE_DEFINES
    uint8_t addrType;                 //!< address type: @ref GAP_ADDR_TYPE_DEFINES
    uint8_t addr[B_ADDR_LEN];         //!< Address of the advertisement or SCAN_RSP
    int8_t rssi;                      //!< Advertisement or SCAN_RSP RSSI
    uint8_t dataLen;                  //!< Length (in bytes) of the data field (evtData)
    uint8_t *pEvtData;                //!< Data field of advertisement or SCAN_RSP
} gapDeviceInfoEvent_t;

扫描到达设定的最大个数或者扫描超时后,会进入如下条件

        case GAP_DEVICE_DISCOVERY_EVENT:
        {
            PRINT("Discovery over...\n");
            PRINT("over %d\n",RTC_GetCycle32k());   //打印下一次进入该状态的时间,通过32K计数进行换算
            // Display discovery results
            if(pEvent->discCmpl.numDevs > 0)
            {
                int i, j;
                // Increment index of current result (with wraparound)
                for(j = 0; j < pEvent->discCmpl.numDevs; j++)
                {
                    PRINT("Device %d : ", j);
                    for(i = 0; i < 6; i++)
                    {
                        PRINT("%x ", pEvent->discCmpl.pDevList[j].addr[i]);
                    }
                    PRINT("\n");
                }
            }

            GAPRole_ObserverStartDiscovery(DEFAULT_DISCOVERY_MODE,
                                           DEFAULT_DISCOVERY_ACTIVE_SCAN,
                                           DEFAULT_DISCOVERY_WHITE_LIST);//启动下一轮扫描
            PRINT("Discovering...\n ");
        }

看运行结果  

 07 ff 4c 00 12 02 00 01

Discovery over...
over 580245
Device 0 : d7 b1 3c e4 c2 84 
Device 1 : 39 73 12 e8 6c 14 
Device 2 : 9c bd de 7b 5b da 
Device 3 : ab 9b af ff dd d 
Device 4 : 60 76 7b 50 d8 41 
Device 5 : ce 9d 87 65 f2 12 
Device 6 : 19 4b fd 86 be 4a 
Device 7 : 2b 79 c6 7a 68 1c 
Discovering...
  1e ff 06 00 01 09 20 02 07 07 1e 1f 39 d6 3e 40 ad 11 db d0 b7 ab 59 34 af 1a 61 20 93 f6 e5

略...

0a ff ff ff e9 21 25 17 c7 d4 ff 13 09 57 58 30 35 31 39 31 31 30 32 32 32 31 30 30 30 31 36  //打印的广播包或者扫描应答包

Discovery over...
over 677021
Device 0 : b 87 92 83 4f 21    //打印的mac地址
Device 1 : 8a e2 47 ea 70 e2 
Device 2 : c5 e8 8 6b 80 3c 
Device 3 : c5 e8 8 6b 80 3c 
Device 4 : 8 c7 45 34 5b 42 
Device 5 : 60 76 7b 50 d8 41 
Device 6 : 19 4b fd 86 be 4a 
Device 7 : c2 81 b9 53 1b 6d 
Discovering...

32K 计数 (677021-580245)/32000 =3.02s 

// Scan duration in (625us)
#define DEFAULT_SCAN_DURATION 4800  代码种设定的扫描间隔 4800*0.625=3s  与上述运行时间一致

posted @ 2022-08-30 14:37  debugdabiaoge  阅读(551)  评论(0编辑  收藏  举报