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 컬럼을 추가하는 통합형 저장 방식으로 리팩토링함.