Labdb fix: payload sanitize for PostgreSQL JSONB compatibility
서버 로그에서 두 원인 확인:
[error] POST /devices/register invalid byte sequence for encoding UTF8: 0x00
[error] POST /upload/json unsupported Unicode escape sequence
PostgreSQL JSONB는 NULL escape를 거부 (HTTP 500). BLE rid: 응답에서
US-ASCII 디코딩 후 .trim()은 whitespace만 제거하고 NULL/제어문자는
남기므로, firmware/hw/serial 문자열에 padding NULL이 묻은 채 payload로 직렬화됨.
두 군데 방어:
1. BleManager.rid: 파싱에서 0x00~0x1F,0x7F를 공백으로 치환 후 trim
2. LabdbClient.sanitizeForJsonb 추가 — register/uploadJson 직전에
payload를 재귀적으로 순회하며 모든 string에서 C0 control + DEL 제거
(탭/개행/캐리지리턴은 보존)
원인 조사: 서버 SSH로 /var/log/labdb.log 직접 확인 +
server.js의 /upload/json 핸들러 코드 검토 결과 서버는 받은 sensor/channels
JSON을 그대로 JSONB 컬럼에 INSERT.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -995,7 +995,12 @@ class BleManager private constructor(private val context: Context) {
|
||||
}
|
||||
}
|
||||
"rid:" -> {
|
||||
val info = if (data.size > 4) String(data, 4, data.size - 4, Charsets.US_ASCII).trim() else "?"
|
||||
// BLE 응답 끝에 NULL byte padding이 붙는 경우가 있음 — PostgreSQL JSONB가
|
||||
// 0x00을 거부하므로 trim()으로 안 빠지는 NULL/제어문자를 명시적으로 제거.
|
||||
val info = if (data.size > 4)
|
||||
String(data, 4, data.size - 4, Charsets.US_ASCII)
|
||||
.replace(Regex("[\\x00-\\x1F\\x7F]"), " ").trim()
|
||||
else "?"
|
||||
debugLogger.rx("rid", data.size, "device_info=$info")
|
||||
debugLogger.info("DEVICE_INFO $info")
|
||||
// 형식: "VBTHW0100 VBT26040001 VBTFW0111" (HW, Serial, FW)
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user