[资料分享] 基于TI CC254X+iBeacon的室内定位解决方案(转载)

[复制链接]
 楼主| tfqi 发表于 2019-6-19 13:00 | 显示全部楼层 |阅读模式
扫描信号强度值(RSSI)
cc254x在observer模式下能够扫描周围iBeacon的广播信息,在主事件回调函数中,发现事件GAP_DEVICE_INFO_EVENT就是发现新的iBeacon设备,并且扫描到的信息中包含信号强度信息。此时,将信号强度信息提取,并存储到数组中即可。


 楼主| tfqi 发表于 2019-6-19 13:00 | 显示全部楼层
// 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;
}
 楼主| tfqi 发表于 2019-6-19 13:00 | 显示全部楼层
/*********************************************************************
* @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, IBEACON_ADDR_LEN ))
    {
      return i;
    }
  }
  return -1;
}
 楼主| tfqi 发表于 2019-6-19 13:00 | 显示全部楼层
/*********************************************************************
* @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;
}
 楼主| tfqi 发表于 2019-6-19 13:01 | 显示全部楼层
/*********************************************************************
* @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;
  }
}
 楼主| tfqi 发表于 2019-6-19 13:01 | 显示全部楼层
对RSSI数据处理
得到的RSSI数据比较粗糙,需要进行滤波处理。滤波方法有很多,但是均值滤波最好。

解算位置
本人采用自适应多边定位实现定位算法,即 Adaptive Multi-Lateration.
dirtwillfly 发表于 2019-6-19 22:07 | 显示全部楼层
感谢分享
consumption 发表于 2019-6-28 13:53 | 显示全部楼层
感谢分享!学习下!
 楼主| tfqi 发表于 2019-7-10 11:45 | 显示全部楼层
非常感谢各位支持
usysm 发表于 2019-7-15 22:14 | 显示全部楼层
室内定位技术不断发展,手段也丰富多样  
typeof 发表于 2019-7-15 22:14 | 显示全部楼层
需要部署定位的anchor的也就是定位基站。  
yujielun 发表于 2019-7-15 22:14 | 显示全部楼层
CC254X具有8051内核   
htmlme 发表于 2019-7-15 22:14 | 显示全部楼层
应用还不是特别的广泛   
pklong 发表于 2019-7-15 22:15 | 显示全部楼层
蓝牙室内定位技术方案  
touser 发表于 2019-7-15 22:15 | 显示全部楼层
用蓝牙信号强弱来做室内定位   
myiclife 发表于 2019-7-15 22:15 | 显示全部楼层
怎样修改 cc254x 参数   
uytyu 发表于 2019-7-15 22:16 | 显示全部楼层
如何使用 CC2540 制作一个 iBeacon   
iyoum 发表于 2019-7-15 22:16 | 显示全部楼层
CC2640 使用BTool抓包怎么用  
jkl21 发表于 2019-7-15 22:16 | 显示全部楼层
蓝牙网关和蓝牙Beacon的应用是目前比较广泛的两个室内定位方案  
uytyu 发表于 2019-7-15 22:16 | 显示全部楼层
CC2640定向广播需要怎么配置  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

57

主题

3317

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部

57

主题

3317

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部