一、ALOHA
1、纯ALOHA
reader给tag们广播识别命令,然后tag收到之后就给reader回,reader收到之后检查有没有冲突,有冲突就给回冲突,没冲突就给回确认。tag收到冲突之后会等一段时间再发,收到确认之后就算发完了。这个信道利用率只有18.4%。
怎么算的,背,数据包到达是个泊松过程,数据包发送的概率与时间间隔成指数分布,e的-G次方是前一个tao没包的概率,后一个tao没包的概率也是这个,所以这个包要发成,就是2tao都没包,那就是这俩概率相乘,包发成的概率就是e^(-2G),把这个带入信道利用率公式,S = G * e^(-2G),然后又是求导又是什么的一通算最后得G=1/2时最大,算出来最大信道利用率是18.4%。
2、slotted ALOHA
这个就是把时间分成一个一个slot,tag只能在每个slot开始的时候给reader发消息。其他还是一样,reader给tag们广播识别命令,然后tag收到之后等到一个slot开始,就给reader回。tag怎么知道slot啥时候开始,这需要同步,这个由reader的时隙开始命令实现。这个信道利用率达到了36.8%。
这个如果上面那个计算会的话这个就很好算,不会的话也可以直接套公式背,因为slotted之后脆弱期不就只有tao了么,所以最后就是S = G * e^(-G),最后求导求极值算出来得G=1,最大信道利用率是36.8%。
3、基于帧的时隙ALOHA(FSA)
这个算法把多个slot组织成帧(frame),在每个帧开始时,reader广播该帧的长度f,然后激活他区域内的所有标签,所有标签收到这个长度f后,在0~(f-1)这些个整数里随机挑一个作为自己要传数据的slot号,然后每一个slot开始时,每个标签看自己的这个SN号,如果是0,就发包,如果不是0,就不发包,给自己的SN号-1。发包之后,如果没冲突,那就成了,休眠;如果冲突,那就等着,等到下一帧,注意是帧,不是slot,在重新选slot号传包。阅读器不断重复,直到某一帧,注意是一帧都没有tag给他发包,那他就认为是都发过了。
这样就会有三种slot,没有人发包的空时隙,只有一个tag响应的单时隙,多个tag冲突的冲突时隙。那么思考一下,帧短tag多,那碰撞肯定多,帧长tag少,那空时隙肯定多,书上说理论可以证明当帧长等于tag数的时候,可以达到最大信道利用率36.8%。但是实际场景肯定复杂,如果可以动态的调整帧长那也不错。
4、动态调整帧长的FSA
这就是要动态调整帧长了。
一种是这个Q算法,他会维护一个浮点型参数Q,初始值为4,Query是帧开始做的动作,然后广播2^Q -1这个帧长,然后都正常,tag选时隙,从0时隙开始发标识,每过一个时隙,reader看这个时隙的结果,如果正好是一个tag响应,那就是没有冲突,那这个Q就不变,如果是空时隙,那就给这个Q减去C,这个C是先前定好的一个常量,取值是0.1-0.5,就类似于一个学习率这个样子。然后减完之后这个Q能小于0,所以这个状态图画的就是0和减完的值取最大。然后是,如果冲突了,那就给这个Q加上C,然后这个Q值不能超过15。这一个时隙下来之后,要做一次round,这个Q四舍五入,然后根据这个值来决定是直接结束掉当前帧,还是继续当前帧。
这个动态的效率最大也是36.8%,条件是当帧长等于未识别的标签数目时。
二、基于二进制树的
1、随机二进制树
每个标签维护一个计数器,一开始所有标签计数器都是0,然后每个时隙开始时,所有计数器为0的标签都会响应。
如果有冲突发生,比如第一次大家都会响应,然后reader收到之后发现冲突了,告诉大家冲突了,tag们在随机的从0和1里选一个,加到自己的计数器上,没有响应的tag要默默的给自己的计数器加上1,当然第一次大家都响应了,这是说之后。
如果没有冲突发生,被成功标识的tag就沉默了,没被标识的其他所有tag都要默默的给自己的计数器加1。
然后一致重复这个,直到所有的tag都被标识。
可以看下面这个例子理解一下
2、查询的二进制树
这个其实就是一个深度优先遍历,这个二叉树的每个叶子节点都可以是一个tag(也可能不是,就说明就没有那个id号的tag),然后reader每次发一个前缀,从0开始,同时把1压入栈中,冲突了就往下加,变成00,但同时也要把01压栈,然后不冲突,要么是空时隙,要么是成功传输了的时隙,都说明到叶子节点了,也就是到底了,然后就弹栈,往另一边搜,完成这个深搜就查询了所有的tag。