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库中的功能实现,后续继续学习的过程中再将这部分进行修改。