UpdateFirmware 개요
UpdateFirmware는 중앙 시스템(CSMS)에서 충전소로 보내는 펌웨어 업데이트 요청 메시지입니다. 이 메시지를 통해 CSMS는 충전소의 펌웨어를 원격으로 업데이트할 수 있으며, 보안 패치, 기능 개선, 버그 수정 등을 효율적으로 배포하여 충전 네트워크의 안정성과 보안성을 유지할 수 있습니다.
메시지 구조
Request (CSMS → 충전소)
{
"requestId": 12345,
"firmware": {
"location": "https://firmware.csms.com/updates/station_fw_v2.1.5.bin",
"retrieveDateTime": "2024-08-20T23:00:00.000Z",
"installDateTime": "2024-08-21T02:00:00.000Z",
"signingCertificate": "-----BEGIN CERTIFICATE-----\nMIIC...certificate content...
\n-----END CERTIFICATE-----",
"signature": "SHA256:a1b2c3d4e5f6..."
},
"retries": 3,
"retryInterval": 300
}
Response (충전소 → CSMS)
{
"status": "Accepted",
"statusInfo": {
"reasonCode": "NoError",
"additionalInfo": "펌웨어 업데이트가 예약되었습니다. 설치 예정: 2024-08-21 02:00:00"
}
}
주요 필드 설명
Request 필드들
requestId 필드 (필수)
필드명 |
필수여부 |
타입 |
설명 |
requestId |
필수 |
Integer |
고유한 요청 식별자 (FirmwareStatusNotification에서 참조) |
firmware 필드 (필수)
필드명 |
필수여부 |
타입 |
설명 |
location |
필수 |
String |
펌웨어 파일 다운로드 URL |
retrieveDateTime |
필수 |
DateTime |
펌웨어 다운로드 시작 시간 |
installDateTime |
선택사항 |
DateTime |
펌웨어 설치 시작 시간 |
signingCertificate |
선택사항 |
String |
펌웨어 서명 검증용 인증서 |
signature |
선택사항 |
String |
펌웨어 파일의 디지털 서명 |
retries 필드 (선택사항)
필드명 |
필수여부 |
타입 |
설명 |
retries |
선택사항 |
Integer |
다운로드 실패 시 재시도 횟수 (기본값: 3) |
retryInterval 필드 (선택사항)
필드명 |
필수여부 |
타입 |
설명 |
retryInterval |
선택사항 |
Integer |
재시도 간격 (초 단위, 기본값: 300) |
Response 필드들
status 필드 (필수)
값 |
설명 |
Accepted |
승인됨 - 펌웨어 업데이트 요청 수락 |
Rejected |
거부됨 - 펌웨어 업데이트 불가 |
AcceptedCanceled |
승인되었으나 취소됨 - 이전 업데이트 취소 후 새 요청 수행 |
statusInfo 필드 (선택사항)
필드명 |
필수여부 |
타입 |
설명 |
reasonCode |
선택사항 |
String |
상태 이유 코드 |
additionalInfo |
선택사항 |
String |
추가 상세 정보 |
실제 사용 예제
예제 1: 일반적인 펌웨어 업데이트
// Request
{
"requestId": 12345,
"firmware": {
"location": "https://secure-fw.csms.com/v2.1.5/charger_firmware.bin",
"retrieveDateTime": "2024-08-20T23:30:00.000Z",
"installDateTime": "2024-08-21T02:00:00.000Z",
"signingCertificate": "-----BEGIN CERTIFICATE-----\nMIIEpDCCAowCCQC4vC8...
\n-----END CERTIFICATE-----",
"signature": "SHA256:a1b2c3d4e5f6789012345678901234567890abcdef"
},
"retries": 3,
"retryInterval": 600
}
// Response
{
"status": "Accepted",
"statusInfo": {
"reasonCode": "NoError",
"additionalInfo": "펌웨어 v2.1.5 업데이트 예약됨. 다운로드: 23:30, 설치: 02:00"
}
}
예제 2: 즉시 설치 (installDateTime 미지정)
// Request
{
"requestId": 12346,
"firmware": {
"location": "https://hotfix.csms.com/security_patch_v2.1.4.1.bin",
"retrieveDateTime": "2024-08-20T15:00:00.000Z",
"signingCertificate": "-----BEGIN CERTIFICATE-----\nMIIEpDCCAowCCQC...
\n-----END CERTIFICATE-----",
"signature": "SHA256:hotfix123456789abcdef0123456789"
},
"retries": 5,
"retryInterval": 180
}
// Response
{
"status": "Accepted",
"statusInfo": {
"reasonCode": "UrgentSecurityPatch",
"additionalInfo": "보안 핫픽스 다운로드 후 즉시 설치 예정. 충전 서비스는 약
10분간 중단됩니다"
}
}
예제 3: 업데이트 거부 (진행 중인 충전)
// Request
{
"requestId": 12347,
"firmware": {
"location": "https://firmware.csms.com/v2.2.0/major_update.bin",
"retrieveDateTime": "2024-08-20T14:00:00.000Z",
"installDateTime": "2024-08-20T14:30:00.000Z"
}
}
// Response
{
"status": "Rejected",
"statusInfo": {
"reasonCode": "ActiveTransactions",
"additionalInfo": "활성 충전 세션 3개가 진행 중입니다. 예상 완료 시간: 16:30"
}
}
예제 4: 저장 공간 부족으로 거부
// Request
{
"requestId": 12348,
"firmware": {
"location": "https://firmware.csms.com/v3.0.0/full_system_update.bin",
"retrieveDateTime": "2024-08-20T20:00:00.000Z",
"installDateTime": "2024-08-21T01:00:00.000Z"
}
}
// Response
{
"status": "Rejected",
"statusInfo": {
"reasonCode": "InsufficientStorage",
"additionalInfo": "저장 공간 부족. 필요: 128MB, 사용 가능: 45MB.
로그 정리 후 재시도 권장"
}
}
예제 5: 이전 업데이트 취소 후 새 요청 수행
// Request
{
"requestId": 12349,
"firmware": {
"location": "https://priority-fw.csms.com/critical_fix_v2.1.6.bin",
"retrieveDateTime": "2024-08-20T16:00:00.000Z",
"installDateTime": "2024-08-20T16:15:00.000Z",
"signature": "SHA256:critical987654321fedcba"
},
"retries": 1,
"retryInterval": 60
}
// Response
{
"status": "AcceptedCanceled",
"statusInfo": {
"reasonCode": "HigherPriority",
"additionalInfo": "이전 업데이트(ID: 12345) 취소됨. 긴급 수정사항 우선 적용"
}
}
예제 6: 서명 검증 실패
// Request
{
"requestId": 12350,
"firmware": {
"location": "https://firmware.csms.com/test/unsigned_firmware.bin",
"retrieveDateTime": "2024-08-20T17:00:00.000Z"
}
}
// Response
{
"status": "Rejected",
"statusInfo": {
"reasonCode": "SecurityPolicy",
"additionalInfo": "서명되지 않은 펌웨어는 보안 정책에 의해 설치할 수 없습니다"
}
}
펌웨어 업데이트 프로세스
1단계: 업데이트 요청 및 승인
CSMS → UpdateFirmware → 충전소
충전소 → Response(Accepted) → CSMS
2단계: 다운로드 프로세스
충전소 → FirmwareStatusNotification(Downloading) → CSMS
충전소 → FirmwareStatusNotification(Downloaded) → CSMS
3단계: 설치 프로세스
충전소 → FirmwareStatusNotification(Installing) → CSMS
충전소 → 시스템 재시작
충전소 → BootNotification(FirmwareUpdate) → CSMS
충전소 → FirmwareStatusNotification(Installed) → CSMS
안전 및 보안 고려사항
디지털 서명 검증
- 펌웨어 파일 무결성 확인
- 인증된 소스에서 제공된 펌웨어 검증
- 서명 인증서 체인 검증
백업 및 복구
- 현재 펌웨어 백업 생성
- 업데이트 실패 시 롤백 메커니즘
- 부트로더 보호 및 복구 모드
타이밍 제어
- 충전 서비스 영향 최소화
- 유지보수 시간대 활용
- 단계적 배포 (Staged Rollout)
오류 처리 시나리오
다운로드 실패
{
"status": "Rejected",
"statusInfo": {
"reasonCode": "DownloadFailed",
"additionalInfo": "네트워크 연결 불안정. 3회 재시도 후 실패"
}
}
서명 검증 실패
{
"status": "Rejected",
"statusInfo": {
"reasonCode": "InvalidSignature",
"additionalInfo": "펌웨어 서명 검증 실패. 파일 무결성 확인 불가"
}
}
호환성 문제
{
"status": "Rejected",
"statusInfo": {
"reasonCode": "IncompatibleFirmware",
"additionalInfo": "하드웨어 v1.2와 호환되지 않는 펌웨어입니다"
}
}
모니터링 및 관리
진행 상황 추적
- FirmwareStatusNotification을 통한 실시간 상태 모니터링
- 다운로드 진행률 및 설치 단계 추적
- 오류 발생 시 즉시 알림
배치 업데이트 관리
- 충전소 그룹별 순차 업데이트
- 테스트 그룹 우선 배포
- 전체 네트워크 영향도 분석
성능 지표
- 업데이트 성공률 모니터링
- 평균 다운로드/설치 시간 측정
- 업데이트 후 안정성 확인
중요 포인트
- UpdateFirmware는 충전소 네트워크의 보안과 기능 향상을 위한 핵심 메시지입니다
- 디지털 서명을 통한 펌웨어 무결성 검증이 보안상 필수적입니다
- 충전 중인 세션이 있을 때는 업데이트를 연기하여 서비스 연속성을 보장해야 합니다
retrieveDateTime
과 installDateTime
을 분리하여 업데이트 타이밍을 세밀하게 제어할 수 있습니다
- 재시도 메커니즘을 통해 네트워크 불안정 상황에서도 안정적인 업데이트가 가능합니다
- 백업 및 롤백 메커니즘을 통해 업데이트 실패 시 시스템 복구가 가능해야 합니다
- FirmwareStatusNotification을 통해 전체 업데이트 과정을 투명하게 모니터링할 수 있습니다
- 보안 패치와 같은 긴급 업데이트는 우선순위를 두어 신속하게 배포해야 합니다
이 메시지를 통해 충전소 네트워크의 펌웨어를 효율적이고 안전하게 관리할 수 있으며, 지속적인 보안 강화와 기능 개선을 통해 안정적인 충전 서비스를 제공할 수 있습니다.