背景
  
  
   我试图从收到的数据包中获取RSSI。我知道它们在Radiotap报头中可用,但不幸的是,我无法嗅到任何包含Radiotap报头的包。
  
  
   我确实发现
   
    parsePacket
   
   方法来自
   
    scapy-rssi
   
   ,它似乎只过滤出包含带有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值呢?
  
  
   谢谢您!