Mrityunjay
Mrityunjay

Reputation: 21

Reading GPS data from Teltonika FM4200

I have configured the GPS device and created a listener application in C#. I receive only the IMEI Number from the device and not any GPS NMEA data. But for checking when i check the same in GPS Gate Server it displays the movement in map. any suggestions!!!

Below is how the handling of data is performed

TcpClient client = (TcpClient)tcpClient;
Byte[] bytes = new Byte[10000];
String data = null;
int i;

NetworkStream stream = client.GetStream();

while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
{
    data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
}

Console.WriteLine(data);

When it goes in the while loop it just waits and sleep :(

Upvotes: 2

Views: 8496

Answers (5)

Shiko
Shiko

Reputation: 2624

You have to configure your tracker first using below steps as in figure:

To initiate configuration process, configuration server sends binary initiation SMS (“Push” SMS) containing server host(ip address) and tcp port device should connect to and waits for TCP connection.

Upon reception of “push” SMS, device tries to establish TCP connection to configuration server using GPRS. If TCP connection attempt succeeds, server sends out configuration data to device over established connection, device confirms configuration reception and configures itself.

If device doesn‘t connect to server in TcpWaitTimeout time, server stops waiting for TCP connection, sends out configuration data using binary SMS, and waits for confirmation SMS from device. If confirmation SMS doesn‘t arrive in specified time, server assumes that configuration process failed. enter image description here

Reference file:
https://sourceforge.net/p/opengts/discussion/579834/thread/6fd0ffe8/6213/attachment/FMXXXX%20Protocols%20v2.10.pdf

Upvotes: 0

Temala Ridha
Temala Ridha

Reputation: 104

Here is a parser for FM1100 this may help you to write code for FM4200 model https://github.com/temala/Teltonika-FM1100

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text;
using System.Data;
using System.Net.Sockets;
using System.Linq;
using System.IO;

namespace TeltonikaParser
{
public class Protocol_TeltonikaFMXXXX
{
    private const int CODEC_FMXXX = 0x08;
    private const int ACC = 1;
    private const int DOOR = 2;
    private const int Analog = 4;
    private const int GSM = 5;
    private const int SPEED = 6;
    private const int VOLTAGE = 7;
    private const int GPSPOWER = 8;
    private const int TEMPERATURE = 9;
    private const int ODOMETER = 16;
    private const int STOP = 20;
    private const int TRIP = 28;
    private const int IMMOBILIZER = 29;
    private const int AUTHORIZED = 30;
    private const int GREEDRIVING = 31;
    private const int OVERSPEED = 33;



    private static string Parsebytes(Byte[] byteBuffer, int index, int Size)
    {
        return BitConverter.ToString(byteBuffer, index, Size).Replace("-", string.Empty);
    }

    private static string parseIMEI(Byte[] byteBuffer, int size)
    {
        int index = 0;
        var result = Parsebytes(byteBuffer, index, 2);
        return result;
    }

    private static bool checkIMEI(string data)
    {
        Console.WriteLine(data.Length);
        if (data.Length == 15)
            return true;

        return false;
    }

    private static List<Position> ParsePositions(Byte[] byteBuffer, int linesNB)
    {
        int index = 0;
        index += 7;
        uint dataSize = byteBuffer[index];

        index++;
        uint codecID = byteBuffer[index];

        if (codecID == CODEC_FMXXX)
        {
            index++;
            uint NumberOfData = byteBuffer[index];

            Console.WriteLine("{0} {1} {2} ", codecID, NumberOfData, dataSize);

            List<Position> result = new List<Position>();

            index++;
            for (int i = 0; i < NumberOfData; i++)
            {
                Position position = new Position();

                var timestamp = Int64.Parse(Parsebytes(byteBuffer, index, 8), System.Globalization.NumberStyles.HexNumber);
                index += 8;

                position.Time = DateTime.Now;

                var Preority = byte.Parse(Parsebytes(byteBuffer, index, 1), System.Globalization.NumberStyles.HexNumber);
                index++;

                position.Lo = Int32.Parse(Parsebytes(byteBuffer, index, 4), System.Globalization.NumberStyles.HexNumber) / 10000000.0;
                index += 4;

                position.La = Int32.Parse(Parsebytes(byteBuffer, index, 4), System.Globalization.NumberStyles.HexNumber) / 10000000.0;
                index += 4;

                var Altitude = Int16.Parse(Parsebytes(byteBuffer, index, 2), System.Globalization.NumberStyles.HexNumber);
                index += 2;

                var dir = Int16.Parse(Parsebytes(byteBuffer, index, 2), System.Globalization.NumberStyles.HexNumber);

                if (dir < 90) position.Direction = 1;
                else if (dir == 90) position.Direction = 2;
                else if (dir < 180) position.Direction = 3;
                else if (dir == 180) position.Direction = 4;
                else if (dir < 270) position.Direction = 5;
                else if (dir == 270) position.Direction = 6;
                else if (dir > 270) position.Direction = 7;
                index += 2;

                var Satellite = byte.Parse(Parsebytes(byteBuffer, index, 1), System.Globalization.NumberStyles.HexNumber);
                index++;

                if (Satellite >= 3)
                    position.Status = "A";
                else
                    position.Status = "L";

                position.Speed = Int16.Parse(Parsebytes(byteBuffer, index, 2), System.Globalization.NumberStyles.HexNumber);
                index += 2;

                int ioEvent = byte.Parse(Parsebytes(byteBuffer, index, 1), System.Globalization.NumberStyles.HexNumber);
                index++;
                int ioCount = byte.Parse(Parsebytes(byteBuffer, index, 1), System.Globalization.NumberStyles.HexNumber);
                index++;
                //read 1 byte
                {
                    int cnt = byte.Parse(Parsebytes(byteBuffer, index, 1), System.Globalization.NumberStyles.HexNumber);
                    index++;
                    for (int j = 0; j < cnt; j++)
                    {
                        int id = byte.Parse(Parsebytes(byteBuffer, index, 1), System.Globalization.NumberStyles.HexNumber);
                        index++;
                        //Add output status
                        switch (id)
                        {
                            case ACC:
                                {
                                    var value = byte.Parse(Parsebytes(byteBuffer, index, 1), System.Globalization.NumberStyles.HexNumber);
                                    position.Status += value == 1 ? ",ACC off" : ",ACC on";
                                    index++;
                                    break;
                                }
                            case DOOR:
                                {
                                    var value = byte.Parse(Parsebytes(byteBuffer, index, 1), System.Globalization.NumberStyles.HexNumber);
                                    position.Status += value == 1 ? ",door close" : ",door open";
                                    index++;
                                    break;
                                }
                            case GSM:
                                {
                                    var value = byte.Parse(Parsebytes(byteBuffer, index, 1), System.Globalization.NumberStyles.HexNumber);
                                    position.Status += string.Format(",GSM {0}", value);
                                    index++;
                                    break;
                                }
                            case STOP:
                                {
                                    var value = byte.Parse(Parsebytes(byteBuffer, index, 1), System.Globalization.NumberStyles.HexNumber);
                                    position.StopFlag = value == 1;
                                    position.IsStop = value == 1;

                                    index++;
                                    break;
                                }
                            case IMMOBILIZER:
                                {
                                    var value = byte.Parse(Parsebytes(byteBuffer, index, 1), System.Globalization.NumberStyles.HexNumber);
                                    position.Alarm = value == 0 ? "Activate Anti-carjacking success" : "Emergency release success";
                                    index++;
                                    break;
                                }
                            case GREEDRIVING:
                                {
                                    var value = byte.Parse(Parsebytes(byteBuffer, index, 1), System.Globalization.NumberStyles.HexNumber);
                                    switch (value)
                                    {
                                        case 1:
                                            {
                                                position.Alarm = "Acceleration intense !!";
                                                break;
                                            }
                                        case 2:
                                            {
                                                position.Alarm = "Freinage brusque !!";
                                                break;
                                            }
                                        case 3:
                                            {
                                                position.Alarm = "Virage serré !!";
                                                break;
                                            }
                                        default:
                                            break;
                                    }
                                    index++;
                                    break;
                                }
                            default:
                                {
                                    index++;
                                    break;
                                }
                        }

                    }
                }

                //read 2 byte
                {
                    int cnt = byte.Parse(Parsebytes(byteBuffer, index, 1), System.Globalization.NumberStyles.HexNumber);
                    index++;
                    for (int j = 0; j < cnt; j++)
                    {
                        int id = byte.Parse(Parsebytes(byteBuffer, index, 1), System.Globalization.NumberStyles.HexNumber);
                        index++;



                        switch (id)
                        {
                            case Analog:
                                {
                                    var value = Int16.Parse(Parsebytes(byteBuffer, index, 2), System.Globalization.NumberStyles.HexNumber);
                                    if (value < 12)
                                        position.Alarm += string.Format("Low voltage", value);
                                    index += 2;
                                    break;
                                }
                            case SPEED:
                                {
                                    var value = Int16.Parse(Parsebytes(byteBuffer, index, 2), System.Globalization.NumberStyles.HexNumber);
                                    position.Alarm += string.Format("Speed", value);
                                    index += 2;
                                    break;
                                }
                            default:
                                {
                                    index += 2;
                                    break;
                                }

                        }
                    }
                }

                //read 4 byte
                {
                    int cnt = byte.Parse(Parsebytes(byteBuffer, index, 1), System.Globalization.NumberStyles.HexNumber);
                    index++;
                    for (int j = 0; j < cnt; j++)
                    {
                        int id = byte.Parse(Parsebytes(byteBuffer, index, 1), System.Globalization.NumberStyles.HexNumber);
                        index++;

                        switch (id)
                        {
                            case TEMPERATURE:
                                {
                                    var value = Int32.Parse(Parsebytes(byteBuffer, index, 4), System.Globalization.NumberStyles.HexNumber);
                                    position.Alarm += string.Format("Temperature {0}", value);
                                    index += 4;
                                    break;
                                }
                            case ODOMETER:
                                {
                                    var value = Int32.Parse(Parsebytes(byteBuffer, index, 4), System.Globalization.NumberStyles.HexNumber);
                                    position.Mileage = value;
                                    index += 4;
                                    break;
                                }
                            default:
                                {
                                    index += 4;
                                    break;
                                }

                        }


                    }
                }

                //read 8 byte
                {
                    int cnt = byte.Parse(Parsebytes(byteBuffer, index, 1), System.Globalization.NumberStyles.HexNumber);
                    index++;
                    for (int j = 0; j < cnt; j++)
                    {
                        int id = byte.Parse(Parsebytes(byteBuffer, index, 1), System.Globalization.NumberStyles.HexNumber);
                        index++;

                        var io = Int64.Parse(Parsebytes(byteBuffer, index, 8), System.Globalization.NumberStyles.HexNumber);
                        position.Status += string.Format(",{0} {1}", id, io);
                        index += 8;
                    }
                }

                result.Add(position);
                Console.WriteLine(position.ToString());
            }

            return result;
        }
        return null;
    }

    public static Byte[] DealingWithHeartBeat(string data)
    {

        Byte[] result = { 1 };
        if (checkIMEI(data))
        {
            return result;
        }
        return null;
    }

    public static string ParseHeartBeatData(Byte[] byteBuffer, int size)
    {
        var IMEI = parseIMEI(byteBuffer, size);
        if (checkIMEI(IMEI))
        {
            return IMEI;
        }
        else
        {
            int index = 0;
            index += 7;
            uint dataSize = byteBuffer[index];

            index++;
            uint codecID = byteBuffer[index];

            if (codecID == CODEC_FMXXX)
            {
                index++;
                uint NumberOfData = byteBuffer[index];

                return NumberOfData.ToString();
            }
        }
        return string.Empty;
    }
    public static List<Position> ParseData(Byte[] byteBuffer, int size)
    {

        List<Position> result = new List<Position>();
        result = ParsePositions(byteBuffer, size);
        return result;
    }

    public static Position GetGPRSPos(string oneLine)
    {
        return null;
    }
}
}

Upvotes: 0

Ahmed Eid Yamany
Ahmed Eid Yamany

Reputation: 819

  1. First when module connects to server, module sends its IMEI. IMEI is sent the same way as encoding barcode.
  2. First comes short identifying number of bytes written and then goes IMEI as text (bytes). For example IMEI 123456789012345 would be sent as 000F313233343536373839303132333435 After receiving IMEI,
  3. server should determine if it would accept data from this module. If yes,server will reply to module 01 if not 00. Note that confirmation should be sent as binary packet.
  4. Then module starts to send firstAVL data packet.
  5. After server receives packet and parses it, server must report to module number of data received as integer(four bytes). If sent data number and reported by server doesn’t match module resends sent data.

Ref. FMXXXX Protocols V2.7

Upvotes: 2

LOKESH
LOKESH

Reputation: 11

I think that device havaing pattern like

Step1:After Receving IMEI number

Step2:Replay "01" Status to the same newwork

Code:

TcpClient newClient = (TcpClient)client;

NetworkStream ns = newClient.GetStream()

byte[] bytes = new byte[1024];

bytes = Encoding.ASCII.GetBytes("X");

Console.WriteLine("X");

ns.Write(bytes, 0, bytes.Length);

Upvotes: 1

bart s
bart s

Reputation: 5100

I think you need to do something like this (simple solution). If you can get it work, maybe you should check on some asynchronous sockets/tcp connections

TcpClient client = (TcpClient)tcpClient;
Byte[] bytes = new Byte[10000];
String data = null;
int i;

NetworkStream stream = client.GetStream();

// Will get data as long as data is available after 1st read
do
{
    i = stream.Read(bytes, 0, bytes.Length)
    data = String.Concat(data, System.Text.Encoding.ASCII.GetString(bytes, 0, i));
}
while(stream.DataAvailable); 

// Write the data to console (first time it should be IMEI
Console.WriteLine(data);     

// Write 1 to the stream, note it must probably be byte value 1 -> 0x01
// Flush output stream after writing to prevent buffering

data = "";

// Now try if more data comes in after IMEI and 0x01 reply
do
{
    i = stream.Read(bytes, 0, bytes.Length)
    data = String.Concat(data, System.Text.Encoding.ASCII.GetString(bytes, 0, i));
}
while(stream.DataAvailable);

// Write date to console - move inside the while loop if data keeps coming in
Console.WriteLine(data);     

Upvotes: 0

Related Questions