udsobdsqliteconcurrencyrefactoring
[OBD Acquisition & Kinematics] UDS 프로토콜 확장성 개선 및 병렬 데이터 처리 정합성 확보
• 2 min read
하드코딩된 메시지 처리 방식을 제거하고, 다양한 DID(Data Identifier) 확장을 지원하는 동적 데이터 수집 아키텍처로 리팩토링했다. 고빈도 병렬 데이터 수집 시 발생하는 타임스탬프 충돌 문제와 데이터 유실을 해결했다.
[Python / UDS Parser] DID 라우팅 아키텍처 및 메시지 핸들링 디커플링
_process_cycle로직을 분리하여 각 UDS 응답을 DID 단위로 매핑하여 분기 처리할 수 있는 라우팅 구조로 개편함.- 기존의 정적 튜플 데이터 생성 방식을 폐기하고
**kwargs기반의 동적 매핑 시스템을 도입함. - 이를 통해
settings.yaml파일의 설정만으로 신규 UDS 요청과 추가 신호(가속 페달, 브레이크 페달 포지션 등)를 시스템 재작성 없이 확장할 수 있도록 아키텍처를 개선함.
[SQLite / Database] 동시성 처리에 따른 타임스탬프 충돌 방지 로직
- 고빈도 병렬 UDS 응답(예: 730h 및 7E1h 동시 수신) 시 발생하는 SQLite 타임스탬프 충돌(
UNIQUE constraint failed) 문제를 디버깅하고 해결함. - 기존 기본키(Primary Key)로 사용하던
timestamp컬럼을 일반 인덱스로 변경하고, 시스템 식별자로INTEGER PRIMARY KEY AUTOINCREMENT를 도입함. - 동일 타임스탬프 레코드의 덮어쓰기 유실을 방지하기 위해 마이크로초 단위의 논리적 오프셋(
ts = self.last_ts + 1e-6) 부여 로직을 적용하여 병렬 수신 환경에서의 데이터 삽입 무결성을 보장함.
[UDS / Network] 진단 세션 관리 제거 및 통신 아키텍처 단순화
- UDS 진단 세션 유지를 위해 구현되었던 Keep-Alive 로직(
_manage_session), 타임아웃, 홀드 시간 관련 설정을 시스템에서 전면 제거함. - 별도의 세션 전환 절차 없이 직접 데이터 요청(Data Request)을 송수신하도록 통신 아키텍처를 단순화함.
- 이전 주차에 구현한 분리형 원본 메시지 보관 방식을 재검토하여, 메인 데이터 테이블 내에
raw_message컬럼을 추가하는 통합형 저장 방식으로 리팩토링함.