Я использовал этот пример кода GitHub для получения данных от GPS-трекера Teltonika FMB920. Согласно документам Teltonika (документация кодека), для получения данных от GPS-трекера Teltonika по протоколу TCP трекер отправляет свой IMEI на сервер, а затем сервер отправляет обратно один байт 0x01 (Принять) или 0x00 (Отклонить) в качестве ответ. затем GPS-трекер отправляет пакеты данных GPS на сервер, и сервер должен отправить обратно количество полученных пакетов в качестве ответа. в противном случае GPS-трекер пытается отправлять повторяющиеся пакеты данных снова и снова, пока сервер не отправит количество данных в качестве ответа.
Образец работает с точки зрения получения и принятия IMEI, но всегда получает повторяющиеся пакеты данных GPS. Удивительно, но если я переключу точку останова в строке this.ResponseReverse(avlData.NumberOfData1,stream);, а затем удалю точку останова, чтобы продолжить процесс, GPS-трекер правильно отправит новые пакеты данных.
private void ClientHandler(object client)
{
var tcpClient = (TcpClient)client;
//tcpClient.NoDelay = true;
var stream = tcpClient.GetStream();
var imei = this.ReadImei(stream);
var commArgs = this.OnDeviceCnnected(imei);
if (commArgs.CommunicationAccepted)
{
this.Accept(stream);
this.OnStatusChanged(imei, AvlTcpStatus.Accepted);
}
else
{
this.Reject(stream);
this.OnStatusChanged(imei, AvlTcpStatus.Rejected);
}
while (true)
{
try
{
var memoryStream = this.ReadData(stream);
if (memoryStream.Length == 0)
{
this.OnStatusChanged(imei, AvlTcpStatus.Terminated);
break;
}
var packet = PacketParser.Parse(memoryStream);
if (memoryStream.Position != memoryStream.Length)
throw new InvalidDataException("unfinished avl packet");
var avlData = packet.GetAvlDataArray();
this.OnDataFetched(imei, avlData);
//Thread.Sleep(1000);
this.ResponseReverse(avlData.NumberOfData1, stream);
//Thread.Sleep(1000);
}
catch (Exception exception)
{
this.OnErrorOccured(imei, exception);
}
}
}
Я пытался использовать Thread.Sleep(); до и после этой строки, чтобы имитировать, какие точки останова работают, но не работают. Что вы думаете об этой проблеме?
ОБНОВЛЕНИЕ:
Подробнее о методах:
private void Accept(NetworkStream stream)
{
// 1 as byte array response will determine if it would accept data from this module.
this.Response(1, stream);
}
private void Reject(NetworkStream stream)
{
// 0 as byte array response will determine if it would reject data from this module.
this.Response(0, stream);
}
private void Response(int count, NetworkStream stream)
{
var answer = BitConverter.GetBytes(count).ToArray();
stream.Write(answer, 0, answer.Length);
}
private void ResponseReverse(int count, NetworkStream stream)
{
var answer = BitConverter.GetBytes(count).Reverse().ToArray();
stream.Write(answer, 0, answer.Length);
}
private string ReadImei(NetworkStream stream)
{
var buffer = new byte[128]; //IMEI buffer
var length = stream.Read(buffer, 0, buffer.Length);
if (buffer[0] != 0 || buffer[1] != 0x0f) throw new InvalidDataException("Wrong IMEI");
var imei = Encoding.ASCII.GetString(buffer, 2, length - 2);
return imei;
}
private MemoryStream ReadData(NetworkStream stream)
{
var buffer = new byte[4096];
var memoryStream = new MemoryStream();
while (true)
{
var length = stream.Read(buffer, 0, buffer.Length);
if (length == 0) break;
memoryStream.Write(buffer, 0, length);
if (!stream.DataAvailable) break;
}
memoryStream.Position = 0;
return memoryStream;
}
Подробнее здесь: https://stackoverflow.com/questions/783 ... ker-on-tcp
Получение дублирующихся данных от GPS трекера по TCP ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как декодировать шестнадцатеричные значения GPS-трекера с помощью PHP (протокол GT06)
Anonymous » » в форуме Php - 0 Ответы
- 24 Просмотры
-
Последнее сообщение Anonymous
-