Найдите исполнителя для вашего проекта прямо сейчас!
Разместите заказ на фриланс-бирже и предложения поступят уже через несколько минут.

Общее описание

Требуется разработать утилиту, которая будет пробрасывать данных от передатчика текстовых сообщений на TCP в облако по URL, за которым реализован WebSocket-сервер.

Общая архитектура

Telemetry Relay — Windows-сервис, утилита, работающая в фоновом режиме, которая забирает по TCP сообщения от программы телеметрии (доступна по локальной сети) по протоколу TCP и ретранслирует их в облако.

Telemetry Receiver — ресурс по URL (задается в конфигах), реализованный как WebSocket-сервер, который принимает сообщения и сохраняет в базу.

Требования к Telemetry Relay

  • Запускается как сервис в Windows
  • Настраивается через файл settings.ini в папке с программой
  • Инсталлятор не требуется, буду просто копировать папку в Program Files самостоятельно
Описание файла settings.ini

[telemetry]

telemetry_ip = 127.0.0.1

telemetry_port = 50000

telemetry_timeout = 60

[cloud]

cloud_url = https://example.ru/api/v3/telemetry/receiver/

cloud_timeout = 60

cloud_token = sdkjhadsfkjhdsfjhdsafkafk2332kjkj32dsdskaf

Таймауты указываются в секундах. При недоступности ресурса утилита бесконечно пытается подключиться.

Описание логики работы

1. Попытаться подключиться к TCP.

- При любых ошибках в подключении бесконечно продолжать пытаться подключиться с таймаутом из конфига.

- При успешном подключении к TCP начать слушать сообщения.

2. Попытаться подключиться к облаку.

- При подключении необходимо отправить заголовок "Authorization: Bearer CLOUD_TOKEN_FROM_SETTINGS_INI_FILE".

- При любых ошибках в подключении бесконечно продолжать пытаться подключиться с таймаутом из конфига.

- В случае успешного подключения по WebSocket, первым сообщением сервер пришлет сообщение {"lastInsertId":SOME_INTEGER_OR_ZERO}, которое будет означать последний полученный ID от данной точки (идентифицируется по токену).

- Прочитав lastInsertId, нужно в папке data найти сообщение с номером больше, чем lastInsertId и передать их скоупом в облако. Формат сообщения: {"id":SOME_INTEGER_ID, "message":"RAW_MESSAGE_FROM_TCP_SERVER"}

- Затем программа начинает работать в режиме прослушивания и ретранслирования (см. пункт №4).

3. При получении сообщения по TCP, разделить его по переводу строки (сообщение = отдельная строка с текстом, может быть кириллица), присвоить этому сообщению уникальный порядковый номер и сохранить полученное сообщение в папке data.

- В день будет набегать примерно 5 мегабайт данных.

- Данные за каждый день нужно складывать в отдельные файлы в таком формате — 2020-12-01.txt

- Сообщения в файлах нужно хранить в виде json'а. Структура json'а: {"id":SOME_INTEGER_ID, "message":"RAW_MESSAGE_FROM_TCP_SERVER"}.

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

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

- Формат сообщения: {"id":SOME_INTEGER_ID, "message":"RAW_MESSAGE_FROM_TCP_SERVER"}

Другие важные требования

Наиболее критичным приоритетом работы программы является стабильное прослушивание всех сообщений без потерь (т.к. повторно отправить сообщение возможности не будет).

Следующим приоритетом является скорость отправки сообщения в облако — нужен лаг не более 0.5 с. В идеале 0.1-0.2 с.

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

Если что-то упущено — просьба дополнить, и бюджет на работу будет увеличен.

3 года назад
egetmanenko
Евгений 
36 летРоссия
14 лет в сервисе
Был
2 года назад
Выбранный исполнитель
b3-v3r
Илья 
22 годаУкраина
3 года в сервисе
Был
5 месяцев назад
3 года назад
$210
32 дня
Отличный исполнитель, грамотный, все сделал, что задумали.
Отличный заказчик, грамотно поставленное тз и быстрая оплата. Всем рекомендую и надеюсь на дальнейшее сотрудничество