2

我已经配置了 GPS 设备并在 C# 中创建了一个侦听器应用程序。我只收到来自设备的 IMEI 号码,而不是任何 GPS NMEA 数据。但是为了检查我何时在 GPS Gate 服务器中检查相同的内容,它会在地图中显示移动。有什么建议么!!!

以下是如何执行数据处理

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);

当它进入while循环时,它只是等待和睡眠:(

4

5 回答 5

1

我认为该设备具有类似的模式

Step1:收到IMEI号码后

Step2:重播“01”状态到同一个新作品

代码:

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);
于 2013-07-16T04:39:25.887 回答
1
  1. 首先,当模块连接到服务器时,模块会发送它的 IMEI。IMEI 的发送方式与编码条码相同。
  2. 首先是写入的短标识字节数,然后是 IMEI 作为文本(字节)。例如 IMEI 123456789012345 将被发送为 000F313233343536373839303132333435 收到 IMEI 后,
  3. 服务器应确定它是否会接受来自该模块的数据。如果是,服务器将回复模块 01,如果不是 00。请注意,确认应以二进制数据包的形式发送。
  4. 然后模块开始发送第一个AVL数据包。
  5. 服务器接收到数据包并解析后,服务器必须以整数(四个字节)向模块报告接收到的数据数量。如果发送的数据数和服务器上报的不匹配,模块会重新发送发送的数据。

参考。FMXXXX 协议 V2.7

于 2014-02-13T11:02:55.430 回答
0

我认为你需要做这样的事情(简单的解决方案)。如果你能让它工作,也许你应该检查一些异步套接字/tcp 连接

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);     
于 2012-11-23T08:58:33.793 回答
0

您必须首先使用以下步骤配置您的跟踪器,如图所示:

要启动配置过程,配置服务器会发送包含服务器主机(IP 地址)的二进制启动 SMS(“Push” SMS),并且 tcp 端口设备应连接并等待 TCP 连接。

收到“推送”短信后,设备尝试使用 GPRS 与配置服务器建立 TCP 连接。如果 TCP 连接尝试成功,服务器通过已建立的连接向设备发送配置数据,设备确认接收配置并自行配置。

如果设备在 TcpWaitTimeout 时间内没有连接到服务器,则服务器停止等待 TCP 连接,使用二进制短信发送配置数据,并等待来自设备的确认短信。如果确认短信没有在指定时间内到达,服务器会认为配置过程失败。 在此处输入图像描述

参考文件:
https ://sourceforge.net/p/opengts/discussion/579834/thread/6fd0ffe8/6213/attachment/FMXXXX%20Protocols%20v2.10.pdf

于 2016-09-16T09:35:48.487 回答
-1

这是 FM1100 的解析器,它可以帮助您编写 FM4200 模型的代码 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;
    }
}
}
于 2015-04-29T13:51:05.870 回答