扫描信号强度值(RSSI)
cc254x在observer模式下能够扫描周围iBeacon的广播信息,在主事件回调函数中,发现事件GAP_DEVICE_INFO_EVENT就是发现新的iBeacon设备,并且扫描到的信息中包含信号强度信息。此时,将信号强度信息提取,并存储到数组中即可。
// Length of bd addr as a string
#define B_ADDR_STR_LEN 15
//ibeacon的数目
#define IBEACON_MAX_NO 3
//每个ibeacon的rssi数据存储长度
#define DEFAULT_RSSI_LIST_LEN 5
static void simpleBLEObserverEventCB( gapObserverRoleEvent_t *pEvent ):
case GAP_DEVICE_INFO_EVENT:
insertRssiValue( bdAddr2Str(pEvent->deviceInfo.addr), (int8)(-pEvent->deviceInfo.rssi) );
char *bdAddr2Str( uint8 *pAddr )
{
uint8 i;
char hex[] = "0123456789ABCDEF";
static char str[B_ADDR_STR_LEN];
char *pStr = str;
*pStr++ = '0';
*pStr++ = 'x';
// Start from end of addr
pAddr += B_ADDR_LEN;
for ( i = B_ADDR_LEN; i > 0; i-- )
{
*pStr++ = hex[*--pAddr >> 4];
*pStr++ = hex[*pAddr & 0x0F];
}
*pStr = 0;
return str;
}
/*********************************************************************
* @fn getBeaconIndex
*
* @brief 返回当前ibeacon在地址列表中的序列号
*
* @param const char **pAddrArr - ibeacon地址数组
* @param const char *pAddr - 当前ibeacon的地址
*
* @return int8
*/
int8 getBeaconAddrIndex(const char **pAddrArr, const char *pAddr )
{
uint8 i;
for(i = 0;i < IBEACON_MAX_NO; ++i)
{
if (osal_memcmp(pAddr, pAddrArr[i], IBEACON_ADDR_LEN ))
{
return i;
}
}
return -1;
}
/*********************************************************************
* @fn EnQueue
*
* @brief 将数据插入到队列尾
*
* @param int8 *pQ - input array
* @param int8 val - value will enter the tail of pQ
*
* @return none
*/
void EnQueue(int8 *pQ, int8 val)
{
uint8 i;
for(i = 0;i<DEFAULT_RSSI_LIST_LEN-1;++i)
{
pQ[i] = pQ[i+1];
}
pQ[DEFAULT_RSSI_LIST_LEN-1] = val;
return;
}
/*********************************************************************
* @fn insertRssiValue
*
* @brief 将新RSSI数据插入到数据存储列表
*
* @param char *pAddr - address of the ibeacon
* @param uint8 newRssi - new rssi data
*
* @return none
*/
void insertRssiValue( const char *pAddr, uint8 newRssi)
{
int8 idx = getBeaconAddrIndex( iBeaconAddrArr, pAddr );
if(idx < 0) return;
else
{
EnQueue(iBeaconRawRssiArr[idx], newRssi);
return;
}
}
对RSSI数据处理
得到的RSSI数据比较粗糙,需要进行滤波处理。滤波方法有很多,但是均值滤波最好。
解算位置
本人采用自适应多边定位实现定位算法,即 Adaptive Multi-Lateration.