【发布时间】:2019-01-06 19:51:03
【问题描述】:
背景
我正在尝试从收到的数据包中获取 RSSI。我知道它们在 Radiotap 标头中可用,但不幸的是,我无法嗅探其中包含 Radiotap 标头的任何数据包。
我确实从scapy-rssi 中找到了parsePacket 方法,它似乎只过滤掉包含带有RSSI 的Radiotap 标头的数据包(如果我没记错的话)。
我在以下代码中使用了该方法:
def parsePacket(pkt):
if pkt.haslayer(scapy.all.Dot11):
if pkt.addr2 is not None:
# check available Radiotap fields
field, val = pkt.getfield_and_val("present")
names = [field.names[i][0] for i in range(len(field.names)) if (1 << i) & val != 0]
# check if we measured signal strength
if "dBm_AntSignal" in names:
# decode radiotap header
fmt = "<"
rssipos = 0
for name in names:
# some fields consist of more than one value
if name == "dBm_AntSignal":
# correct for little endian format sign
rssipos = len(fmt)-1
fmt = fmt + self.radiotap_formats[name]
# unfortunately not all platforms work equally well and on my arm
# platform notdecoded was padded with a ton of zeros without
# indicating more fields in pkt.len and/or padding in pkt.pad
decoded = struct.unpack(fmt, pkt.notdecoded[:struct.calcsize(fmt)])
return pkt.addr2, decoded[rssipos]
def packetCallback(pkt):
parsed = parsePacket(pkt)
if parsed:
print(parsed)
sniff("en1", prn=packetCallback) #en1 is a wlan interface on my OSX
不幸的是,函数没有输出任何东西 - 因此没有数据包包含 Radiotap 标头。我尝试使用sniff("en1mon", prn=packetCallback) 激活监控模式,但没有任何进展。
主要问题:
我还发现,Mac OSX 的 en1 接口无法访问 Dot11 标头的某个地方,这是真的吗?如果是这种情况,那么如何从 OSX 上的数据包中获取 RSSI 值?
谢谢!
【问题讨论】: