ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

BLE学习(6)

2021-08-04 15:00:51  阅读:255  来源: 互联网

标签:addrType addr 扫描 uint8 学习 白名单 BLE 设备


BLE学习(6)

介绍

上一篇文章实现了发送温度数据的动态广播更新以及观察者指定内容的获取,这一篇文章从只扫描白名单设备的实现过程开始。

观察者扫描白名单

LIB库白名单功能

CH57xBLE_LIB中的开启设备扫描函数GAPRole_ObserverStartDiscovery( uint8 mode, uint8 activeScan, uint8 whiteList ) 有白名单作为输入参数,因此可以利用自带的白名单功能实现。

在CH57xBLE_LIB中定义了对白名单的操作函数

/*******************************************************************************
 * @fn          LL_AddWhiteListDevice
 *
 * @brief       Add a device address into white list ( support 16 MAX )
 *
 * input parameters
 *
 * @param       addrType - Type of device address
 * @param       devAddr  - first address of device address
 *
 * output parameters
 *
 * @param       None.
 *
 * @return      Command Status.
 */
extern bStatus_t LL_AddWhiteListDevice( u8 addrType, u8 *devAddr );

/*******************************************************************************
 * @fn          LL_RemoveWhiteListDevice API
 *
 * @brief       Remove a device address from white list
 *
 * input parameters
 *
 * @param       addrType - Type of device address
 * @param       devAddr  - first address of device address
 *
 * output parameters
 *
 * @param       None.
 *
 * @return      Command Status.
 */
extern bStatus_t LL_RemoveWhiteListDevice( u8 addrType, u8 *devAddr);

/*******************************************************************************
 * @fn          LL_ClearWhiteList
 *
 * @brief       Clear white list
 *
 * input parameters
 *
 * @param       None
 *
 * output parameters
 *
 * @param       None.
 *
 * @return      Command Status.
 */
extern bStatus_t LL_ClearWhiteList( void );

其中LL_AddWhiteListDevice( u8 addrType, u8 *devAddr)可以将指定物理地址的设备写入白名单中,参数addrType为地址类型,*devAddr为存放地址的指针。

将指定设备的地址写入白名单后,设置GAPRole_ObserverStartDiscovery参数

GAPRole_ObserverStartDiscovery( DEFAULT_DISCOVERY_MODE,
                                        DEFAULT_DISCOVERY_ACTIVE_SCAN,
                                        DEFAULT_DISCOVERY_WHITE_LIST );

其中DEFAULT_DISCOVERY_WHITE_LIST 设为TRUE,表示开启白名单功能

经过以上程序修改,写入CH579中测试,测试中设备确实只对白名单设备进行扫描,并打印出一次结果,但是后续扫描不在得到该设备的扫描结果,查找相关资料无果,只能放弃用只带白名单功能实现,通过自己设计白名单功能。

设计白名单功能

自己设计白名单功能也十分简单,可以在扫描设备时只将指定地址的设备加入扫描列表中实现白名单功能

这里首先定义白名单设备物理地址

static uint8 s_mac1[6] = {0xFE,0xFF,0xFF,0xFF,0xFF,0xFF};

然后在将扫描设备加入扫描列表的函数ObserverAddDeviceInfo 中实现白名单操作

static void ObserverAddDeviceInfo( uint8 *pAddr, uint8 addrType )
{
  uint8 i;
  uint8 Mad_addr[B_ADDR_LEN];
  uint8 Mad_addrType;
	
  Mad_addrType = addrType;
  tmos_memcpy( Mad_addr, pAddr, B_ADDR_LEN );
  // If result count not at max
  if ( ObserverScanRes < DEFAULT_MAX_SCAN_RES )
  {
    // Check if device is already in scan results
    for ( i = 0; i < ObserverScanRes; i++ )
    {
      if ((tmos_memcmp( Mad_addr, ObserverDevList[i].addr , B_ADDR_LEN )))
      {
        return;
      }
    }
  }
  if((tmos_memcmp( Mad_addr,s_mac2 , B_ADDR_LEN )))
  {
	// Add addr to scan result list
	tmos_memcpy( ObserverDevList[ObserverScanRes].addr, Mad_addr, B_ADDR_LEN );
	ObserverDevList[ObserverScanRes].addrType = Mad_addrType;

	// Increment scan result count
	ObserverScanRes++;
  }
}

这里用了TMOS中的tmos_memcpy 函数进行扫描设备地址与白名单设备地址的比较,将是白名单地址中的设备写入设备扫描列表

在测试过程中有未扫描到指定地址设备循环数增加的情况,所以在事件回调函数中也做了修改

case GAP_DEVICE_DISCOVERY_EVENT:
      {
        PRINT ( "Discovery over...\n");

        // Display discovery results
        if ( ObserverScanRes > 0 )
        {
          int i,j;
          // Increment index of current result (with wraparound)
          for( j=0;j<ObserverScanRes;j++ )
          {
            PRINT ( "Device %d : ", j  );
            for( i=0; i<6; i++)
            {
              PRINT ( "%x ", ObserverDevList[j].addr[i]);
            }
			PRINT ("\n\n\n");
			PRINT ( "%x ",ObserverDevList[j].addrType );
          }
        }

使用了相同的变量ObserverScanRes ,以上就实现了扫描设备的白名单功能,其实最好应该使用LIB库中的功能实现,后续继续学习的过程中再将这部分进行修改。

标签:addrType,addr,扫描,uint8,学习,白名单,BLE,设备
来源: https://blog.csdn.net/qq_42019595/article/details/119348674

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有