Hex.pm CI

Teltonika GPS tracker protocol parser for Elixir. Decodes Codec 8, Codec 8 Extended, and Codec 16 binary protocols used by Teltonika devices (TAT141, FMB920, FMC130, TMT250, etc.).

Installation

Add teltonika_codec to your list of dependencies in mix.exs:

def deps do
  [
    {:teltonika_codec, "~> 0.1.0"}
  ]
end

Usage

Parse IMEI handshake

{:ok, imei} = TeltonikaCodec.parse_imei(data)
# {:ok, "352093085698206"}

Parse data packet

Auto-detects the codec (8, 8 Extended, or 16) and returns parsed AVL records:

{:ok, records} = TeltonikaCodec.parse_packet(packet)

Enum.each(records, fn record ->
  IO.inspect(record.latitude)    # 42.373737
  IO.inspect(record.longitude)   # 42.373737
  IO.inspect(record.speed)       # 0
  IO.inspect(record.timestamp)   # ~U[2024-01-15 14:30:00.000Z]
  IO.inspect(record.io_elements) # %{elements_1b: %{21 => 3}, ...}
end)

TCP buffer management

Use check_packet/1 to accumulate TCP data until a complete frame arrives:

case TeltonikaCodec.check_packet(buffer) do
  {:complete, packet, rest} ->
    {:ok, records} = TeltonikaCodec.parse_packet(packet)
    # Send ACK so the device stops retransmitting
    :gen_tcp.send(socket, TeltonikaCodec.ack(length(records)))
    # Continue with remaining buffer
    handle_data(rest)

  :incomplete ->
    # Wait for more data
    {:noreply, state}
end

IMEI accept/reject

:gen_tcp.send(socket, TeltonikaCodec.imei_accept())  # <<0x01>>
:gen_tcp.send(socket, TeltonikaCodec.imei_reject())   # <<0x00>>

Supported Codecs

CodecIDIO ID SizeIO Count SizeVariable IOGeneration Type
80x081 byte1 byteNoNo
8 Ext0x8E2 bytes2 bytesYes (NX)No
160x102 bytes1 byteNoYes

AVL Record Fields

Each parsed record contains:

FieldTypeDescription
timestampDateTime.t()GPS fix time
latitudefloatDecimal degrees
longitudefloatDecimal degrees
altitudeintegerMeters
headingintegerDegrees (0-360)
speedintegerkm/h
satellitesintegerVisible GPS satellites
priority:low | :high | :panicRecord priority
io_elementsmapI/O element groups

Protocol Reference

Based on the Teltonika Codec documentation.

License

Apache-2.0