Home | History | Annotate | Download | only in contrib
      1 % PPI/PPI_CACE/PPI_GEOTAG Global Campaign
      2 # Test suite extracted from PPI_GEOLOCATION_SDK.zip\PPI_GEOLOCATION_SDK\pcaps\reference-pcaps\ppi_geo_examples.py
      3 
      4 + PPI Tests
      5 
      6 = Define test suite
      7 
      8 from scapy.contrib.ppi import *
      9 from scapy.contrib.ppi_cace import *
     10 from scapy.contrib.ppi_geotag import *
     11 
     12 def Pkt_10_1():
     13     """GPS Only"""
     14     pkt = PPI(PPIFieldHeaders=GPS(Latitude=40.787743, Longitude=-73.971210))/\
     15             Dot11(addr1="FF:FF:FF:FF:FF:FF",addr2="00:01:02:03:04:05",addr3="00:01:02:09:01:01")/\
     16             Dot11Beacon()/Dot11Elt(ID=0,info="Test-10.1")
     17     return PPI(raw(pkt))
     18 
     19 def Pkt_10_2():
     20     """GPS + VECTOR + ANTENNA + RADIOTAP""" #No radiotap support yet...
     21     pkt = PPI(PPIFieldHeaders=[
     22             GPS(Latitude=40.787743, Longitude=-73.971210),
     23             Vector(VectorFlags=0x02, VectorChars="Antenna", Pitch=90.0, Roll=0.0, Heading=0.0, DescString="Antenna-1 orientation"),
     24             Antenna(AntennaFlags=0x02,Gain=8,HorizBw=360.0,ModelName="8dBi-MagMountOmni"),
     25             Dot11Common(Antsignal=-80,Antnoise=-110,Ch_Freq=2437)])/\
     26             Dot11(addr1="FF:FF:FF:FF:FF:FF",addr2="00:01:02:03:04:05",addr3="00:01:02:09:01:02")/\
     27             Dot11Beacon()/Dot11Elt(ID=0,info="Test-10.2")
     28     return PPI(raw(pkt))
     29 
     30 def Pkt_10_3():
     31     """Direction of travel + one directional antenna, with Pitch in ForwardFrame"""
     32     pkt = PPI(PPIFieldHeaders=[
     33                 GPS(GPSFlags=0x02, Latitude=40.787743, Longitude=-73.971210),
     34                 Vector(VectorFlags=0x03, VectorChars=0x06, Pitch=10.0,  Heading=22.5, DescString="VehicleVec"),
     35                 Sensor(SensorType="Velocity", Val_T=20.0),
     36                 Vector(                  VectorChars=0x01,              Heading=90.0, DescString="AntennaVec"),
     37                 Antenna(AntennaFlags=0x02,Gain=9,HorizBw=120,ModelName="SA24-120-9"),
     38                 Dot11Common(Antsignal=-75,Antnoise=-110,Ch_Freq=2437)])/\
     39                 Dot11(addr1="FF:FF:FF:FF:FF:FF",addr2="00:01:02:03:04:05",addr3="00:01:02:09:01:03")/\
     40                 Dot11Beacon()/Dot11Elt(ID=0,info="Test-10.3")
     41     return PPI(raw(pkt)) #Cause the fields to be built
     42 
     43 def Pkt_10_4():
     44     """Two static directional antennas with offsets"""
     45     pkt = PPI(PPIFieldHeaders=[
     46                 GPS(GPSFlags=0x02, Latitude=40.787743, Longitude=-73.971210, Altitude_g=2.00),
     47                 Vector(VectorFlags=0x03, VectorChars=0x06, Pitch=10.0, Heading=22.5),
     48                 Sensor(SensorType="Velocity", Val_T=8.5),
     49                 Sensor(SensorType="Acceleration", Val_T=0.5),
     50                 Vector(VectorFlags=0x00, VectorChars=0x01, Heading=90.0, Off_X=0.75, Off_Y=0.6, Off_Z=-0.2, DescString="Antenna1Vec"),
     51                 Antenna(AntennaFlags=0x02,Gain=9,HorizBw=120,ModelName="SA24-120-9",DescString="RightAntenna"),
     52                 Dot11Common(Antsignal=-75,Antnoise=-110,Ch_Freq=2437),
     53                 Vector(VectorFlags=0x00, VectorChars=0x01, Heading=270.0, Off_X=-0.75, Off_Y=0.6, Off_Z=-0.2, DescString="Antenna2Vec"),
     54                 Antenna(AntennaFlags=0x02,Gain=9,HorizBw=120,ModelName="SA24-120-9",DescString="LeftAntenna"),
     55                 Dot11Common(Antsignal=-95,Antnoise=-110,Ch_Freq=2437)])/\
     56                 Dot11(addr1="FF:FF:FF:FF:FF:FF",addr2="00:01:02:03:04:05",addr3="00:01:02:09:01:04")/\
     57                 Dot11Beacon()/Dot11Elt(ID=0,info="Test-10.4")
     58     return PPI(raw(pkt)) #Cause the fields to be built
     59 
     60 def Pkt_10_5():
     61     """Similar to 10_3, but with a electronically steerable antenna"""
     62     pkt = PPI(PPIFieldHeaders=[
     63                 GPS(GPSFlags=0x02, Latitude=40.787743, Longitude=-73.971210),
     64                 Vector(VectorFlags=0x03, VectorChars=0x06, Pitch=00.0, Heading=22.5, DescString="VehicleVec"),
     65                 Vector(                  VectorChars=0x01,             Heading=120.0, DescString="AntennaVec"),
     66                 Antenna(AntennaFlags=0x010002,Gain=12,HorizBw=60,BeamID=0xF1A1, ModelName="ElectronicallySteerableExAntenna", AppId=0x04030201),
     67                 Dot11Common(Antsignal=-75,Antnoise=-110,Ch_Freq=2437)])/\
     68                 Dot11(addr1="FF:FF:FF:FF:FF:FF",addr2="00:01:02:03:04:05",addr3="00:01:02:09:01:05")/\
     69                 Dot11Beacon()/Dot11Elt(ID=0,info="Test-10.5")
     70     return PPI(raw(pkt)) #Cause the fields to be built
     71 
     72 def Pkt_10_6():
     73     """Mechanically steerable antenna. Non-intuitive forward"""
     74     pkt = PPI(PPIFieldHeaders=[
     75                GPS(GPSFlags=0x02, Latitude=40.787743, Longitude=-73.971210),
     76                 Vector(VectorFlags=0x02, VectorChars=0x06,  Heading=22.5, DescString="VehicleVec"),
     77                 Vector(VectorFlags=0x03, VectorChars=0x00,  Heading=202.5, DescString="ForwardVec"),
     78                 Vector(VectorFlags=0x00, VectorChars=0x01,  Heading=75.0, DescString="AntennaVec"),
     79                 Antenna(AntennaFlags=0x020002,Gain=12,HorizBw=60,ModelName="MechanicallySteerableAnt"),
     80                 Dot11Common(Antsignal=-77,Antnoise=-110,Ch_Freq=2437)])/\
     81                 Dot11(addr1="FF:FF:FF:FF:FF:FF",addr2="00:01:02:03:04:05",addr3="00:01:02:09:01:06")/\
     82                 Dot11Beacon()/Dot11Elt(ID=0,info="Test-10.6")
     83     return PPI(raw(pkt)) #Cause the fields to be built
     84 
     85 def Pkt_10_7():
     86     """Drifting boat."""
     87     pkt = PPI(PPIFieldHeaders=[
     88                 GPS(GPSFlags=0x02, Latitude= 41.876154,  Longitude=-87.608602),
     89                 Vector(VectorFlags=0x03, VectorChars=0x04,  Heading=50.0, DescString="VehicleVec"),
     90                 Vector(VectorFlags=0x00, VectorChars=0x02,  Heading=230.0, DescString="DOT-Vec"),
     91                 Vector(VectorFlags=0x00, VectorChars=0x01,  Heading=90.0, DescString="AntennaVec"),
     92                 Antenna(AntennaFlags=0x02,Gain=9,HorizBw=120,ModelName="SA24-120-9"),
     93                 Dot11Common(Antsignal=-77,Antnoise=-110,Ch_Freq=2437)])/\
     94                 Dot11(addr1="FF:FF:FF:FF:FF:FF",addr2="00:01:02:03:04:05",addr3="00:01:02:09:01:07")/\
     95                 Dot11Beacon()/Dot11Elt(ID=0,info="Test-10.7")
     96     return PPI(raw(pkt)) #Cause the fields to be built
     97 
     98 def Pkt_10_8():
     99     """Time of arrival analysis"""
    100     pkt = PPI(PPIFieldHeaders=[
    101                 GPS(GPSFlags="Manual Input", Latitude=41.861885, Longitude=-87.616926, GPSTime=1288720719, FractionalTime=0.20),
    102                 Vector(VectorFlags=0x02, VectorChars=0x01, Pitch=90.0, DescString="Antenna-1 orientation"),
    103                 Sensor(SensorType="TDOA_Clock", ScaleFactor=-9, Val_T=60.8754, AppId=0x04030201),
    104                 Antenna(AntennaFlags=0x01,Gain=5,HorizBw=360.0,ModelName="8dBi-Omni", DescString="Signal 1"),
    105                 Dot11Common(Antsignal=-60),
    106                 GPS(GPSFlags="Manual Input", Latitude=41.861904, Longitude=-87.616365, GPSTime=1288720719, FractionalTime=0.20),
    107                 Vector(VectorFlags=0x02, VectorChars=0x01, Pitch=90.0, DescString="Antenna-2 orientation"),
    108                 Sensor(SensorType="TDOA_Clock", ScaleFactor=-9, Val_T=178.124, AppId=0x04030201),
    109                 Antenna(AntennaFlags=0x01,Gain=5,HorizBw=360.0,ModelName="8dBi-Omni", DescString="Signal 2"),
    110                 Dot11Common(Antsignal=-80)])/\
    111                 Dot11(addr1="FF:FF:FF:FF:FF:FF",addr2="00:01:02:03:04:05",addr3="00:01:02:09:01:08")/\
    112                 Dot11Beacon()/Dot11Elt(ID=0,info="Test-10.8")
    113     return PPI(raw(pkt)) #Cause the fields to be built
    114 
    115 def Pkt_10_9():
    116     """Time of arrival analysis(AOA)"""
    117     pkt = PPI(PPIFieldHeaders=[
    118                 GPS(GPSFlags="Manual Input", Latitude=41.861904, Longitude=-87.616365, GPSTime=1288720719, FractionalTime=0.20),
    119                 Vector(VectorFlags=0x02, VectorChars=0x01, Pitch=90.0, DescString="Antenna-2 orientation"),
    120                 Vector(VectorFlags=0x02, VectorChars=0x08, Heading=323.4, Err_Rot=10.0, DescString="AOA at Antenna-2", AppId=0x04030201),
    121                 Antenna(AntennaFlags=0x01,Gain=5,HorizBw=360.0,ModelName="8dBi-Omni", DescString="Signal 2"),
    122                 Dot11Common(Antsignal=-80)])/\
    123                 Dot11(addr1="FF:FF:FF:FF:FF:FF",addr2="00:01:02:03:04:05",addr3="00:01:02:09:01:098")/\
    124                 Dot11Beacon()/Dot11Elt(ID=0,info="Test-10.9")
    125     return PPI(raw(pkt)) #Cause the fields to be built
    126 
    127 def Pkt_10_10():
    128     """Transmitter Position/AOA example"""
    129     pkt = PPI(PPIFieldHeaders=[
    130                 GPS(GPSFlags="Manual Input", Latitude=41.861904, Longitude=-87.616365, GPSTime=1288720719, FractionalTime=0.20),
    131                 Vector(VectorFlags=0x02, VectorChars=0x01, Pitch=90.0, DescString="Antenna-2 orientation"),
    132                 Vector(VectorFlags=0x03, VectorChars=0x08, Heading=323.4, Err_Rot=10.0, DescString="AOA at Antenna-2", AppId=0x04030201),
    133                 Vector(VectorFlags=0x00, VectorChars=0x10, Off_Y=40, Err_Off=2.0, DescString="Transmitter Position", AppId=0x4030201),
    134                 Antenna(AntennaFlags=0x01,Gain=5,HorizBw=360.0,ModelName="8dBi-Omni", DescString="Signal 2"),
    135                 Dot11Common(Antsignal=-80)])/\
    136                 Dot11(addr1="FF:FF:FF:FF:FF:FF",addr2="00:01:02:03:04:05",addr3="00:01:02:09:01:0A")/\
    137                 Dot11Beacon()/Dot11Elt(ID=0,info="Test-10.10")
    138     return PPI(raw(pkt)) #Cause the fields to be built
    139 
    140 def TestPackets():
    141     """Returns a list of test packets"""
    142     return [
    143     ("10.1", Pkt_10_1(), test_Pkt_10_1),
    144     ("10.2", Pkt_10_2(), test_Pkt_10_2),
    145     ("10.3", Pkt_10_3(), test_Pkt_10_3),
    146     ("10.4", Pkt_10_4(), test_Pkt_10_4),
    147     ("10.5", Pkt_10_5(), test_Pkt_10_5),
    148     ("10.6", Pkt_10_6(), test_Pkt_10_6),
    149     ("10.7", Pkt_10_7(), test_Pkt_10_7),
    150     ("10.8", Pkt_10_8(), test_Pkt_10_8),
    151     ("10.9", Pkt_10_9(), test_Pkt_10_9),
    152     ("10.10", Pkt_10_10(), test_Pkt_10_10) ]
    153 
    154 = Pkt_10_1
    155 a = Pkt_10_1()
    156 assert raw(a) == b'\x00\x00\x1c\x00i\x00\x00\x002u\x10\x00\x02\x00\x10\x00\x06\x00\x00\x006\x89\x99\x83\x9c\xb52?\x80\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x01\x02\x03\x04\x05\x00\x01\x02\t\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x00\x00\x00\x00\tTest-10.1'
    157 assert a.PPIFieldHeaders[0].present == 6
    158 assert a.PPIFieldHeaders[0].Latitude == 40.7877430
    159 assert a[Dot11Beacon].beacon_interval == 100
    160 assert a[Dot11Elt].info == b'Test-10.1'
    161 
    162 = Pkt_10_2
    163 a = Pkt_10_2()
    164 a.show()
    165 assert raw(a) == b'\x00\x00\xa9\x00i\x00\x00\x002u\x10\x00\x02\x00\x10\x00\x06\x00\x00\x006\x89\x99\x83\x9c\xb52?3u<\x00\x02\x00<\x00\x1f\x00\x00\x10\x02\x00\x00\x00\x01\x00\x00\x00\x80J]\x05\x00\x00\x00\x00\x00\x00\x00\x00Antenna-1 orientation\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x005u1\x00\x02\x001\x00\x07\x00\x00\x08\x02\x00\x00\x00\x08\x00*u\x158dBi-MagMountOmni\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\t\x00\x00\x00\x00\xb0\x92\x80\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x01\x02\x03\x04\x05\x00\x01\x02\t\x01\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x00\x00\x00\x00\tTest-10.2'
    166 assert isinstance(a.PPIFieldHeaders[0], GPS)
    167 assert a.PPIFieldHeaders[0].present == 6
    168 assert isinstance(a.PPIFieldHeaders[1], Vector)
    169 assert a.PPIFieldHeaders[2].present == 134217735
    170 assert isinstance(a.PPIFieldHeaders[2], Antenna)
    171 assert a.PPIFieldHeaders[2].HorizBw == 360.0
    172 assert isinstance(a.PPIFieldHeaders[3], Dot11Common)
    173 
    174 = Pkt_10_3
    175 a = Pkt_10_3()
    176 assert raw(a) == b"\x00\x00\xef\x00i\x00\x00\x002u\x14\x00\x02\x00\x14\x00\x07\x00\x00\x00\x02\x00\x00\x006\x89\x99\x83\x9c\xb52?3u8\x00\x02\x008\x00\x17\x00\x00\x10\x03\x00\x00\x00\x06\x00\x00\x00\x80\x96\x98\x00\xa0RW\x01VehicleVec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x004u\x0e\x00\x02\x00\x0e\x00!\x00\x00\x00\x01\x00@\xdfLk3u0\x00\x02\x000\x00\x12\x00\x00\x10\x01\x00\x00\x00\x80J]\x05AntennaVec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x005u1\x00\x02\x001\x00\x07\x00\x00\x08\x02\x00\x00\x00\t\x00\x0e'\x07SA24-120-9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\t\x00\x00\x00\x00\xb5\x92\x80\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x01\x02\x03\x04\x05\x00\x01\x02\t\x01\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x00\x00\x00\x00\tTest-10.3"
    177 
    178 = Pkt_10_4
    179 a = Pkt_10_4()
    180 assert raw(a) == b"\x00\x00\xc6\x01i\x00\x00\x002u\x18\x00\x02\x00\x18\x00\x17\x00\x00\x00\x02\x00\x00\x006\x89\x99\x83\x9c\xb52?  Jk3u\x18\x00\x02\x00\x18\x00\x17\x00\x00\x00\x03\x00\x00\x00\x06\x00\x00\x00\x80\x96\x98\x00\xa0RW\x014u\x0e\x00\x02\x00\x0e\x00!\x00\x00\x00\x01\x00\x08\x1eKk4u\x0e\x00\x02\x00\x0e\x00!\x00\x00\x00\x02\x00\x88\xe5Ik3u@\x00\x02\x00@\x00\xf3\x00\x00\x10\x00\x00\x00\x00\x01\x00\x00\x00\x80J]\x05L\xefIkp\xe9Ik0\xcaIkAntenna1Vec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x005uQ\x00\x02\x00Q\x00\x07\x00\x00\x18\x02\x00\x00\x00\t\x00\x0e'\x07SA24-120-9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00RightAntenna\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\t\x00\x00\x00\x00\xb5\x923u@\x00\x02\x00@\x00\xf3\x00\x00\x10\x00\x00\x00\x00\x01\x00\x00\x00\x80\xdf\x17\x10\xb4\xb4Ikp\xe9Ik0\xcaIkAntenna2Vec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x005uQ\x00\x02\x00Q\x00\x07\x00\x00\x18\x02\x00\x00\x00\t\x00\x0e'\x07SA24-120-9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00LeftAntenna\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\t\x00\x00\x00\x00\xa1\x92\x80\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x01\x02\x03\x04\x05\x00\x01\x02\t\x01\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x00\x00\x00\x00\tTest-10.4"
    181 
    182 = Pkt_10_5
    183 a = Pkt_10_5()
    184 a.show()
    185 assert isinstance(a, PPI)
    186 assert raw(a) == b"\x00\x00\xe3\x00i\x00\x00\x002u\x14\x00\x02\x00\x14\x00\x07\x00\x00\x00\x02\x00\x00\x006\x89\x99\x83\x9c\xb52?3u8\x00\x02\x008\x00\x17\x00\x00\x10\x03\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\xa0RW\x01VehicleVec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x003u0\x00\x02\x000\x00\x12\x00\x00\x10\x01\x00\x00\x00\x00\x0e'\x07AntennaVec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x005u7\x00\x02\x007\x00'\x00\x00(\x02\x00\x01\x00\x0c\x00\x87\x93\x03\xa1\xf1ElectronicallySteerableExAntenna\x01\x02\x03\x04\x02\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\t\x00\x00\x00\x00\xb5\x92\x80\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x01\x02\x03\x04\x05\x00\x01\x02\t\x01\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x00\x00\x00\x00\tTest-10.5"
    187 
    188 = Pkt_10_6
    189 a = Pkt_10_6()
    190 assert raw(a) == b'\x00\x00\x15\x01i\x00\x00\x002u\x14\x00\x02\x00\x14\x00\x07\x00\x00\x00\x02\x00\x00\x006\x89\x99\x83\x9c\xb52?3u4\x00\x02\x004\x00\x13\x00\x00\x10\x02\x00\x00\x00\x06\x00\x00\x00\xa0RW\x01VehicleVec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x003u4\x00\x02\x004\x00\x13\x00\x00\x10\x03\x00\x00\x00\x00\x00\x00\x00\xa0\xe7\x11\x0cForwardVec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x003u4\x00\x02\x004\x00\x13\x00\x00\x10\x00\x00\x00\x00\x01\x00\x00\x00\xc0hx\x04AntennaVec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x005u1\x00\x02\x001\x00\x07\x00\x00\x08\x02\x00\x02\x00\x0c\x00\x87\x93\x03MechanicallySteerableAnt\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\t\x00\x00\x00\x00\xb3\x92\x80\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x01\x02\x03\x04\x05\x00\x01\x02\t\x01\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x00\x00\x00\x00\tTest-10.6'
    191 
    192 = Pkt_10_7
    193 a = Pkt_10_7()
    194 assert raw(a) == b"\x00\x00\x15\x01i\x00\x00\x002u\x14\x00\x02\x00\x14\x00\x07\x00\x00\x00\x02\x00\x00\x00D\x9d?\x84\xfc\xce\x1173u4\x00\x02\x004\x00\x13\x00\x00\x10\x03\x00\x00\x00\x04\x00\x00\x00\x80\xf0\xfa\x02VehicleVec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x003u4\x00\x02\x004\x00\x13\x00\x00\x10\x00\x00\x00\x00\x02\x00\x00\x00\x80\x85\xb5\rDOT-Vec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x003u4\x00\x02\x004\x00\x13\x00\x00\x10\x00\x00\x00\x00\x01\x00\x00\x00\x80J]\x05AntennaVec\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x005u1\x00\x02\x001\x00\x07\x00\x00\x08\x02\x00\x00\x00\t\x00\x0e'\x07SA24-120-9\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x85\t\x00\x00\x00\x00\xb3\x92\x80\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x01\x02\x03\x04\x05\x00\x01\x02\t\x01\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x00\x00\x00\x00\tTest-10.7"
    195 assert a.PPIFieldHeaders[5].Antnoise == -110
    196 assert isinstance(a[Dot11].payload, Dot11Beacon)
    197 
    198 = Pkt_10_8
    199 a = Pkt_10_8()
    200 a.show()
    201 assert raw(a) == b'\x00\x00\xc0\x01i\x00\x00\x002u\x1c\x00\x02\x00\x1c\x00g\x00\x00\x00\x80\x00\x00\x00\xe2o=\x84\xd4\x89\x107L\xd0QO\x00\xc2\xeb\x0b3u4\x00\x02\x004\x00\x07\x00\x00\x10\x02\x00\x00\x00\x01\x00\x00\x00\x80J]\x05Antenna-1 orientation\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x004u\x13\x00\x02\x00\x13\x00#\x00\x00 \xd0\x07\xf7\xf2\x1bSk\x01\x02\x03\x045uQ\x00\x02\x00Q\x00\x07\x00\x00\x18\x01\x00\x00\x00\x05\x00*u\x158dBi-Omni\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Signal 1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4\x802u\x1c\x00\x02\x00\x1c\x00g\x00\x00\x00\x80\x00\x00\x00\xa0p=\x84\xbe\x9f\x107L\xd0QO\x00\xc2\xeb\x0b3u4\x00\x02\x004\x00\x07\x00\x00\x10\x02\x00\x00\x00\x01\x00\x00\x00\x80J]\x05Antenna-2 orientation\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x004u\x13\x00\x02\x00\x13\x00#\x00\x00 \xd0\x07\xf7\xf8\xffdk\x01\x02\x03\x045uQ\x00\x02\x00Q\x00\x07\x00\x00\x18\x01\x00\x00\x00\x05\x00*u\x158dBi-Omni\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Signal 2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x80\x80\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x01\x02\x03\x04\x05\x00\x01\x02\t\x01\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x00\x00\x00\x00\tTest-10.8'
    202 assert isinstance(a.PPIFieldHeaders[7], Sensor)
    203 assert a.PPIFieldHeaders[7].ScaleFactor == -9
    204 assert a.PPIFieldHeaders[7].pfh_length == 19
    205 
    206 = Pkt_10_9
    207 a = Pkt_10_9()
    208 assert raw(a) == b'\x00\x00\r\x01i\x00\x00\x002u\x1c\x00\x02\x00\x1c\x00g\x00\x00\x00\x80\x00\x00\x00\xa0p=\x84\xbe\x9f\x107L\xd0QO\x00\xc2\xeb\x0b3u4\x00\x02\x004\x00\x07\x00\x00\x10\x02\x00\x00\x00\x01\x00\x00\x00\x80J]\x05Antenna-2 orientation\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x003u<\x00\x02\x00<\x00\x13\x00\x010\x02\x00\x00\x00\x08\x00\x00\x00@\xb1F\x13\x80\x96\x98\x00AOA at Antenna-2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x045uQ\x00\x02\x00Q\x00\x07\x00\x00\x18\x01\x00\x00\x00\x05\x00*u\x158dBi-Omni\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Signal 2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x80\x80\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x01\x02\x03\x04\x05\x00\x01\x02\t\x01\x98\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x00\x00\x00\x00\tTest-10.9'
    209 assert a.PPIFieldHeaders[2].DescString == b'AOA at Antenna-2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
    210 
    211 = Pkt_10_10
    212 a = Pkt_10_10()
    213 assert raw(a) == b'\x00\x00M\x01i\x00\x00\x002u\x1c\x00\x02\x00\x1c\x00g\x00\x00\x00\x80\x00\x00\x00\xa0p=\x84\xbe\x9f\x107L\xd0QO\x00\xc2\xeb\x0b3u4\x00\x02\x004\x00\x07\x00\x00\x10\x02\x00\x00\x00\x01\x00\x00\x00\x80J]\x05Antenna-2 orientation\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x003u<\x00\x02\x00<\x00\x13\x00\x010\x03\x00\x00\x00\x08\x00\x00\x00@\xb1F\x13\x80\x96\x98\x00AOA at Antenna-2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x043u<\x00\x02\x00<\x00C\x00\x020\x00\x00\x00\x00\x10\x00\x00\x00\x80\xecOk  JkTransmitter Position\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x045uQ\x00\x02\x00Q\x00\x07\x00\x00\x18\x01\x00\x00\x00\x05\x00*u\x158dBi-Omni\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Signal 2\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x80\x80\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x01\x02\x03\x04\x05\x00\x01\x02\t\x01\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x00\x00\x00\x00\nTest-10.10'
    214 assert a.PPIFieldHeaders[0].GPSTime == 1288720719
    215 assert a.PPIFieldHeaders[4].ModelName == b'8dBi-Omni\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
    216 assert isinstance(a.PPIFieldHeaders[3], Vector)
    217 assert a.PPIFieldHeaders[3].pfh_type == 30003
    218 assert a.PPIFieldHeaders[3].Off_Y == 40.0
    219 assert a.PPIFieldHeaders[3].Err_Off == 2.0
    220 
    221 = All-in-one packet
    222 # Extracted from PPI_GEOLOCATION_SDK.zip\PPI_GEOLOCATION_SDK\pcaps\reference-pcaps\all-ppi-geo-fields.py
    223 a = hex_bytes(b'00008a02690000003275900002029000ff03007002000000368999839cb5323fa0584b6b406e4a6b4f51d04cffffffff40420f0080841e00005ed0b2416c6c4669656c64734750535061636b6574000000000000000000000000000004030201414243442e2e2e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003375900002029000ff000370ff0000000800000080969800002d3101e09da30110f9496b20204a6b0055496b80c3c90128604d6b46756c6c7946696c6c65644f7574566563746f720000000000000000000000000403020141424344000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034757f0002027f007f0000700100ff4014596b8056686bc098776b00db866b50954a6b4d616465557056656c6f63697479730000000000000000000000000000000000010203044142434400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003575bb000102bb003f00007c0200000009000e2707002d310160f59000b2a13030303030310000000000000000000000000000000000000000000000000000534132342d3132302d39000000000000000000000000000000000000000000004c656674416e74656e6e610000000000000000000000000000000000000000000102030441424344000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002001400000000000000000000000000850900000000a19280000000ffffffffffff0001020304050001020901040000000000000000000064000000000b546573742d53656e736f72')
    224 pkt = PPI(a)
    225 assert isinstance(pkt.PPIFieldHeaders[0], GPS)
    226 assert pkt.PPIFieldHeaders[0].present == 1879049215
    227 assert isinstance(pkt.PPIFieldHeaders[1], Vector)
    228 assert pkt.PPIFieldHeaders[1].present == 1879245055
    229 assert isinstance(pkt.PPIFieldHeaders[3], Antenna)
    230 assert repr(pkt.PPIFieldHeaders[3].present) == "<Flag 2080374847 (AntennaFlags+Gain+HorizBw+VertBw+PrecisionGain+BeamID+SerialNumber+ModelName+DescString+AppId+AppData)>"
    231 assert isinstance(pkt.PPIFieldHeaders[4], Dot11Common)
    232 assert isinstance(pkt[Dot11][Dot11Beacon].payload, Dot11Elt)
    233 assert pkt[Dot11Elt].info == b'Test-Sensor'
    234 assert pkt[Dot11Elt].ID == 0
    235 
    236 = All-wrong-data packet
    237 pkt = PPI(PPIFieldHeaders=[
    238             GPS(GPSFlags="Manual Input", Latitude=-181, Longitude=181, GPSTime=1288720719, FractionalTime=-1, ept=100, eph=-1, epv=1000, Altitude=-999999, Altitude_g=999999),
    239             Vector(VectorFlags="DefinesForward+RelativeToEarth", VectorChars=0x08, Heading=323.4, Err_Rot=10.0, DescString="AOA at Antenna-2", AppId=0x04030201),
    240             Antenna(AntennaFlags=0x01,Gain=5,HorizBw=360.0,ModelName="8dBi-Omni", DescString="Signal 2"),
    241             Dot11Common(Antsignal=-80)])/\
    242             Dot11(addr1="FF:FF:FF:FF:FF:FF",addr2="00:01:02:03:04:05",addr3="00:01:02:09:01:0A")/\
    243             Dot11Beacon()/Dot11Elt(ID=0,info="Test-allwrong")
    244 pkt = PPI(raw(pkt))
    245 pkt.show()
    246 assert pkt.PPIFieldHeaders[0].Latitude == -180.0
    247 assert pkt.PPIFieldHeaders[0].Longitude == 180.0
    248 assert pkt.PPIFieldHeaders[0].Altitude == -180000.0
    249 assert pkt.PPIFieldHeaders[0].Altitude_g == 180000.0
    250 assert pkt.PPIFieldHeaders[0].epv < 1000
    251 assert pkt.PPIFieldHeaders[0].ept < 5
    252 assert pkt.PPIFieldHeaders[0].FractionalTime == 0.0
    253