ajax - Arduino WebServer和socket.io

标签 ajax sockets arduino

我们正在尝试使用官方Arduino Wifi Shield将Arduino Uno的连续数据流发送到网页。 Arduino充当服务器,编写网页减价并从引脚发送数据。我们需要AJAX来使数据连续更新而不刷新页面-因此我们正在使用socket.io。我们可以将客户端socket.io代码编写到网页上,但是我们还需要能够在Arduino Uno上创建套接字。

我们尝试使用WebServer示例,但是失败了。任何帮助,将不胜感激。

基本的socket.io代码如下:

client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");

client.println();

//change updating 
client.print("<HEAD>");
client.print("<TITLE />3 Phase Relay</title>");
client.println("</head>");

client.println("<script src=\"/socket.io/socket.io.js\"></script>");
client.println("<script>");
client.println("var socket = io.connect('http://192.168.11.2');");
client.println("socket.on('news', function (data) {");
client.println("console.log(data);");
client.println("socket.emit('my other event', { my: 'data' });");
client.println("});");
client.println("</script>");

// the content of the HTTP response follows the header:
client.print("Peak Voltage Reading: ");
client.println(peak);
client.print("Phase Time Reading: ");
client.println(phasetime);

最佳答案

这是XY problem的经典示例。您寻求的解决方案不一定能解决您的原始问题,而无需进一步说明您的原始问题是什么...

因为您的问题是您对问题做出了错误的假设:

[…] We need AJAX to have the data continuously update without refreshing the page - so we're using socket.io […]



您想要不断更新数据,因此您想更新AJAX。使用socket.io并不是使用AJAX的结果,尽管它需要AJAX才能运行。但是socket.io还需要很长的轮询套接字,我真的怀疑是在arduino网络服务器中实现的,因为它至少需要实现类似 select() 的实现,而该实现不太可能在不具有以下概念的系统上发生:文件描述符。我什至没有在谈论Arduino Uno的Atmega328仅具有2k RAM的事实,这使得很难为多个长期轮询的客户端提供服务。

因此,如果您坚持使用socket.io,则可能需要使用ardtino连接到代理Web服务器并使用arduino socket.io client将更新发送到该代理Web服务器,从而改变其工作方式。尽管仅使用更新作为GET/POST参数调用一个Web服务器页面是很容易的,但是那样的话,您将不得不运行一些服务器端代码。

最后,您可能希望使用另一种模仿长轮询的方式,而无需在您的AJAX请求中进行长轮询。最有效的方法是使用基于JSON的轮询通信技术,其基本原理是:
  • 将所有要发送的数据缓冲在带有时间戳的索引中(内存或外部);
  • 我将使用循环缓冲区,如果数据集可以变得很大,我将使用外部闪存;
  • 客户端发送请求时,
  • ,要求提供时间戳或最后一次更新的ID(或0);
  • ,如果有更新:
  • 将要发送回的事件/值作为JSON发送回
  • else
  • 返回一个空值或HTTP 304 not modified status

  • 对于时间戳记,请使用自arduino启动以来的日期,但请注意,如果运行超过50天,它将溢出。这应该没什么大不了的,但是仍然必须考虑到这一点。

    Here,您可以找到提供JSONP内容的网络服务器的实现。时间戳和数据缓冲区的处理仍然取决于您,这将最适合您的需求。

    关于ajax - Arduino WebServer和socket.io,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22183666/

    相关文章:

    php - Laravel 5.5 在点击时使用 ajax 调用删除项目

    android - SIP 数据未通过 Android TCP 套接字刷新

    python - python 中的多人服务器套接字

    c - 此 C 代码仅获取 HTTP header ,但不是 html 文件

    Arduino 以太网板与 LCD 显示器兼容吗?

    javascript - 从对象外部调用 javascript 函数

    jquery - 尝试从多选下拉列表中添加所选项目的值

    PROGMEM 中保存的数据类型以后可以在程序中更改吗?

    javascript - 更改 youtube 视频 iframe 播放器内容的问题

    c - 为 Pro Micro 编写 Windows 驱动程序