fix: support jt808 versioned header

This commit is contained in:
lingniu
2026-07-01 22:12:47 +08:00
parent 665122b23b
commit e0068a750d
2 changed files with 79 additions and 7 deletions

View File

@@ -8,6 +8,7 @@ import (
)
const sampleLocationFrame = "7E020000320133077954250001000000000048000301D2C4C707376139000A00E6004F26063016235701040001900C2504000000000202000030011F31010F867E"
const real2019LocationFrame = "7E02004046010000000001489413506007CB00000000004C000301D276AB06FBFF4B000D014E00E826070122092214040000000017020000010400013361030201402504000000012A02000030011D310112EA0402008000C57E"
func TestExtractFramesUnescapesAndParsesLocationWithTotalMileage(t *testing.T) {
stream, err := hex.DecodeString(sampleLocationFrame + "7E02000000")
@@ -63,6 +64,56 @@ func TestExtractFramesUnescapesAndParsesLocationWithTotalMileage(t *testing.T) {
}
}
func TestParseFrameSupportsJT8082019VersionedHeader(t *testing.T) {
stream, err := hex.DecodeString(real2019LocationFrame)
if err != nil {
t.Fatal(err)
}
frames, remainder, err := ExtractFrames(stream)
if err != nil {
t.Fatalf("ExtractFrames() error = %v", err)
}
if len(frames) != 1 || len(remainder) != 0 {
t.Fatalf("unexpected split result frames=%d remainder=%s", len(frames), hex.EncodeToString(remainder))
}
env, err := ParseFrame(frames[0], 1782914967713, "115.231.168.135:43625")
if err != nil {
t.Fatalf("ParseFrame() error = %v", err)
}
if env.MessageID != "0x0200" {
t.Fatalf("message id = %q", env.MessageID)
}
if env.Phone != "14894135060" {
t.Fatalf("phone = %q", env.Phone)
}
if env.Sequence != 1995 {
t.Fatalf("sequence = %d", env.Sequence)
}
assertFloatField(t, env, envelope.FieldLatitude, 30.570155)
assertFloatField(t, env, envelope.FieldLongitude, 117.178187)
assertFloatField(t, env, envelope.FieldSpeedKMH, 33.4)
assertFloatField(t, env, envelope.FieldTotalMileageKM, 7868.9)
if env.Fields["altitude_m"] != uint16(13) {
t.Fatalf("altitude = %#v", env.Fields["altitude_m"])
}
if env.Fields["direction_deg"] != uint16(232) {
t.Fatalf("direction = %#v", env.Fields["direction_deg"])
}
header, ok := env.Parsed["header"].(map[string]any)
if !ok {
t.Fatalf("parsed header missing: %#v", env.Parsed)
}
if header["versioned"] != true || header["protocol_version"] != byte(1) {
t.Fatalf("unexpected versioned header: %#v", header)
}
if header["phone_bcd_hex"] != "00000000014894135060" {
t.Fatalf("phone bcd = %#v", header["phone_bcd_hex"])
}
}
func TestExtractFramesHandlesEscapedPayload(t *testing.T) {
payload := []byte{0x02, 0x00, 0x00, 0x02, 0x01, 0x33, 0x07, 0x79, 0x54, 0x25, 0x00, 0x01, 0x7e, 0x7d}
frame := append([]byte{0x7e}, escape(append(payload, checksum(payload)))...)