将网络化的C程序实时数据发送到浏览器客户端以绘制。

3
我面临一个架构问题,至今还没有找到合适的解决方案。我有一台运行Linux的机器,只是通过以太网电缆连接到网络上,正在每秒从ADC(模数转换器)中采样值,采样值约为3000个样本/秒。在每个采样时刻,它实际上采样了ADC的所有8个通道。因此,我每秒钟有3000 * 8 DOUBLE类型的值。 我的问题如下:实时将这些数据流式传输到运行Web应用程序的客户端,并使用某些Javascript框架在那里绘制它。 Linux盒子上的程序必须使用C编写。我试图避免类似于.NET Core可用的互操作性,以避免复杂性。 到目前为止我做了什么? 我实现了一个在C中运行并作为父进程的子进程的Web服务器,与之配套的程序会采样ADC值(实际上父进程不需要采样,我是在这个程序中加入了Demo)。该服务器可以响应GET请求,并用JSON格式化的所有8个通道的值来响应,就像下面的截图所示。这是我从计算机发出的请求: screenshot of me calling the server on the box. Receiving JSON data back. 请注意,我只希望在本地网络上工作。
现在,我认为我可以有一些JS框架通过在Ajax GET请求中不断调用192.168.1.95:8080来接收来自这个Linux盒子的数据,并同时绘制所有8个通道。这可行吗?这种设计有多糟糕?这会导致浏览器崩溃吗?请注意,像屏幕截图中的那样的每个请求需要发送~260个字节,响应(JSON)是~130个字节(约50%的交换数据是HTTP头)。
我的感觉是,如果我继续这样做,我将浪费99%的数据从Linux盒子中获取少量数据到客户端Web应用程序。请注意,我还没有做Web应用程序。所以,我不知道它的实际表现如何。虽然我可以告诉您,Linux盒子上的服务器非常快。此外,它仅在本地运行。
一个更好的解决方案是如果能够使套接字在浏览器上工作。然后,这会快得多(我认为)。
你能提出更好的解决方案吗?我也接受在本地网络之外使用的解决方案。我正在寻找可扩展的解决方案。对于客户端应用程序,我打算使用ASP.NET Core。
我考虑过的东西:Web Sockets(使用C库?)?这样会更快吗?

非常感谢您提供的任何信息。

代码方面,以下是代码:

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


我已经投票将您的问题标记为“基于观点”,因为在我看来,您收到的任何答案都可能只是那样。话虽如此,我会使用WebSockets,因为否则您会冒着在客户端丢失测量值的风险(取决于它可以多快地轮询更改)。另外,如果您有一个Linux盒子,为什么不构建一个自包含的.NET Core应用程序呢?选择C...可能会使您的代码更加复杂和难以维护。 - fredrik
1个回答

2
针对您的使用情况,WebSocket 比 HTTP 轮询更具可伸缩性。
如果您想提高整个系统的性能,可以使用更紧凑和高效的数据序列化格式,例如 MessagePack,它在许多编程语言中都有支持(对于您的情况,包括 JavaScript 和 C)。
在现有序列化格式无法很好地工作的极端情况下,您可能需要直接将 double[] 编码为服务器上的 uint8_t[](C),然后推送到浏览器,并在浏览器中使用 TypedArray(JavaScript)来访问服务器编码的值。
另一方面,我认为在这种情况下,C# (.NET Core) 也可以与 C 一样好用。

谢谢您的评论。我也认为在Linux系统上直接使用.NET Core是正确的选择,但不幸的是,我必须使用由板卡制造商提供的Linux系统,该系统无法运行.NET Core。因此,我决定在Linux中使用https://github.com/cesanta/mongoose。我已经检查过它可以工作。客户端将使用JavaScript连接到由Mongoose驱动的Linux Websocket服务器,并且该服务器将向客户端推送数据,而客户端将绘制传入的数据。再次感谢您。 - Giorgi Aptsiauri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接