scapy.contrib.nrf_sniffer

nRF sniffer

Firmware and documentation related to this module is available at: https://www.nordicsemi.com/Software-and-Tools/Development-Tools/nRF-Sniffer https://github.com/adafruit/Adafruit_BLESniffer_Python https://github.com/wireshark/wireshark/blob/master/epan/dissectors/packet-nordic_ble.c

class scapy.contrib.nrf_sniffer.NRF2_Packet_Event(_pkt, /, *, header_len=10, reserved=0, phy=None, mic=None, encrypted=None, direction=None, crc_ok=1, rf_channel=0, rssi=-256, event_counter=0, delta_time=0)[source]

Bases: Packet

aliastypes = [<class 'scapy.contrib.nrf_sniffer.NRF2_Packet_Event'>, <class 'scapy.packet.Packet'>]
fields_desc: ClassVar[List[Field[Any, Any] | _FieldContainer]] = [<ByteField (NRF2_Packet_Event).header_len>, <BitField (NRF2_Packet_Event).reserved>, <BitEnumField (NRF2_Packet_Event).phy>, <BitField (NRF2_Packet_Event).mic>, <BitField (NRF2_Packet_Event).encrypted>, <BitField (NRF2_Packet_Event).direction>, <BitField (NRF2_Packet_Event).crc_ok>, <ByteField (NRF2_Packet_Event).rf_channel>, <ScalingField (NRF2_Packet_Event).rssi>, <LEShortField (NRF2_Packet_Event).event_counter>, <LEIntField (NRF2_Packet_Event).delta_time>]
payload_guess: List[Tuple[Dict[str, Any], Type[Packet]]] = [({}, <class 'scapy.layers.bluetooth4LE.BTLE'>)]
class scapy.contrib.nrf_sniffer.NRF2_Ping_Request(_pkt, /)[source]

Bases: Packet

aliastypes = [<class 'scapy.contrib.nrf_sniffer.NRF2_Ping_Request'>, <class 'scapy.packet.Packet'>]
class scapy.contrib.nrf_sniffer.NRF2_Ping_Response(_pkt, /, *, version=None)[source]

Bases: Packet

aliastypes = [<class 'scapy.contrib.nrf_sniffer.NRF2_Ping_Response'>, <class 'scapy.packet.Packet'>]
fields_desc: ClassVar[List[Field[Any, Any] | _FieldContainer]] = [<LEShortField (NRF2_Ping_Response).version>]
class scapy.contrib.nrf_sniffer.NRFS2_PCAP(_pkt, /, *, board_id=0)[source]

Bases: Packet

PCAP headers for DLT_NORDIC_BLE.

Nordic’s capture scripts either stick the COM port number (yep!) or a random number at the start of every packet.

https://github.com/wireshark/wireshark/blob/master/epan/dissectors/packet-nordic_ble.c

The only “rule” is that we can’t start packets with BE EF, otherwise it becomes a “0.9.7” packet. So we just set “0” here.

aliastypes = [<class 'scapy.contrib.nrf_sniffer.NRFS2_PCAP'>, <class 'scapy.packet.Packet'>]
fields_desc: ClassVar[List[Field[Any, Any] | _FieldContainer]] = [<ByteField (NRFS2_PCAP).board_id>]
payload_guess: List[Tuple[Dict[str, Any], Type[Packet]]] = [({}, <class 'scapy.contrib.nrf_sniffer.NRFS2_Packet'>)]
class scapy.contrib.nrf_sniffer.NRFS2_Packet(_pkt, /, *, len=None, version=2, counter=None, type=None)[source]

Bases: Packet

nRF Sniffer v2 Packet

aliastypes = [<class 'scapy.contrib.nrf_sniffer.NRFS2_Packet'>, <class 'scapy.packet.Packet'>]
answer(other)[source]
fields_desc: ClassVar[List[Field[Any, Any] | _FieldContainer]] = [<LenField (NRFS2_Packet).len>, <ByteField (NRFS2_Packet).version>, <LEShortField (NRFS2_Packet).counter>, <ByteEnumField (NRFS2_Packet).type>]
payload_guess: List[Tuple[Dict[str, Any], Type[Packet]]] = [({'type': 13}, <class 'scapy.contrib.nrf_sniffer.NRF2_Ping_Request'>), ({'type': 14}, <class 'scapy.contrib.nrf_sniffer.NRF2_Ping_Response'>), ({'type': 6}, <class 'scapy.contrib.nrf_sniffer.NRF2_Packet_Event'>)]
post_build(p, pay)[source]