我们正在尝试使用官方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的轮询通信技术,其基本原理是:
0
); 对于时间戳记,请使用自arduino启动以来的日期,但请注意,如果运行超过50天,它将溢出。这应该没什么大不了的,但是仍然必须考虑到这一点。
Here,您可以找到提供JSONP内容的网络服务器的实现。时间戳和数据缓冲区的处理仍然取决于您,这将最适合您的需求。
关于ajax - Arduino WebServer和socket.io,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22183666/