fix: enrich jt808 location additional parsing
This commit is contained in:
@@ -331,45 +331,85 @@ func parseAdditional(data []byte, location *Location) []AdditionalItem {
|
||||
}
|
||||
switch {
|
||||
case id == 0x01 && size == 4:
|
||||
mileage := float64(binary.BigEndian.Uint32(value)) / 10
|
||||
rawMileage := binary.BigEndian.Uint32(value)
|
||||
mileage := float64(rawMileage) / 10
|
||||
location.TotalMileageKM = &mileage
|
||||
item.Parsed = map[string]any{
|
||||
"name": envelope.FieldTotalMileageKM,
|
||||
"value": mileage,
|
||||
"unit": "km",
|
||||
"name": envelope.FieldTotalMileageKM,
|
||||
"raw_value_tenth_km": rawMileage,
|
||||
"value": mileage,
|
||||
"unit": "km",
|
||||
}
|
||||
case id == 0x02 && size == 2:
|
||||
rawFuel := binary.BigEndian.Uint16(value)
|
||||
item.Parsed = map[string]any{
|
||||
"name": "fuel_l",
|
||||
"value": float64(binary.BigEndian.Uint16(value)) / 10,
|
||||
"unit": "L",
|
||||
"name": "fuel_l",
|
||||
"raw_value_tenth_l": rawFuel,
|
||||
"value": float64(rawFuel) / 10,
|
||||
"unit": "L",
|
||||
}
|
||||
case id == 0x03 && size == 2:
|
||||
rawSpeed := binary.BigEndian.Uint16(value)
|
||||
item.Parsed = map[string]any{
|
||||
"name": "recorder_speed_kmh",
|
||||
"value": float64(binary.BigEndian.Uint16(value)) / 10,
|
||||
"unit": "km/h",
|
||||
"name": "recorder_speed_kmh",
|
||||
"raw_value_tenth_kmh": rawSpeed,
|
||||
"value": float64(rawSpeed) / 10,
|
||||
"unit": "km/h",
|
||||
}
|
||||
case id == 0x04 && size == 2:
|
||||
item.Parsed = map[string]any{
|
||||
"name": "manual_alarm_event_id",
|
||||
"value": binary.BigEndian.Uint16(value),
|
||||
}
|
||||
case id == 0x05 && size == 30:
|
||||
item.Parsed = map[string]any{
|
||||
"name": "tire_pressure",
|
||||
"values": parseTirePressure(value),
|
||||
}
|
||||
case id == 0x06 && size == 2:
|
||||
item.Parsed = map[string]any{
|
||||
"name": "carriage_temperature_c",
|
||||
"value": int16(binary.BigEndian.Uint16(value)),
|
||||
"unit": "C",
|
||||
}
|
||||
case id == 0x11 && (size == 1 || size == 5):
|
||||
parsed := map[string]any{
|
||||
"name": "overspeed_alarm",
|
||||
"location_type": value[0],
|
||||
}
|
||||
if size == 5 {
|
||||
parsed["area_id"] = binary.BigEndian.Uint32(value[1:5])
|
||||
}
|
||||
item.Parsed = parsed
|
||||
case id == 0x12 && size == 6:
|
||||
item.Parsed = map[string]any{
|
||||
"name": "area_route_alarm",
|
||||
"location_type": value[0],
|
||||
"area_id": binary.BigEndian.Uint32(value[1:5]),
|
||||
"direction": value[5],
|
||||
}
|
||||
case id == 0x13 && size == 7:
|
||||
item.Parsed = map[string]any{
|
||||
"name": "road_section_driving_time_alarm",
|
||||
"road_section_id": binary.BigEndian.Uint32(value[0:4]),
|
||||
"driving_time_seconds": binary.BigEndian.Uint16(value[4:6]),
|
||||
"result": value[6],
|
||||
"result_description": roadSectionDrivingTimeResult(value[6]),
|
||||
"driving_time_result_source": "jt808_0x0200_additional_0x13",
|
||||
}
|
||||
case id == 0x25 && size == 4:
|
||||
rawStatus := binary.BigEndian.Uint32(value)
|
||||
item.Parsed = map[string]any{
|
||||
"name": "extended_vehicle_signal_status",
|
||||
"value": binary.BigEndian.Uint32(value),
|
||||
"value": rawStatus,
|
||||
"bits": parseExtendedVehicleSignal(rawStatus),
|
||||
}
|
||||
case id == 0x2a && size == 2:
|
||||
rawStatus := binary.BigEndian.Uint16(value)
|
||||
item.Parsed = map[string]any{
|
||||
"name": "io_status",
|
||||
"value": binary.BigEndian.Uint16(value),
|
||||
"value": rawStatus,
|
||||
"bits": parseIOStatus(rawStatus),
|
||||
}
|
||||
case id == 0x2b && size == 4:
|
||||
analog := binary.BigEndian.Uint32(value)
|
||||
@@ -432,6 +472,55 @@ func additionalToMaps(items []AdditionalItem) []map[string]any {
|
||||
return out
|
||||
}
|
||||
|
||||
func parseTirePressure(data []byte) []map[string]any {
|
||||
out := make([]map[string]any, 0, len(data))
|
||||
for index, value := range data {
|
||||
out = append(out, map[string]any{
|
||||
"position": index,
|
||||
"value": value,
|
||||
"valid": value != 0xff,
|
||||
})
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
func parseExtendedVehicleSignal(value uint32) map[string]bool {
|
||||
return map[string]bool{
|
||||
"low_beam": value&0x0001 != 0,
|
||||
"high_beam": value&0x0002 != 0,
|
||||
"right_turn": value&0x0004 != 0,
|
||||
"left_turn": value&0x0008 != 0,
|
||||
"brake": value&0x0010 != 0,
|
||||
"reverse_gear": value&0x0020 != 0,
|
||||
"fog_light": value&0x0040 != 0,
|
||||
"clearance_light": value&0x0080 != 0,
|
||||
"horn": value&0x0100 != 0,
|
||||
"air_conditioner": value&0x0200 != 0,
|
||||
"neutral": value&0x0400 != 0,
|
||||
"retarder": value&0x0800 != 0,
|
||||
"abs": value&0x1000 != 0,
|
||||
"heater": value&0x2000 != 0,
|
||||
"clutch": value&0x4000 != 0,
|
||||
}
|
||||
}
|
||||
|
||||
func parseIOStatus(value uint16) map[string]bool {
|
||||
return map[string]bool{
|
||||
"deep_sleep": value&0x0001 != 0,
|
||||
"sleep": value&0x0002 != 0,
|
||||
}
|
||||
}
|
||||
|
||||
func roadSectionDrivingTimeResult(value byte) string {
|
||||
if value == 0 {
|
||||
return "insufficient"
|
||||
}
|
||||
if value == 1 {
|
||||
return "too_long"
|
||||
}
|
||||
return "unknown"
|
||||
}
|
||||
|
||||
func bcdString(data []byte) string {
|
||||
out := make([]byte, 0, len(data)*2)
|
||||
for _, value := range data {
|
||||
|
||||
Reference in New Issue
Block a user