Разработать навигатор для игры? Смотрите! (часть 2.2)

Как игра заговорила с Python: UDP listener для виртуальной машины

После включения телеметрии Forza начинает слать UDP-пакеты. Звучит почти романтично, пока не вспоминаешь, что UDP не обещает тебе вообще ничего: пакет может прийти, не прийти, прийти коротким, прийти не тогда, когда ты готов.

Поэтому первый рабочий кирпич - listener. Он сидит на порту, принимает данные, проверяет размер и только потом распаковывает пакет.

```python def parse_packet(data: bytes): values = struct.unpack(FH6_STRUCT_FORMAT, data[:FH6_STRUCT_SIZE]) return dict(zip((name for name, _ in FH6_FIELDS), values)) def udp_listener(bind: str, port: int, stop_event): sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.bind((bind, port)) sock.settimeout(0.2) while not stop_event.is_set(): try: data, _addr = sock.recvfrom(2048) except socket.timeout: continue if len(data) < FH6_STRUCT_SIZE: STATE.mark_short_packet(len(data)) continue STATE.update_from_packet(parse_packet(data), len(data)) ```

Дальше из сырого пакета собирается живое состояние машины: скорость переводится в км/ч, педали - в проценты, обороты - в нормальные значения, координаты сохраняются в snapshot.

И еще важный момент: телефон не подключается к игре. Телефон подключается к моему локальному серверу. Игра ничего не знает про телефон, телефон ничего не знает про бинарную телеметрию. Посередине сидит Python и делает вид, что так и было задумано.

Если вам интересно посмотреть проект целиком - ссылка на мой GitHub в описании профиля.