turcodel8 Ответов: 1

Связь сокета C# TCP с GPS


Привет @Devs, я пытаюсь установить TCP-связь с GPS-устройством, которое отправляет двоичную информацию через GPRS.
До сих пор я работал с несколькими устройствами, использующими UDP с запросом ACK, чтобы предотвратить потерю информации.
Ну а теперь мне нужно сделать TCP-связь с gps, я зондирую несколько TCP-слушателей (думая, что это легкая задача), что-то приходит к слушателю, но потом, когда я пытаюсь разобрать строку или что-то еще, я получаю пустые строки (Я думаю, что Q-разбор ошибочен или что-то в этом роде).
Ну, я запрашиваю поддержку разработчиков в компании, и они посылают куски кода c++ и некоторую информацию, которую я не знаю, как собрать вместе и построить какой-то небольшой TCP c# listener и получать/отвечать ACK, интерпретировать информацию и т. д.

Это информация из службы поддержки GPS, которую они мне присылают.



Привет

Пожалуйста, обратитесь к прилагаемому базовому исходному коду для сервера серии U.
Кроме того, пожалуйста, обратитесь к формату сообщения протокола P1 со страниц 5-8 для разработки вашей платформы. Обратите внимание, что P1 поддерживает только двоичный формат, Пожалуйста, игнорируйте определение формата ASCII.
Например, после того как вы выдали команды связи GPRS, такие как AT$HOSTS, AT$APN, AT$MODID, AT$IPTYPE и т. д., P1 отправит первые данные сердечного ритма на сервер для запроса связи.

Например,
00 04 00 02 00 00 00 00 3C 08 B6 A1 00 AB 00 06 01 39 0C 0D 06 12
Идентификатор транзакции = 0x00 04
Кодировка сообщения = 0x00
Тип сообщения = 0x02
ID модема = 0x00 00 00 00 3C 08 B6 A1
Идентификатор сообщения = 0x00 AB
Длина данных = 0x00 06
RTC час = 0x01
RTC минута = 0x39
RTC секунды = 0x0C
RTC год = 0x0D
RTC месяц = 0x06
RTC день = 0x12

Когда сервер получает запрос на подключение от устройства P1, сервер должен ответить ACK, чтобы установить GPRS-соединение.

Например, чтобы ответить на приведенные выше данные HB,
00 04 00 03 00 00
Идентификатор транзакции = 0x00 04
Кодировка сообщения = 0x00
Тип сообщения = 0x03
Код состояния = 0x0000

Что касается отчета об отслеживании, например, когда вы выдаете при$GPSS=60,2,60 и при$GPSMSG=1,3,0, сервер должен иметь возможность получать обновленное сообщение Report ID 3 GPS каждые 60 секунд от P1.

Например, там, где байты красного цвета-это идентификатор сообщения, очень важно распознать, какой отчет/оповещения вы получаете от устройства.
00 06 00 02 00 00 00 00 3C 08 B6 A1 00 03 00 2E 01 38 35 0D 06 12 00 26 3D EE 00 B9 9E 01 00 00 34 00 01 03 07 00 00 00 00 4С 05 00 00 00 10 67 00 00 01 38 35 0D 06 12 01 39 27 0D 06 12

Сервер должен отвечать на каждое сообщение с одним и тем же идентификатором транзакции, поступающим с устройства.

00 06 00 03 00 00

Кроме того, если вы хотите отправить команду с сервера на устройство, процедура будет выглядеть следующим образом.
Например, запросить MODID, выдав AT$MODID? от сервера к устройству.

Сервер отправляет на$MODID? в двоичном формате,
00 02 01 00 00 09 41 54 24 4D 4F 44 49 44 3F
0x00 02-идентификатор транзакции
0x01-кодировка сообщения
0x00-тип сообщения
0x 00 09-длина данных
0x41 54 24 4D 4F 44 49 44 3F-передача тезисов байтов в текст находится на уровне$MODID? Вы можете легко конвертировать текст в шестнадцатеричный конвертер в интернете.

Когда устройство получает запрос команды от сервера, P1 должен ответить, например, $MODID=100100100,

ОК:MODID
$MODID=100100100
00 02 01 01 00 1c 4f 4b 3a 4d 4f 44 49 44 0d 0a
24 4d 4f 44 49 44 3d 31 30 30 31 30 30 31 30 30 0d 0a
0x00 02-идентификатор транзакции
0x01-кодировка сообщения
0x01-тип сообщения
0x00 1c-длина данных
0x4f 4b 3a 4d 4f 44 49 44 0d 0a-OK:MODID
0x24 4d 4f 44 49 44 3d 31 30 30 31 30 30 31 30 30 0d 0a - $MODID=100100100

Надеюсь, вам это ясно.



Есть идеи, как он интерпретирует это с помощью c#?
Надеюсь, кто-нибудь что-нибудь об этом знает.

С уважением!

Richard MacCutchan

В чем именно заключается проблема? Эти заметки объясняют, как его интерпретировать.

agent_kruger

на самом деле с большим размером вашего вопроса никто не ответит. Пожалуйста, сократите его на короткие кусочки, а затем представьте нам. Так, чтобы мы могли понять и помочь вам ,сэр

1 Ответов

Рейтинг:
2

S Houghtelin

Похоже, у вас возникли проблемы с правильной кодировкой строк. Вы получаете двоичные данные, которые могут быть проблемой.

Это выглядит так, как будто вы получаете данные, но не интерпретируете их правильно. вы можете попробовать использовать следующую строку кода, используя западноевропейскую кодировку iso-8859-1 (ISO). Я использую эту кодировку с большим успехом. Я также использовал (1252) для двоичных данных.

string strData = Encoding.GetEncoding(28591).GetString(buffer, 0, buffer.Length);


Не видя вашего кода, трудно понять, в чем заключается проблема, вполне возможно, что если вы рассматриваете значения как строку, они вполне могут быть преобразованы в их эквиваленты ascii, в этом случае, используя ту же кодировку, я бы передал эти значения в массив int или байт для правильной интерпретации.

Удачи.


turcodel8

Привет, спасибо за ответ, можете ли вы показать мне или прикрепить небольшое приложение на c# для достижения этой цели?

С уважением!

S Houghtelin

Привет, ты произнес это так, как будто у тебя был написан какой-то код, что же у тебя было?

S Houghtelin

Вот сайт, который имеет очень простой код для отправки и получения с помощью сокетов.
http://www.csharp-examples.net/socket-send-receive/

Я сказал вам, что вам нужно сделать, чтобы получить значения в виде двоичных данных. Поместите данные в массив и проанализируйте их, прочитав значение в местоположении индекса в полученном массиве данных, как описано в вашем исходном сообщении. Если вы хотите, чтобы я написал код для вас, я сделаю это, но за определенную плату, я не думаю, что вы можете позволить себе мои ставки.
удачи,