Отправка данных в реальном времени из сетевой программы C клиенту браузера для построения графика - PullRequest
3 голосов
/ 17 февраля 2020

Я столкнулся с архитектурной проблемой, которую пока не могу найти подходящего решения. У меня есть Linux коробка, которая является просто машиной, подключенной к сети с помощью кабеля Ethe rnet, работающей Linux. Это значения выборки из AD C (аналого-цифровой преобразователь) на уровне 3000 samples/sec. На каждом сэмпле он на самом деле сэмплирует все 8 каналов AD C. Итак, у меня есть 3000 * 8 значений типа DOUBLE каждую секунду.

Моя проблема заключается в следующем: потоковая передача этих данных в режиме реального времени клиенту, работающему с веб-приложением, и представление его там с некоторыми Javascript рамки. Программа в поле Linux должна быть в C. Я стараюсь избегать взаимодействия, подобного тому, которое доступно с. NET Core, чтобы избежать сложности.

Что я уже сделал?

Я реализовал веб-сервер в C, работающем как дочерний процесс вместе с родительским процессом, который выполняет выборку AD C значения. (на самом деле родителю не нужно пробовать, я сделал это как демонстрацию, прежде чем включить его в эту программу). Сервер может обслуживать запрос GET, на который ему известно только то, что он отвечает только отформатированными JSON значениями всех 8 каналов, как на скриншоте ниже. Вот запрос, который я делаю с моего компьютера: screenshot of me calling the server on the box. Receiving JSON data back.

Обратите внимание, что я хочу, чтобы это работало только в локальной сети.

Теперь я думаю, что у меня может быть какая-то JS инфраструктура, которая получает данные из этого Linux ящика, непрерывно вызывая 192.168.1.95:8080 в запросе Ajax GET и создавая график для всех 8 каналов одновременно. Это жизнеспособно? Насколько плох этот дизайн? Может ли это взломать sh браузер? Обратите внимание, что каждый запрос, такой как на скриншоте, принимает ~260 bytes в качестве отправки, а ответ (JSON) - ~130 bytes (около 50% обмениваемых данных - это заголовки HTTP).

То, как я себя чувствую в том, что если я продолжу в том же духе, то буду тратить 99% данных, которые ящики Linux, получая только в очень небольшом объеме, в клиентском веб-приложении. Обратите внимание, что я еще не сделал веб-приложение. Итак, я не знаю, как это на самом деле работает. Хотя могу вам сказать, что сервер на коробке Linux довольно быстрый. Кроме того, он работает только локально.

Гораздо лучшим решением было бы, если бы я мог работать с сокетом в браузере. Тогда это будет намного быстрее (я думаю).

Можете ли вы предложить лучший способ сделать это? Я бы также принял решение, которое можно использовать и за пределами локальной сети. Я ищу масштабируемое решение. Для клиентского приложения я намерен использовать ASP. NET Core.

Думаю, я подумал: веб-сокеты (используется библиотека для C?)? Будет ли это быстрее?

Все, что вы можете дать мне, будет высоко оценено.

С точки зрения кода, вот код:

https://github.com/giorgi3092/ECG_HW_SW_DE1_SoC/blob/master/adc_example/web_server/web_server2.c

1 Ответ

2 голосов
/ 17 февраля 2020

Для вашего случая использования WebSocket определенно более масштабируем, чем опрос HTTP.

Если вы хотите повысить общую производительность системы, вы можете использовать более компактный и эффективный формат сериализации данных, например, как MessagePack , он доступен на множестве языков программирования (для вашего случая JavaScript и C).

В более экстремальном случае, когда существующие форматы сериализации работали не слишком хорошо, тогда вы можете напрямую кодировать double[] в uint8_t[] (C) на своем сервере и pu sh в браузер, а затем использовать TypedArray (JavaScript) в браузере для доступа к значениям кодируется сервером.

С другой стороны, я думаю, что C# (. NET Core) может работать так же хорошо, как C в этом случае.

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