Aloha 算法的基本思想是:当标签进入到阅读器的识别范围,接收到阅读器的识别命令后,以数据包的形式向阅读器发送标签自身的标识符,立即开始等待固定的时间,若在等待时间结束内其他标签也在发送,则会产生信号叠加而引起冲突,阅读器接收到数据包后,判断冲突是否发生:
- 没有发生冲突:阅读器正确识别标签并发送确认信息,标签接收到确认 信息后不再发送标识符;
- 发生冲突:阅读器向该标签发送冲突确认,标签接收到冲突信息,等待的固定时间完成后,会随机独立地等待一段时间再重新发送标识符,直到成功为止。
# encoding=utf-8
from CommonClass import *
from CommonAlgrithom import *
import random
def pureAloah(tags, binaryLength, totalTime=1000, ackTime=1):
"""
:param binaryLength: 标签EPC编码长度
:param tags: 标签列表
:param totalTime: 规定的总时间
:param ackTime: 标签发送数据包后,所等待的确认时间
:return result: 包含两个数据的数组,分别为成功识别的标签数、碰撞次数
"""
for i in range(len(tags)):
tags[i].sendTime = random.uniform(0,totalTime)
tags.sort(key=lambda x: x.sendTime)
tagDataCount = 0 # 标签发送的数据包数
result = [0] * 2 # 成功识别的标签数、碰撞次数
while len(tags) > 0 and tags[0].sendTime <= totalTime:
responseList = []
for j in range(len(tags)):
if tags[j].sendTime - tags[0].sendTime < ackTime: # 发生碰撞
responseList.append(j)
if len(responseList) > 1:
showError("发送碰撞!")
result[1] += 1
for index in responseList:
tags[index].sendTime += random.uniform(0, totalTime)
tags.sort(key=lambda x: x.sendTime)
else:
showSuccess("成功识别标签id:"+str(tags[0].id))
print(f"成功识别标签id:{tags[0].id}")
result[0] += 1
tags.remove(tags[0])
return result
tagNums = 1000 # 总标签数量
binaryLength = 96
totalTime = tagNums # 规定的总时间
ack = 1 # 标签发送数据包后,等待确认的时间
tags = randomTag(total=tagNums)
result = pureAloah(tags,binaryLength, totalTime, ack)
print(f"标签总数为:{tagNums} 总限时为:{totalTime} 标签数据包确认时间为:{ack}")
print(f"成功识别的标签个数为:{result[0]} 碰撞次数为:{result[1]}")
纯 ALOHA 算法简单且易于实现,但是信道利用率低,不管是完全冲突还是部分冲突,都会停止发送,性能比较差。