基于TI CC254X+iBeacon的室内定位解决方案

扫描信号强度值(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.

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值