根据RSSI值找到标签的最接近嗅探器

时间:2019-11-27 20:06:42

标签: bluetooth rxjs

我有一种情况是在网状网络中跟踪蓝牙标签,我想知道在任何给定的时间点,标签最接近哪个nodeId(嗅探器)(根据{值{1}}。

给出一个正在运行的数据窗口:

rssi

我的想法是我想从Mac上获取最新的3个读数,找到具有最高{ mac: '123', nodeId: 1, rssi: 1 } { mac: '456', nodeId: 2, rssi: 3 } 值的读数,并且仅当它改变了rssi和{{1 }}从最后一个输出。我下面的代码几乎存在,但是当有多个mac地址时,事情开始变得混乱。

您能指出我的方向吗?我想我也需要按Mac分组?

nodeId

编辑 @Dorus太神奇了,并清理了所有内容,这似乎可以解决问题:

mac

1 个答案:

答案 0 :(得分:0)

您当前的代码已接近,实际上我可以重用其中的大部分代码。

出问题的是,group.pipe(toArray())仅在组完成时才发出(并且仅在源完成时才发生)。您想要做的是获取一个滑动窗口。您可以使用bufferCount(BUFFER_SIZE, 1)进行操作。它将每1个项目发出最后3个项目,因此您可以在组每次获得新项目时检查最后3个项目。

const GROUP_BY = 'mac';
const DISTINCT_BY = 'nodeId';
const COMPARE_KEY = 'rssi';
const distinctComparer = field => (x, y) => x[field] === y[field];
const BUFFER_SIZE = 3;
const comparer = field => (a, b) => (a[field] < b[field] ? -1 : 1);

source.pipe(
    groupBy(metric => metric[GROUP_BY])
    mergeMap(grp => grp.pipe(
      bufferCount(BUFFER_SIZE, 1)),
      mergeMap(metric => from(metric).pipe(max(comparer(COMPARE_KEY))))
      distinctUntilChanged(distinctComparer(DISTINCT_BY))
    )  
  )

另外,我认为您想比较并获得小组中的最高人数。为此,您需要将所有内容放入处理单个组的mergeMap内。