1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
|
"""Generate mock discovery packet for testing."""
import logging
import os
import socket
import struct
_LOGGER = logging.getLogger(__name__)
# Define the path to save the fixture
fixture_dir = os.path.join(os.path.dirname(__file__), "../fixtures") # noqa: PTH118, PTH120
os.makedirs(fixture_dir, exist_ok=True) # Ensure the directory exists # noqa: PTH103
fixture_path = os.path.join(fixture_dir, "airos_sta_discovery_packet.bin") # noqa: PTH118
# Header: 0x01 0x06 (2 bytes) + 4 reserved bytes = 6 bytes
HEADER = b"\x01\x06\x00\x00\x00\x00"
# --- Scrubbed Values ---
SCRUBBED_MAC = "01:23:45:67:89:CD"
SCRUBBED_MAC_BYTES = bytes.fromhex(SCRUBBED_MAC.replace(":", ""))
SCRUBBED_IP = "192.168.1.3"
SCRUBBED_IP_BYTES = socket.inet_aton(SCRUBBED_IP)
SCRUBBED_HOSTNAME = "name"
SCRUBBED_HOSTNAME_BYTES = SCRUBBED_HOSTNAME.encode("utf-8")
# --- Values from provided "schuur" JSON (not scrubbed) ---
FIRMWARE_VERSION = "WA.V8.7.17"
FIRMWARE_VERSION_BYTES = FIRMWARE_VERSION.encode("ascii")
UPTIME_SECONDS = 265375
MODEL = "NanoStation 5AC loco"
MODEL_BYTES = MODEL.encode("ascii")
SSID = "DemoSSID"
SSID_BYTES = SSID.encode("utf-8")
FULL_MODEL_NAME = (
"NanoStation 5AC loco" # Using the same as Model, as is often the case
)
FULL_MODEL_NAME_BYTES = FULL_MODEL_NAME.encode("utf-8")
# TLV Type 0x06: MAC Address (fixed 6-byte value)
TLV_MAC_TYPE = b"\x06"
TLV_MAC = TLV_MAC_TYPE + SCRUBBED_MAC_BYTES
# TLV Type 0x02: MAC + IP Address (10 bytes value, with 2-byte length field)
# Value contains first 6 bytes often MAC, last 4 bytes IP
TLV_IP_TYPE = b"\x02"
TLV_IP_VALUE = (
SCRUBBED_MAC_BYTES + SCRUBBED_IP_BYTES
) # 6 bytes MAC + 4 bytes IP = 10 bytes
TLV_IP_LENGTH = len(TLV_IP_VALUE).to_bytes(2, "big")
TLV_IP = TLV_IP_TYPE + TLV_IP_LENGTH + TLV_IP_VALUE
# TLV Type 0x03: Firmware Version (variable length string)
TLV_FW_TYPE = b"\x03"
TLV_FW_LENGTH = len(FIRMWARE_VERSION_BYTES).to_bytes(2, "big")
TLV_FW = TLV_FW_TYPE + TLV_FW_LENGTH + FIRMWARE_VERSION_BYTES
# TLV Type 0x0A: Uptime (4-byte integer)
TLV_UPTIME_TYPE = b"\x0a"
TLV_UPTIME_VALUE = struct.pack(">I", UPTIME_SECONDS) # Unsigned int, big-endian
TLV_UPTIME_LENGTH = len(TLV_UPTIME_VALUE).to_bytes(2, "big")
TLV_UPTIME = TLV_UPTIME_TYPE + TLV_UPTIME_LENGTH + TLV_UPTIME_VALUE
# TLV Type 0x0B: Hostname (variable length string)
TLV_HOSTNAME_TYPE = b"\x0b"
TLV_HOSTNAME_LENGTH = len(SCRUBBED_HOSTNAME_BYTES).to_bytes(2, "big")
TLV_HOSTNAME = TLV_HOSTNAME_TYPE + TLV_HOSTNAME_LENGTH + SCRUBBED_HOSTNAME_BYTES
# TLV Type 0x0C: Model (variable length string)
TLV_MODEL_TYPE = b"\x0c"
TLV_MODEL_LENGTH = len(MODEL_BYTES).to_bytes(2, "big")
TLV_MODEL = TLV_MODEL_TYPE + TLV_MODEL_LENGTH + MODEL_BYTES
# TLV Type 0x0D: SSID (variable length string)
TLV_SSID_TYPE = b"\x0d"
TLV_SSID_LENGTH = len(SSID_BYTES).to_bytes(2, "big")
TLV_SSID = TLV_SSID_TYPE + TLV_SSID_LENGTH + SSID_BYTES
# TLV Type 0x14: Full Model Name (variable length string)
TLV_FULL_MODEL_TYPE = b"\x14"
TLV_FULL_MODEL_LENGTH = len(FULL_MODEL_NAME_BYTES).to_bytes(2, "big")
TLV_FULL_MODEL = TLV_FULL_MODEL_TYPE + TLV_FULL_MODEL_LENGTH + FULL_MODEL_NAME_BYTES
# Combine all parts
FULL_PACKET = (
HEADER
+ TLV_MAC
+ TLV_IP
+ TLV_FW
+ TLV_UPTIME
+ TLV_HOSTNAME
+ TLV_MODEL
+ TLV_SSID
+ TLV_FULL_MODEL
)
# Write the actual binary file
with open(fixture_path, "wb") as f: # noqa: PTH123
f.write(FULL_PACKET)
log = f"Generated discovery packet fixture at: {fixture_path}"
log += f"Packet length: {len(FULL_PACKET)} bytes"
log += f"Packet hex: {FULL_PACKET.hex()}"
_LOGGER.info(log)
|