포르자 호라이즌 5에는 udp로 데이터를 받을 수 있다.
게임 안에서 데이터 출력을 켜짐으로 설정하고 IP 주소와 포트를 설정하면 데이터가 전송된다.
wireshark로 패킷을 보면 처음에는 리시버를 만들지 않았기 때문에 이렇게 나온다.
일단 데이터를 봐야 하니까 파이썬으로 리시버를 만들었다.
만들고 나서 보면 bytes만 보인다.
이걸 해독하려고 계속해서 시도했는데 실패해서 구글에서 게이머들이 텔레메트리를 만든 깃허브 코드를 보며 공부를 했다.
코드를 다 가져오면 불법이라는 생각이 들어서 일부분만 설명해 보려고 한다.
from struct import unpack
sled_format = '<iIfffffffffffffffffffffffffffffffffffffffffffffffffffiiiii'
dash_format = '<iIfffffffffffffffffffffffffffffffffffffffffffffffffffiiiiifffffffffffffffffHBBBBBBbbb'
struck을 이용하여 패킹된 바이너리 데이터로 바이트열을 해석하는 게 가능하다.
struck 모듈은 pack, unpack 등의 기능이 있고 이것들을 사용하여 정수, 부동 소수점 숫자, 문자열을 bytes 객체로 변환하거나 반대로 bytes 객체에서 이것을 빼낼 수 있다.
서식 지정 문자를 unpack에 전달하면 데이터를 추출할 수 있다. 하지만 어떤 서식 지정 문자를 사용했는지 알아야 한다.
위에 적은 코드가 서식 지정 문자이다. 이걸 unpack에 bytes와 함께 보내면 된다.
이렇게 출력이 된다.
이 데이터를 카프카 프로듀서를 이용하여 포르자 호라이즌 토픽에 저장하면 된다.
코드출처 : https://github.com/jasperan/forza-horizon-5-telemetry-listener
struck 설명 출처 :
https://jacking75.github.io/python_binary/
https://docs.python.org/ko/3/library/struct.html